2008/9/9 Stefano Zacchiroli <[EMAIL PROTECTED]>

> Unfortunately not, thus far I haven't been able to try out the solution
> (4) mentioned in the bug log to, which looks like the most likely to be
> successful.
>
> If you want to help, feel free to try it out and provide a patch. If you
> can't do that, even only verifying whether all the methods of the
> file-like interface we use are supported by tarfile would help.
>

Done and attached :-) The biggest problem is that Tarfile's __init__ method
doesn't actually allow for "r:bz2" opening (who knows why... and it's not
recommended in general for use by the Python 2.5.1 docs I have locally), but
if you call Tarfile.open() instead, then that does and it returns a new
Tarfile object. Right now I'm just fixing the tgz() method so it does the
right thing when it has a .bz2 instead, but you may wish to rename this
method as well....

Tom Parker
diff --git a/debian_bundle/debfile.py b/debian_bundle/debfile.py
index df0742e..5b5ff4f 100644
--- a/debian_bundle/debfile.py
+++ b/debian_bundle/debfile.py
@@ -24,8 +24,9 @@ from arfile import ArFile, ArError
 from changelog import Changelog
 from deb822 import Deb822
 
-DATA_PART = 'data.tar.gz'
-CTRL_PART = 'control.tar.gz'
+DATA_PART = 'data.tar'
+CTRL_PART = 'control.tar'
+ALLOWED_ENDINGS = [".gz", ".bz2"]
 INFO_PART = 'debian-binary'
 MAINT_SCRIPTS = ['preinst', 'postinst', 'prerm', 'postrm', 'config']
 
@@ -64,8 +65,15 @@ class DebPart(object):
         package."""
 
         if self.__tgz is None:
-            gz = gzip.GzipFile(fileobj=self.__member, mode='r')
-            self.__tgz = tarfile.TarFile(fileobj=gz, mode='r')
+            if self.__member.name == "data.tar.gz":
+                gz = gzip.GzipFile(fileobj=self.__member, mode='r')
+                self.__tgz = tarfile.TarFile(fileobj=gz, mode='r')
+            elif self.__member.name == "data.tar.bz2":
+                # Tarfile's __init__ doesn't allow for r:bz2 modes, but the open() classmethod does...
+                self.__tgz = tarfile.open(fileobj=self.__member, mode='r:bz2')
+            else:
+                raise DebError("Unable to handle %s"%self.__member.name)
+
         return self.__tgz
 
     @staticmethod
@@ -192,16 +200,20 @@ class DebFile(ArFile):
 
     def __init__(self, filename=None, mode='r', fileobj=None):
         ArFile.__init__(self, filename, mode, fileobj)
-        required_names = set([INFO_PART, CTRL_PART, DATA_PART])
         actual_names = set(self.getnames())
-        if not (required_names <= actual_names):
-            raise DebError(
-                    "the following required .deb members are missing: " \
-                            + string.join(required_names - actual_names))
-
+        if INFO_PART not in actual_names:
+            raise DebError("%s is missing from the .deb "%INFO_PART)
         self.__parts = {}
-        self.__parts[CTRL_PART] = DebControl(self.getmember(CTRL_PART))
-        self.__parts[DATA_PART] = DebData(self.getmember(DATA_PART))
+        for name in (CTRL_PART,DATA_PART):
+            for possible in actual_names:
+                if possible.find(name)==0 and possible[len(name):] in ALLOWED_ENDINGS:
+                    self.__parts[name] = possible # temporary storage of correct name
+                    break
+            else:
+                raise DebError("A %s* file is missing from the .deb "%name)
+
+        self.__parts[CTRL_PART] = DebControl(self.getmember(self.__parts[CTRL_PART]))
+        self.__parts[DATA_PART] = DebData(self.getmember(self.__parts[DATA_PART]))
         self.__pkgname = None   # updated lazily by __updatePkgName
 
         f = self.getmember(INFO_PART)

Reply via email to