From 21f5789fe2959cf97dc3a04481d55b93dcd45f18 Mon Sep 17 00:00:00 2001 From: Seblu <sebastien.luttringer@smartjog.com> Date: Thu, 25 Aug 2011 11:30:11 +0200 Subject: [PATCH] Add extract command --- bin/is | 18 ++++++++++++++++++ installsystems/image.py | 24 +++++++++++++++++++++++- installsystems/tools.py | 2 +- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/bin/is b/bin/is index 6f40c94..8be4e75 100755 --- a/bin/is +++ b/bin/is @@ -144,6 +144,14 @@ def c_del(parser, args): raise Exception("Abort") repo.delete(img.name, img.version) +def c_extract(parser, args): + ''' + Extract an image package inside a directory + ''' + repoman = load_repositories(args) + img, repo = select_image(args.image, repoman) + img.extract(args.directory, payload=args.payload, force=args.force) + def c_get(parser, args): ''' Get a remove image in current directory @@ -325,6 +333,16 @@ p_del.add_argument("-f", "--force", action="store_true", default=False, help="delete image without confirmation") p_del.set_defaults(func=c_del) +# extract command parser +p_extract = subparsers.add_parser("extract", help=c_extract.__doc__.lower()) +p_extract.add_argument("-p", action="store_true", dest="payload", default=False, + help="extract payload") +p_extract.add_argument("-f", "--force", action="store_true", default=False, + help="overwrite existing directories") +p_extract.add_argument("image", help="image to extract") +p_extract.add_argument("directory", help="directory where image will be extracted") +p_extract.set_defaults(func=c_extract) + # get command parser p_get = subparsers.add_parser("get", help=c_get.__doc__.lower()) p_get.set_defaults(func=c_get) diff --git a/installsystems/image.py b/installsystems/image.py index 621735b..9fae13b 100644 --- a/installsystems/image.py +++ b/installsystems/image.py @@ -461,6 +461,25 @@ class PackageImage(Image): arrow(filename) out(self._tarball.get_str(filename)) + def extract(self, directory, force=False, payload=False): + ''' + Extract content of the image inside a repository + ''' + # check destination + if not os.path.isdir(directory): + istools.mkdir(directory) + if not force and len(os.listdir(directory)) != 0: + raise Exception("%s is not empty" % directory) + # extract content + arrow("Extracting image in %s" % directory) + self._tarball.extractall(directory) + # launch payload extract + if payload: + for payname in self.payload: + dest = os.path.join(directory, "payload", payname) + arrow("Extracting payload %s in %s" % (payname, dest)) + self.payload[payname].extract(dest, force=force) + def run_parser(self, **kwargs): ''' Run parser scripts @@ -658,7 +677,7 @@ class Payload(object): if not force and len(os.listdir(dest)) > 0: raise Exception("Directory %s is not empty (need force)" % dest) else: - os.mkdir(dest) + istools.mkdir(dest) # try to open payload file try: fo = istools.uopen(self.path) @@ -688,6 +707,9 @@ class Payload(object): # if dest is a directory try to create file inside if os.path.isdir(dest): dest = os.path.join(dest, self.name) + # try to create leading directories + elif not os.path.exists(os.path.dirname(dest)): + istools.mkdir(os.path.dirname(dest)) # check validity of dest if os.path.exists(dest): if os.path.isdir(dest): diff --git a/installsystems/tools.py b/installsystems/tools.py index e061d08..1630dab 100644 --- a/installsystems/tools.py +++ b/installsystems/tools.py @@ -81,7 +81,7 @@ def mkdir(path, uid=None, gid=None, mode=None): ''' Create a directory and set rights ''' - os.mkdir(path) + os.makedirs(path) chrights(path, uid, gid, mode) def chrights(path, uid=None, gid=None, mode=None, mtime=None): -- GitLab