summaryrefslogtreecommitdiff
path: root/gbp/deb/dscfile.py
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2013-03-29 15:35:55 +0100
committerGuido Günther <agx@sigxcpu.org>2013-03-29 15:36:38 +0100
commit733573511a77bd2fdbbff61b9bd62b40ad63eac2 (patch)
tree42efdb5ad2a6d96335425b00d1ca99c30a974cc1 /gbp/deb/dscfile.py
parent62d3b9989919664fa81a317d8af320671a94803f (diff)
Move DscFile to separate module
Diffstat (limited to 'gbp/deb/dscfile.py')
-rw-r--r--gbp/deb/dscfile.py113
1 files changed, 113 insertions, 0 deletions
diff --git a/gbp/deb/dscfile.py b/gbp/deb/dscfile.py
new file mode 100644
index 0000000..6f450e2
--- /dev/null
+++ b/gbp/deb/dscfile.py
@@ -0,0 +1,113 @@
+# vim: set fileencoding=utf-8 :
+#
+# (C) 2006,2007,2011,2013 Guido Günther <agx@sigxcpu.org>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+"""provides some debian source package related helpers"""
+
+import os
+import re
+
+from gbp.errors import GbpError
+from gbp.pkg import UpstreamSource
+from gbp.deb.policy import DebianPkgPolicy
+
+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*$'
+ % DebianPkgPolicy.debianversion_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)
+
+# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: