--- /dev/null
+
+from collections import namedtuple
+from subprocess import Popen, PIPE
+
+from support import CatalystError, warn
+
+
+# use ContentsMap.fields for the value legend
+# Key:[function, cmd]
+CONTENTS_DEFINITIONS = {
+ # 'find' is disabled because it requires the source path, which is not
+ # always available
+ #"find" :["calc_contents","find %(path)s"],
+ "tar_tv":["calc_contents","tar tvf %(file)s"],
+ "tar_tvz":["calc_contents","tar tvzf %(file)s"],
+ "tar_tvj":["calc_contents","tar -I lbzip2 -tvf %(file)s"],
+ "isoinfo_l":["calc_contents","isoinfo -l -i %(file)s"],
+ # isoinfo_f should be a last resort only
+ "isoinfo_f":["calc_contents","isoinfo -f -i %(file)s"],
+}
+
+
+class ContentsMap(object):
+ '''Class to encompass all known commands to list
+ the contents of an archive'''
+
+
+ fields = ['func', 'cmd']
+
+
+ def __init__(self, defs=None):
+ '''Class init
+
+ @param defs: dictionary of Key:[function, cmd]
+ '''
+ if defs is None:
+ defs = {}
+ #self.contents = {}
+ self.contents_map = {}
+
+ # create the archive type namedtuple classes
+ for name in list(defs):
+ #obj = self.contents[name] = namedtuple(name, self.fields)
+ obj = namedtuple(name, self.fields)
+ obj.__slots__ = ()
+ self.contents_map[name] = obj._make(defs[name])
+ del obj
+
+
+ def generate_contents(self, file_, getter="auto", verbose=False):
+ try:
+ archive = getter
+ if archive == 'auto' and file_.endswith('.iso'):
+ archive = 'isoinfo_l'
+ if (archive in ['tar_tv','auto']):
+ if file_.endswith('.tgz') or file_.endswith('.tar.gz'):
+ archive = 'tar_tvz'
+ elif file_.endswith('.tbz2') or file_.endswith('.tar.bz2'):
+ archive = 'tar_tvj'
+ elif file_.endswith('.tar'):
+ archive = 'tar_tv'
+
+ if archive == 'auto':
+ warn('File %r has unknown type for automatic detection.'
+ % (file_, ))
+ return None
+ else:
+ getter = archive
+ func = getattr(self, '_%s_' % self.contents_map[getter].func)
+ return func(file_, self.contents_map[getter].cmd, verbose)
+ except:
+ raise CatalystError,\
+ "Error generating contents, is appropriate utility " +\
+ "(%s) installed on your system?" \
+ % (self.contents_map[getter].cmd)
+
+
+ @staticmethod
+ def _calc_contents_(file_, cmd, verbose):
+ _cmd = (cmd % {'file': file_ }).split()
+ proc = Popen(_cmd, stdout=PIPE, stderr=PIPE)
+ results = proc.communicate()
+ result = "\n".join(results)
+ if verbose:
+ print result
+ return result
+
valid_build_targets, CatalystError, find_binary, LockInUse)
from hash_utils import HashMap, HASH_DEFINITIONS
+from contents import ContentsMap, CONTENTS_DEFINITIONS
if "digests" in myconf:
conf_values["digests"]=myconf["digests"]
if "contents" in myconf:
- conf_values["contents"]=myconf["contents"]
+ # replace '-' with '_' (for compatibility with existing configs)
+ conf_values["contents"] = myconf["contents"].replace("-", '_')
if "envscript" in myconf:
print "Envscript support enabled."
# import configuration file and import our main module using those settings
parse_config(myconfig)
+ # initialize our contents generator
+ contents_map = ContentsMap(CONTENTS_DEFINITIONS)
+ conf_values["contents_map"] = contents_map
+
# initialze our hash and contents generators
hash_map = HashMap(HASH_DEFINITIONS)
conf_values["hash_map"] = hash_map
return r
# hexify()
-def generate_contents(file,contents_function="auto",verbose=False):
- try:
- _ = contents_function
- if _ == 'auto' and file.endswith('.iso'):
- _ = 'isoinfo-l'
- if (_ in ['tar-tv','auto']):
- if file.endswith('.tgz') or file.endswith('.tar.gz'):
- _ = 'tar-tvz'
- elif file.endswith('.tbz2') or file.endswith('.tar.bz2'):
- _ = 'tar-tvj'
- elif file.endswith('.tar'):
- _ = 'tar-tv'
-
- if _ == 'auto':
- warn('File %r has unknown type for automatic detection.' % (file, ))
- return None
- else:
- contents_function = _
- _ = contents_map[contents_function]
- return _[0](file,_[1],verbose)
- except:
- raise CatalystError,\
- "Error generating contents, is appropriate utility (%s) installed on your system?" \
- % (contents_function, )
-
-def calc_contents(file,cmd,verbose):
- args={ 'file': file }
- cmd=cmd % dict(args)
- a=os.popen(cmd)
- mylines=a.readlines()
- a.close()
- result="".join(mylines)
- if verbose:
- print result
- return result
-
-# This has map must be defined after the function calc_content
-# It is possible to call different functions from this but they must be defined
-# before hash_map
-# Key,function,cmd
-contents_map={
- # 'find' is disabled because it requires the source path, which is not
- # always available
- #"find" :[calc_contents,"find %(path)s"],
- "tar-tv":[calc_contents,"tar tvf %(file)s"],
- "tar-tvz":[calc_contents,"tar tvzf %(file)s"],
- "tar-tvj":[calc_contents,"tar -I lbzip2 -tvf %(file)s"],
- "isoinfo-l":[calc_contents,"isoinfo -l -i %(file)s"],
- # isoinfo-f should be a last resort only
- "isoinfo-f":[calc_contents,"isoinfo -f -i %(file)s"],
-}
-
def read_from_clst(file):
line = ''
if os.path.exists(file+".CONTENTS"):
os.remove(file+".CONTENTS")
if "contents" in self.settings:
+ contents_map = self.settings["contents_map"]
if os.path.exists(file):
myf=open(file+".CONTENTS","w")
keys={}
array=keys.keys()
array.sort()
for j in array:
- contents=generate_contents(file,contents_function=j,\
+ contents = contents_map.generate_contents(file, j,
verbose="VERBOSE" in self.settings)
if contents:
myf.write(contents)