Add known_compressions() to UpstreamSource
authorGuido Günther <agx@sigxcpu.org>
Sat, 30 Jul 2011 16:16:39 +0000 (18:16 +0200)
committerGuido Günther <agx@sigxcpu.org>
Tue, 9 Aug 2011 08:22:58 +0000 (10:22 +0200)
so we can use it for the DscFile parsing. This fixes the import of xz
compressed upstream tarballs.

gbp/deb.py

index a45f18c..3c1de78 100644 (file)
@@ -96,89 +96,6 @@ class DpkgCompareVersions(gbpc.Command):
         return 0
 
 
-class DscFile(object):
-    """Keeps all needed data read from a dscfile"""
-    compressions = r"(gz|bz2)"
-    pkg_re = re.compile(r'Source:\s+(?P<pkg>.+)\s*')
-    version_re = re.compile(r'Version:\s((?P<epoch>\d+)\:)?(?P<version>[%s]+)\s*$' % debian_version_chars)
-    tar_re = re.compile(r'^\s\w+\s\d+\s+(?P<tar>[^_]+_[^_]+(\.orig)?\.tar\.%s)' % compressions)
-    diff_re = re.compile(r'^\s\w+\s\d+\s+(?P<diff>[^_]+_[^_]+\.diff.(gz|bz2))')
-    deb_tgz_re = re.compile(r'^\s\w+\s\d+\s+(?P<deb_tgz>[^_]+_[^_]+\.debian.tar.%s)' % compressions)
-    format_re = re.compile(r'Format:\s+(?P<format>[0-9.]+)\s*')
-
-    def __init__(self, dscfile):
-        self.pkg = ""
-        self.tgz = ""
-        self.diff = ""
-        self.deb_tgz = ""
-        self.pkgformat = "1.0"
-        self.debian_version = ""
-        self.upstream_version = ""
-        self.native = False
-        self.dscfile = os.path.abspath(dscfile)
-
-        f = file(self.dscfile)
-        fromdir = os.path.dirname(os.path.abspath(dscfile))
-        for line in f:
-            m = self.version_re.match(line)
-            if m and not self.upstream_version:
-                if '-' in m.group('version'):
-                    self.debian_version = m.group('version').split("-")[-1]
-                    self.upstream_version = "-".join(m.group('version').split("-")[0:-1])
-                    self.native = False
-                else:
-                    self.native = True # Debian native package
-                    self.upstream_version = m.group('version')
-                if m.group('epoch'):
-                    self.epoch = m.group('epoch')
-                else:
-                    self.epoch = ""
-                continue
-            m = self.pkg_re.match(line)
-            if m:
-                self.pkg = m.group('pkg')
-                continue
-            m = self.deb_tgz_re.match(line)
-            if m:
-                self.deb_tgz = os.path.join(fromdir, m.group('deb_tgz'))
-                continue
-            m = self.tar_re.match(line)
-            if m:
-                self.tgz = os.path.join(fromdir, m.group('tar'))
-                continue
-            m = self.diff_re.match(line)
-            if m:
-                self.diff = os.path.join(fromdir, m.group('diff'))
-                continue
-            m = self.format_re.match(line)
-            if m:
-                self.pkgformat = m.group('format')
-                continue
-        f.close()
-
-        if not self.pkg:
-            raise GbpError, "Cannot parse package name from '%s'" % self.dscfile
-        elif not self.tgz:
-            raise GbpError, "Cannot parse archive name from '%s'" % self.dscfile
-        if not self.upstream_version:
-            raise GbpError, "Cannot parse version number from '%s'" % self.dscfile
-        if not self.native and not self.debian_version:
-            raise GbpError, "Cannot parse Debian version number from '%s'" % self.dscfile
-
-    def _get_version(self):
-        version = [ "", self.epoch + ":" ][len(self.epoch) > 0]
-        if self.native:
-            version += self.upstream_version
-        else:
-            version += "%s-%s" % (self.upstream_version, self.debian_version)
-        return version
-
-    version = property(_get_version)
-
-    def __str__(self):
-        return "<%s object %s>" % (self.__class__.__name__, self.dscfile)
-
-
 class UpstreamSource(object):
     """
     Upstream source. Can be either an unpacked dir, a tarball or another type
@@ -315,6 +232,93 @@ class UpstreamSource(object):
             raise GbpError
         return UpstreamSource(newarchive)
 
+    @staticmethod
+    def known_compressions():
+        return [ args[1][-1] for args in compressor_opts.items() ]
+
+
+class DscFile(object):
+    """Keeps all needed data read from a dscfile"""
+    compressions = r"(%s)" % '|'.join(UpstreamSource.known_compressions())
+    pkg_re = re.compile(r'Source:\s+(?P<pkg>.+)\s*')
+    version_re = re.compile(r'Version:\s((?P<epoch>\d+)\:)?(?P<version>[%s]+)\s*$' % debian_version_chars)
+    tar_re = re.compile(r'^\s\w+\s\d+\s+(?P<tar>[^_]+_[^_]+(\.orig)?\.tar\.%s)' % compressions)
+    diff_re = re.compile(r'^\s\w+\s\d+\s+(?P<diff>[^_]+_[^_]+\.diff.(gz|bz2))')
+    deb_tgz_re = re.compile(r'^\s\w+\s\d+\s+(?P<deb_tgz>[^_]+_[^_]+\.debian.tar.%s)' % compressions)
+    format_re = re.compile(r'Format:\s+(?P<format>[0-9.]+)\s*')
+
+    def __init__(self, dscfile):
+        self.pkg = ""
+        self.tgz = ""
+        self.diff = ""
+        self.deb_tgz = ""
+        self.pkgformat = "1.0"
+        self.debian_version = ""
+        self.upstream_version = ""
+        self.native = False
+        self.dscfile = os.path.abspath(dscfile)
+
+        f = file(self.dscfile)
+        fromdir = os.path.dirname(os.path.abspath(dscfile))
+        for line in f:
+            m = self.version_re.match(line)
+            if m and not self.upstream_version:
+                if '-' in m.group('version'):
+                    self.debian_version = m.group('version').split("-")[-1]
+                    self.upstream_version = "-".join(m.group('version').split("-")[0:-1])
+                    self.native = False
+                else:
+                    self.native = True # Debian native package
+                    self.upstream_version = m.group('version')
+                if m.group('epoch'):
+                    self.epoch = m.group('epoch')
+                else:
+                    self.epoch = ""
+                continue
+            m = self.pkg_re.match(line)
+            if m:
+                self.pkg = m.group('pkg')
+                continue
+            m = self.deb_tgz_re.match(line)
+            if m:
+                self.deb_tgz = os.path.join(fromdir, m.group('deb_tgz'))
+                continue
+            m = self.tar_re.match(line)
+            if m:
+                self.tgz = os.path.join(fromdir, m.group('tar'))
+                continue
+            m = self.diff_re.match(line)
+            if m:
+                self.diff = os.path.join(fromdir, m.group('diff'))
+                continue
+            m = self.format_re.match(line)
+            if m:
+                self.pkgformat = m.group('format')
+                continue
+        f.close()
+
+        if not self.pkg:
+            raise GbpError, "Cannot parse package name from '%s'" % self.dscfile
+        elif not self.tgz:
+            raise GbpError, "Cannot parse archive name from '%s'" % self.dscfile
+        if not self.upstream_version:
+            raise GbpError, "Cannot parse version number from '%s'" % self.dscfile
+        if not self.native and not self.debian_version:
+            raise GbpError, "Cannot parse Debian version number from '%s'" % self.dscfile
+
+    def _get_version(self):
+        version = [ "", self.epoch + ":" ][len(self.epoch) > 0]
+        if self.native:
+            version += self.upstream_version
+        else:
+            version += "%s-%s" % (self.upstream_version, self.debian_version)
+        return version
+
+    version = property(_get_version)
+
+    def __str__(self):
+        return "<%s object %s>" % (self.__class__.__name__, self.dscfile)
+
 
 def parse_dsc(dscfile):
     """parse dsc by creating a DscFile object"""