From 0a64daeff9162e6c160f405b04cad7d7cb95e427 Mon Sep 17 00:00:00 2001 From: Guido Guenther Date: Mon, 25 Sep 2006 12:38:30 +0200 Subject: add git-import-orig --- git-import-orig | 195 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100755 git-import-orig (limited to 'git-import-orig') diff --git a/git-import-orig b/git-import-orig new file mode 100755 index 00000000..273a2de3 --- /dev/null +++ b/git-import-orig @@ -0,0 +1,195 @@ +#!/usr/bin/python +# +# (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 subprocess +import tempfile +import re +import glob +from optparse import OptionParser + +class CommandExecFailed: + pass + +class Command(object): + def __init__(self, cmd, args=[]): + self.cmd=cmd + self.args=args + + def run(self): + try: + retcode = subprocess.call([self.cmd]+self.args) + if retcode < 0: + print >>sys.stderr, "%s was terminated by signal %d" % (self.cmd, -retcode) + elif retcode > 0: + print >>sys.stderr, "%s returned %d" % (self.cmd, retcode) + except OSError, e: + print >>sys.stderr, "Execution failed:", e + retcode=1 + return retcode + + def __call__(self): + if self.run(): + raise CommandExecFailed + + +class UnpackTGZ(Command): + def __init__(self, tgz, dir): + self.tgz=tgz + self.dir=dir + Command.__init__(self, 'tar', [ '-C', dir, '-zxf', tgz ]) + self.run_error="Couldn't unpack", self.tgz + +class RemoveTree(Command): + "Remove a whole directory tree" + def __init__(self, tree): + self.tree=tree + Command.__init__(self, 'rm', [ '-rf', tree ]) + self.run_error="Couldn't remove ", self.tree + +class Dch(Command): + def __init__(self, version, msg): + args=['-v', version] + if msg: + args.append(msg) + Command.__init__(self, 'dch', args) + self.run_error="Dch failed." + +class GitLoadDirs(Command): + def __init__(self, upstream_dir): + self.upstream_dir=upstream_dir + Command.__init__(self, 'git_load_dirs', [ self.upstream_dir ]) + self.run_error="Couldn't import %s", self.upstream_dir + +class GitCommand(Command): + "Mother/Father of all git commands" + def __init__(self, cmd, args=[]): + Command.__init__(self, 'git-'+cmd, args) + +class GitShowBranch(GitCommand): + def __init__(self): + GitCommand.__init__(self,'branch') + self.run_error="Couldn't list branches" + +class GitCheckoutBranch(GitCommand): + def __init__(self, branch): + GitCommand.__init__(self,'checkout', [branch]) + self.branch=branch + self.run_error="Couldn't switch to %s branch" % self.branch + +class GitPull(GitCommand): + def __init__(self, repo, branch): + GitCommand.__init__(self,'pull', [repo, branch]) + self.run_error="Couldn't pull %s to %s" % (branch, repo) + +class GitTag(GitCommand): + def __init__(self, version): + GitCommand.__init__(self,'tag', [version]) + self.run_error="Couldn't tag %s" % (version,) + +# Used GIT Commands +gitCheckoutUpstream=GitCheckoutBranch('upstream') +gitCheckoutMaster=GitCheckoutBranch('master') +gitShowBranch=GitShowBranch() +gitPullUpstream=GitPull('.', 'upstream') + +def cleanupTmpTree(tree): + RemoveTree(tree)() + + +def unpackOrig(tgz): + try: + unpackTGZ=UnpackTGZ(tgz, tempfile.mkdtemp(dir='../')) + unpackTGZ() + except CommandExecFailed: + print "Unpacking of %s failed" % (tgz,) + cleanupTmpTree(unpackTGZ.dir) + return + return unpackTGZ.dir + + +def get_version(tgz): + 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(): + parser = OptionParser('%prog [-u version] /path/to/upstream-version.tar.gz') + + parser.add_option("-u", "--upstreamversion", dest="version", + help="Upstream Version") + (options, args) = parser.parse_args() + + if len(args) != 1: + parser.print_help() + return 1 + else: + tgz=args[0] + + try: + os.stat('.git') + except: + print >>sys.stderr,"%s not a git repository" % (os.path.abspath('.'),) + 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 + + tmpdir=unpackOrig(tgz) + if not tmpdir: + return 1 + else: + print "Unpacked orig to %s" % (tmpdir, ) + origdir=glob.glob(tmpdir+'/*')[0] + + try: + print "Importing %s to upstream branch..." % (tgz,) + gitCheckoutUpstream() + gitShowBranch() + GitLoadDirs(origdir)() + GitTag(version)() + + print "Merging to master..." + gitCheckoutMaster() + gitShowBranch() + gitPullUpstream() + Dch("%s-1" % (version,), 'New Upstream Version')() + except 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()) + +# vim:et:ts=4:sw=4: -- cgit v1.2.3