From: Michael Tremer Date: Mon, 3 Dec 2012 21:43:43 +0000 (+0100) Subject: packages: Add function to read files from the package payload. X-Git-Tag: 0.9.24~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5b2a7a44e6d7d8ce62954b2e6741315919949181;p=pakfire.git packages: Add function to read files from the package payload. --- diff --git a/python/pakfire/packages/file.py b/python/pakfire/packages/file.py index 03a9ae520..8d53d183a 100644 --- a/python/pakfire/packages/file.py +++ b/python/pakfire/packages/file.py @@ -200,17 +200,11 @@ class FilePackage(Package): def open_archive(self, mode="r"): return tarfile.open(self.filename, mode=mode, format=tarfile.PAX_FORMAT) - def extract(self, message=None, prefix=None): - log.debug("Extracting package %s" % self.friendly_name) - - if prefix is None: - prefix = "" - - # Open package data for read. - archive = self.open_archive() + def open_payload_archive(self): + a = self.open_archive() - # Get the package payload. - payload = archive.extractfile("data.img") + # Find the payload data. + payload = a.extractfile("data.img") # Decompress the payload if needed. if self.payload_compression == "xz": @@ -220,8 +214,18 @@ class FilePackage(Package): payload_archive = InnerTarFile.open(fileobj=payload) else: - raise Exception, "Unhandled payload compression type: %s" \ - % payload_compression + raise Exception, "Unhandled payload compression type: %s" % payload_compression + + return payload_archive + + def extract(self, message=None, prefix=None): + log.debug("Extracting package %s" % self.friendly_name) + + if prefix is None: + prefix = "" + + # Open package data for read. + payload_archive = self.open_payload_archive() # Load progressbar. pb = None @@ -358,6 +362,21 @@ class FilePackage(Package): for msg in messages: log.warning(msg) + def open_file(self, filename): + payload_archive = self.open_payload_archive() + + # Search for filename. + while True: + member = payload_archive.next() + if not member: + break + + # Skip non-matching files. + if not filename in (member.name, "/%s" % member.name): + continue + + return payload_archive.extractfile(member) + @property def metadata(self): """