diff --git a/bin/is b/bin/is index 2ef02e99299c49521a87544f977f9f7823af83f7..3a5beb97b81c832de4f1a2bf9352feb8f0559afe 100755 --- a/bin/is +++ b/bin/is @@ -98,17 +98,13 @@ def c_build(parser, args): def c_cat(parser, args): ''' - Display image's file(s) + Display image's file ''' # looks if arguments is a file or image name - if istools.isfile(args.image) and os.path.isfile(args.image): - pkg = PackageImage(istools.abspath(args.image)) - elif PackageImage.check_image_name(args.image): - # get image package - repoman = load_repositories(args) - pkg = repoman.get(args.image, args.image_version) - for filename in args.files: - pkg.cat(filename) + repoman = load_repositories(args) + img, repo = select_image(args.image, repoman) + for filename in args.file: + img.cat(filename) def c_clean(parser, args): ''' @@ -340,10 +336,8 @@ p_build.set_defaults(func=c_build) # cat command parser p_cat = subparsers.add_parser("cat", help=c_cat.__doc__.lower()) -p_cat.add_argument("-v", "--image-version", type=int, default=None, - help="image version") -p_cat.add_argument("image", help="image (path or name)") -p_cat.add_argument("files", nargs="+", help="files to cat") +p_cat.add_argument("image") +p_cat.add_argument("file", nargs="+", help="file to cat (glob allowed)") p_cat.set_defaults(func=c_cat) # clean command parser diff --git a/installsystems/image.py b/installsystems/image.py index 494a8e83ed817177eb6c112198e17a4110205dc2..621735bcf4fcd63ab3bc2e233b440e8bc3946613 100644 --- a/installsystems/image.py +++ b/installsystems/image.py @@ -17,7 +17,6 @@ import re import cStringIO import shutil import gzip -import fnmatch import installsystems.template as istemplate import installsystems.tools as istools from installsystems.printer import * @@ -458,12 +457,9 @@ class PackageImage(Image): ''' Display filename in the tarball ''' - for filename in fnmatch.filter(self._tarball.getnames(), filename): - fd = self._tarball.extractfile(filename) - if fd is not None: - arrow(filename) - out(fd.read()) - fd.close() + for filename in self._tarball.getnames(glob_pattern=filename): + arrow(filename) + out(self._tarball.get_str(filename)) def run_parser(self, **kwargs): ''' @@ -484,7 +480,7 @@ class PackageImage(Image): arrow("Run %s scripts" % directory) arrowlevel(1) # get list of parser scripts - l_scripts = self._tarball.getnames("%s/.*\.py" % directory) + l_scripts = self._tarball.getnames(re_pattern="%s/.*\.py" % directory) # order matter! l_scripts.sort() # run scripts diff --git a/installsystems/tarball.py b/installsystems/tarball.py index 9b41f0c0c94856abe68b4aa06f78bdf7e0fd8748..a9c524587ac9c7cbf8c904c56a4c154ea77dd3d4 100644 --- a/installsystems/tarball.py +++ b/installsystems/tarball.py @@ -11,6 +11,7 @@ import time import tarfile import StringIO import re +import fnmatch class Tarball(tarfile.TarFile): def add_str(self, name, content, ftype, mode): @@ -31,15 +32,19 @@ class Tarball(tarfile.TarFile): Return a string from a filename in a tarball ''' ti = self.getmember(name) - return self.extractfile(ti).read() + fd = self.extractfile(ti) + return fd.read() if fd is not None else "" - def getnames(self, reg_pattern=None): + def getnames(self, re_pattern=None, glob_pattern=None): lorig = super(Tarball, self).getnames() - if reg_pattern is None: - return lorig - else: + # regexp matching + if re_pattern is not None: return [ tpname for tpname in lorig if re.match(reg_pattern, tpname) ] + # globbing matching + if glob_pattern is not None: + return fnmatch.filter(lorig, glob_pattern) + return lorig def size(self): '''