#!/usr/bin/python # -*- coding: utf-8 -*- # # (C) 2006 Guido Guenther # 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 # """Import a new upstream version""" import sys import os import tempfile import re import glob import git_buildpackage from git_buildpackage.git_utils import (GitRepositoryError, GitRepository, sanitize_version) from git_buildpackage.config import GBPOptionParser def cleanupTmpTree(tree): """remove a tree of temporary files""" git_buildpackage.RemoveTree(tree)() def unpackOrig(tgz): """unpack a .orig.tar.gz""" try: unpackTGZ = git_buildpackage.UnpackTGZ(tgz, tempfile.mkdtemp(dir='../')) unpackTGZ() except git_buildpackage.CommandExecFailed: print "Unpacking of %s failed" % (tgz,) cleanupTmpTree(unpackTGZ.dir) return return unpackTGZ.dir def get_version(tgz): """get the version from the filename of a .orig.tar.gz""" origre = re.compile('^[a-z\d-]+_(?P[a-z\d\.\~\-]+)\.orig\.tar\.gz') m = origre.match(os.path.basename(tgz)) if m: return m.group('version') def main(argv): parser = GBPOptionParser(command=os.path.basename(argv[0]), prefix='', usage='%prog [-u version] /path/to/upstream-version.tar.gz') parser.add_option("-u", "--upstreamversion", dest="version", help="Upstream Version") parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help="verbose command execution") parser.add_option("--no-merge", dest='merge', action="store_false", default=True, help="after import dont do any merging to another branch") parser.add_config_file_option(option_name="debian-branch", dest='debian', help="branch the debian patch is being developed on, default is '%(debian-branch)s'") parser.add_config_file_option(option_name="upstream-branch", dest="upstream", help="upstream branch, default is '%(upstream-branch)s'") parser.add_config_file_option(option_name="sign-tags", dest="sign_tags", help="sign git tags", action="store_true") parser.add_config_file_option(option_name="keyid", dest="keyid", help="GPG keyid to sign tags with") (options, args) = parser.parse_args(argv[1:]) gitCheckoutUpstream = git_buildpackage.GitCheckoutBranch(options.upstream) gitCheckoutMaster = git_buildpackage.GitCheckoutBranch(options.debian) gitShowBranch = git_buildpackage.GitShowBranch() gitPullUpstream = git_buildpackage.GitPull('.', options.upstream) if options.verbose: git_buildpackage.Command.verbose = True if len(args) != 1: parser.print_help() return 1 else: tgz = args[0] try: repo=GitRepository('.') except GitRepositoryError: print >>sys.stderr,"%s is not a git repository" % (os.path.abspath('.')) return 1 if not repo.has_branch(options.upstream): print >>sys.stderr, """ Repository does not have branch '%s' for upstream sources. If there is none see /usr/share/doc/git-buildpackage/manual-html/gbp.import.convert.html on howto create it otherwise use --upstream-branch to specify it. """ % options.upstream return 1 if options.version: version = options.version else: version = get_version(tgz) if version: print "Upstream version is %s" % (version,) else: print >>sys.stderr,"Cannot determine upstream version from %s - use -u" % (tgz,) parser.print_help() return 1 (ret, out) = repo.is_clean() if not ret: print >>sys.stderr, "Repository has uncommitted changes, commit them first: " print >>sys.stderr, out return 1 tmpdir = unpackOrig(tgz) if not tmpdir: return 1 else: if options.verbose: print "Unpacked orig to %s" % tmpdir origdir=glob.glob(tmpdir+'/*')[0] try: print "Importing %s to upstream branch..." % tgz gitCheckoutUpstream() gitShowBranch() git_buildpackage.GitLoadDirs()(origdir) git_buildpackage.GitTag(options.sign_tags, options.keyid)(sanitize_version(version)) if options.merge: print "Merging to %s" % (options.debian,) gitCheckoutMaster() gitShowBranch() gitPullUpstream() git_buildpackage.Dch("%s-1" % (version,), 'New Upstream Version')() except git_buildpackage.CommandExecFailed: print >>sys.stderr, "Import of %s failed" % (tgz,) cleanupTmpTree(tmpdir) return 1 cleanupTmpTree(tmpdir) print "Merged version %s of %s into ." % (version, tgz) return 0 if __name__ == "__main__": sys.exit(main(sys.argv)) # vim:et:ts=4:sw=4: