#!/usr/bin/env python import os.path, re, sys, textwrap sys.path.append('debian/lib/python') from debian_linux.config import ConfigCoreHierarchy from debian_linux.debian import Changelog class Version(object): _rules = ur"^(\d+\.\d+\.\d+)\.(\d+)$" _re = re.compile(_rules) def __init__(self, version): self.complete = version match = self._re.match(version) if match is None: raise RuntimeError self.release = match.group(1) self.patch = int(match.group(2)) class GenPatch(object): def __init__(self, path, repo, version): self.config = ConfigCoreHierarchy(['debian/config']) self.package_version = Changelog()[0].version self.path = path self.repo = repo self.version = version def __call__(self): base = self.version.complete patch = base + '.patch' log = base + '.log' series = base + '.series' if self.version.patch == 1: tag_in = "v%s" % self.version.release else: tag_in = "v%s.%d" % (self.version.release, self.version.patch - 1) tag_out = "v%s" % self.version.complete print tag_in, tag_out backports = self.config[('backports',)] diff_filter = '-x Makefile' if self.version.release == self.package_version.upstream: diff_filter += ' ' + ' '.join("-x '%s'" % re.sub(r'/$', r'/*', path) for path in backports) git_paths = '' else: git_paths = ' '.join("'%s'" % path for path in backports if backports[path] == self.version.release) f = os.popen("cd %s; git diff %s %s -- %s | filterdiff -p 1 %s > %s" % (self.repo, tag_in, tag_out, git_paths, diff_filter, os.path.join(self.path, patch))) if f.close() is not None: raise RuntimeError f = os.popen("cd %s; git log --oneline --reverse %s..%s^ -- %s" % (self.repo, tag_in, tag_out, git_paths)) out = file(os.path.join(self.path, log), 'w') out.write(" * Add stable release %s:\n" % self.version.complete) for line in f: line = line.strip() if not line: continue hash, log = line.split(' ', 1) log = textwrap.wrap(log, 74) log = '\n '.join(log) out.write(" - %s\n" % log) if f.close() is not None: raise RuntimeError out = file(os.path.join(self.path, series), 'w') out.write("+ bugfix/all/stable/%s\n" % patch) out.close() if __name__ == '__main__': path = os.path.realpath(os.path.dirname(sys.argv[0])) repo = sys.argv[1] for i in sys.argv[2:]: GenPatch(path, repo, Version(i))()