]> git.ipfire.org Git - pakfire.git/commitdiff
packages: Add function to read files from the package payload.
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 3 Dec 2012 21:43:43 +0000 (22:43 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 3 Dec 2012 21:43:43 +0000 (22:43 +0100)
python/pakfire/packages/file.py

index 03a9ae52057077b7b7023a3034e2210ff24f0cca..8d53d183ad385478cd24a09605c1226f3cc7b025 100644 (file)
@@ -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):
                """