]> git.ipfire.org Git - pakfire.git/commitdiff
Don't keep the tarfiles open.
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 7 Mar 2011 13:07:15 +0000 (14:07 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 7 Mar 2011 13:07:15 +0000 (14:07 +0100)
We only open an archive on demand and close it afterwards.

pakfire/packages/file.py
pakfire/packages/packager.py

index bf58f71d1e9501cb33a0b7b4b2acdb085faf13f2..9b50aae15f2b02d63002284cec60a9d6a5b2526b 100644 (file)
@@ -19,8 +19,7 @@ class FilePackage(Package):
                Package.__init__(self, pakfire, repo)
                self.filename = filename
 
-               # Place to keep the tarfile handle and cache the metadata
-               self._archive = None
+               # Place to cache the metadata
                self._metadata = {}
 
                self.check()
@@ -36,30 +35,13 @@ class FilePackage(Package):
        def __repr__(self):
                return "<%s %s>" % (self.__class__.__name__, self.filename)
 
-       def __del__(self):
-               # Close tarfile handle
-               if self._archive:
-                       self._archive.close()
-
        @property
        def local(self):
                # A file package is always local.
                return True
 
-       @property
-       def archive(self):
-               if not self._archive:
-                       self._archive = tarfile.open(self.filename)
-
-               return self._archive
-
-       def get_file(self, name):
-               """
-                       Return a file-object for the given filename.
-
-                       If the file does not exist KeyError is raised.
-               """
-               return self.archive.extractfile(name)
+       def open_archive(self):
+               return tarfile.open(self.filename)
 
        @property
        def file_version(self):
@@ -74,7 +56,8 @@ class FilePackage(Package):
                        Read-in the metadata from the "info" file and cache it in _metadata.
                """
                if not self._metadata:
-                       f = self.get_file("info")
+                       a = self.open_archive()
+                       f = a.extractfile("info")
 
                        for line in f.readlines():
                                m = re.match(r"^(\w+)=(.*)$", line)
@@ -85,6 +68,7 @@ class FilePackage(Package):
                                self._metadata[key] = val.strip("\"")
 
                        f.close()
+                       a.close()
 
                return self._metadata
 
@@ -96,7 +80,8 @@ class FilePackage(Package):
                return os.path.getsize(self.filename)
 
        def __filelist_from_metadata(self):
-               f = self.get_file("filelist")
+               a = self.open_archive()
+               f = a.extractfile("filelist")
 
                ret = []
                for line in f.readlines():
@@ -107,6 +92,7 @@ class FilePackage(Package):
                        ret.append(line)
 
                f.close()
+               a.close()
 
                return ret
 
@@ -114,11 +100,15 @@ class FilePackage(Package):
                # XXX expect uncompressed payload for now
                # this is very simple and very slow
 
-               t = tarfile.open(fileobj=self.get_file("data.img"))
+               a = self.open_archive()
+               f = a.extractfile("data.img")
+               t = tarfile.open(fileobj=f)
 
                ret = ["/%s" % n for n in t.getnames()]
 
                t.close()
+               f.close()
+               a.close()
 
                return ret
 
@@ -167,9 +157,13 @@ class FilePackage(Package):
                """
                ret = None
                try:
-                       f = self.get_file("signature")
+                       a = self.open_archive()
+                       f = a.extractfile("signature")
+
                        ret = f.read()
+
                        f.close()
+                       a.close()
 
                except KeyError:
                        # signature file could not be found
@@ -192,9 +186,13 @@ class FilePackage(Package):
                """
                ret = None
                try:
-                       f = self.get_file("control")
+                       a = self.open_archive()
+                       f = a.extractfile("control")
+
                        ret = f.read()
+
                        f.close()
+                       a.close()
 
                except KeyError:
                        # scriptlet file could not be found
index 153a5b627f14afad22e0d3b0ba6ce8ab05b32f71..db7ef5a7507a5d8b8c3e49f08b6989b37c8528fa 100644 (file)
@@ -23,7 +23,8 @@ class Extractor(object):
                self.pakfire = pakfire
                self.pkg = pkg
 
-               self.data = pkg.get_file("data.img")
+               self.archive = pkg.open_archive()
+               self.data = self.archive.extractfile("data.img")
 
                self.archive = None
                self._tempfile = None
@@ -33,6 +34,10 @@ class Extractor(object):
                else:
                        self.archive = tarfile.open(fileobj=self.data)
 
+       def __del__(self):
+               self.data.close()
+               self.archive.close()
+
        def cleanup(self):
                # XXX not called by anything
                if self._tempfile: