#!/usr/bin/python # -*- coding: utf-8 -*- # ################################################################## # # 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; version 2. # # 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. # # See file /usr/share/common-licenses/GPL-2 for more details. # # ################################################################## import logging import optparse import os import shutil import subprocess import sys import tempfile from debian.changelog import Changelog devnull = open('/dev/null', 'r+') def error(msg, *args, **kwargs): logging.error(msg, *args, **kwargs) sys.exit(1) def parse(args): usage = 'Usage: %prog ' p = optparse.OptionParser(usage) opts, args = p.parse_args(args) if len(args) != 4: p.error('Invalid arguments') return opts, args def main(args): logging.basicConfig(level=logging.INFO) os.environ['DEB_VENDOR'] = 'Ubuntu' _, (package, source_release, dest_release, upload) = parse(args[1:]) tmpdir = tempfile.mkdtemp(prefix='backportpackage-') try: for pocket in ('-updates', '-security', ''): if 0 == subprocess.call(['pull-lp-source', package, source_release + pocket], cwd=tmpdir, stdout=devnull, stderr=devnull): logging.info('Found package %s in pocket %s' % (package, source_release + pocket)) break else: error('Unable to find package %s in release %s' % (package, source_release)) for srcdir in os.listdir(tmpdir): srcdir = os.path.join(tmpdir, srcdir) if os.path.isdir(srcdir): break else: error('Something went wrong unpacking package %s' % package) cl = Changelog(open(os.path.join(srcdir, 'debian/changelog'))) v = cl.get_version() bp_version = str(v) + ('~%s1' % dest_release) bp_dist = dest_release if upload.startswith('ppa:'): bp_version += '~ppa1' elif upload == 'ubuntu': bp_dist += '-backports' if 0 != subprocess.call(['dch', '--force-bad-version', '--preserve', '--newversion', bp_version, '--distribution', dest_release, 'No-change backport to %s' % dest_release], cwd=srcdir): error('Something went wrong updating the package changelog') if 0 != subprocess.call(['debuild', '-S', '-sa'], cwd=srcdir): error('Something went wrong while building the source package') if ':' in bp_version: bp_version = bp_version[bp_version.find(':')+1:] print 'Please check the package in file://%s carefully' % tmpdir while True: answer = raw_input('Do you still want to upload this to %s? [Y/n] ' % upload).strip().lower() if answer in ('', 'y', 'yes'): break elif answer in ('n', 'no'): return 2 if 0 != subprocess.call(['dput', upload, '%s_%s_source.changes' % (package, bp_version)], cwd=tmpdir): error('Something went wrong uploading the package %s to %s' % package, upload) finally: shutil.rmtree(tmpdir) if __name__ == '__main__': sys.exit(main(sys.argv))