diff options
author | Guido Günther <agx@sigxcpu.org> | 2011-07-30 18:16:39 +0200 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2011-08-09 10:22:58 +0200 |
commit | f2efdaff1e5c08b7a56a694f960db2eada3c63ec (patch) | |
tree | 4624a49ce9dff7fc3b9a1d273a1b8198b611100e /gbp | |
parent | 37f16ccbceabb28551da01c4f2eaa010e72f2b9f (diff) |
Add known_compressions() to UpstreamSource
so we can use it for the DscFile parsing. This fixes the import of xz
compressed upstream tarballs.
Diffstat (limited to 'gbp')
-rw-r--r-- | gbp/deb.py | 170 |
1 files changed, 87 insertions, 83 deletions
@@ -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""" |