diff options
Diffstat (limited to 'examples/gbp-posttag-push')
-rwxr-xr-x | examples/gbp-posttag-push | 123 |
1 files changed, 92 insertions, 31 deletions
diff --git a/examples/gbp-posttag-push b/examples/gbp-posttag-push index cd8968dc..91d3eb16 100755 --- a/examples/gbp-posttag-push +++ b/examples/gbp-posttag-push @@ -1,7 +1,7 @@ #!/usr/bin/python # vim: set fileencoding=utf-8 : # -# (C) 2009,2012,2015 Guido Guenther <agx@sigxcpu.org> +# (C) 2009,2012,2015,2016 Guido Guenther <agx@sigxcpu.org> # # gbp-posttag-push: post tag hook to be called by git-buildpackage to push out # the newly created tag and to forward the remote branch to that position @@ -11,7 +11,7 @@ # signed. # # use: -# [git-buildpackage] +# [buildpackage] # posttag = gbp-posttag-push # # Options: @@ -21,15 +21,19 @@ from __future__ import print_function -from six.moves import configparser +import glob import os import subprocess import sys import gbp.log -from gbp.config import GbpOptionParser +from gbp.command_wrappers import Command, CommandExecFailed +from gbp.config import GbpOptionParserDebian from gbp.deb.git import DebianGitRepository - +from gbp.deb.source import DebianSource +from gbp.errors import GbpError +from gbp.git.vfs import GitVfs +from gbp.scripts.common import ExitCodes class Env(object): @@ -44,9 +48,9 @@ def get_push_targets(env): if not len(remote): continue repo, refspec = remote.split() - repo = ".".join(repo.split('.')[1:-1]) # remote.<repo>.push + repo = ".".join(repo.split('.')[1:-1]) # remote.<repo>.push try: - remote = refspec.split(':')[1] # src:dest + remote = refspec.split(':')[1] # src:dest except IndexError: remote = refspec dests[repo] = remote @@ -56,10 +60,10 @@ def get_push_targets(env): def get_pull(env): """where did we pull from?""" cmd = 'git config --get branch."%s".remote' % env.branch - remote = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True).communicate()[0].strip() + remote = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True).communicate()[0].strip() if not remote: remote = 'origin' - return { remote: env.branch } + return {remote: env.branch} def git_push_sim(*args): @@ -69,7 +73,6 @@ def git_push_sim(*args): def get_upstream_tag(repo, tag, tag_format): # FIXME: This assumes the debian version is the last part after the slash: version = tag.split('/')[-1] - no_epoch = version.split(':')[-1] upstream = version.rsplit('-')[0] tag = tag_format % dict(version=upstream) if repo.has_tag(tag): @@ -77,16 +80,19 @@ def get_upstream_tag(repo, tag, tag_format): return None -def main(argv): - env = Env() - upstream_sha1 = None +def build_parser(name): + + # Until we moved this out of examples + os.environ['GBP_DISABLE_SECTION_DEPRECTATION'] = '1' + GbpOptionParserDebian.defaults['upload-cmd'] = "" + GbpOptionParserDebian.help['upload-cmd'] = "Upload command, default is '%(upload-cmd)s'" try: - parser = GbpOptionParser(command=os.path.basename(argv[0]), prefix='', - usage='%prog [options] paths') - except configparser.ParsingError as err: - gbp.log.error(err) - return 1 + parser = GbpOptionParserDebian(command=os.path.basename(name), + usage='%prog [options]') + except GbpError as err: + gbp.log.err(err) + return None parser.add_option("-d", "--dry-run", dest="dryrun", default=False, action="store_true", help="dry run, don't push.") @@ -98,25 +104,67 @@ def main(argv): dest="upstream_branch") parser.add_config_file_option(option_name="upstream-tag", dest="upstream_tag") + parser.add_config_file_option(option_name="debian-tag", + dest="debian_tag") + parser.add_config_file_option(option_name="upload-cmd", + dest="upload_cmd") + parser.add_config_file_option(option_name="color", dest="color", type='tristate') + parser.add_config_file_option(option_name="color-scheme", + dest="color_scheme") parser.add_option("--verbose", action="store_true", dest="verbose", default=False, help="verbose command execution") + return parser - (options, args) = parser.parse_args() - gbp.log.setup(False, options.verbose) - repo = DebianGitRepository('.') +def parse_args(argv): + parser = build_parser(argv[0]) + if not parser: + return None, None + return parser.parse_args(argv) + + +def find_changes(sourcename, version): + glob_ex = "../%s_%s_*.changes" % (sourcename, version) + gbp.log.info("Looking for changes at %s" % glob_ex) + return glob.glob(glob_ex) + + +def upload_changes(changes, cmd, dryrun): + ret = 0 + for name in changes: + gbp.log.info("Running %s" % " ".join([cmd, name])) + try: + if not dryrun: + Command(cmd, [name], shell=False)() + except CommandExecFailed: + gbp.log.err("Upload of '%s' failed." % name) + ret = 1 + return ret + +def main(argv): + retval = 0 + env = Env() + upstream_sha1 = None + + (options, args) = parse_args(argv) + if not options: + return ExitCodes.parse_error + + gbp.log.setup(options.color, options.verbose, options.color_scheme) + + repo = DebianGitRepository('.') if options.dryrun: - print("Dry run mode. Not pushing.") + gbp.log.warn("Dry run mode. Not pushing, not uploading.") repo.push = git_push_sim repo.push_tag = git_push_sim - for envvar in [ "GBP_TAG", "GBP_BRANCH", "GBP_SHA1" ]: + for envvar in ["GBP_TAG", "GBP_BRANCH", "GBP_SHA1"]: var = os.getenv(envvar) if var: - env.__dict__.setdefault( "%s" % envvar.split("_")[1].lower(), var) + env.__dict__.setdefault("%s" % envvar.split("_")[1].lower(), var) else: - print("%s not set." % envvar, file=sys.stderr) + gbp.log.err("%s not set." % envvar, file=sys.stderr) return 1 dests = get_push_targets(env) @@ -128,22 +176,35 @@ def main(argv): upstream_sha1 = repo.rev_parse("%s^{}" % upstream_tag) if not repo.verify_tag(env.tag): - print("Not pushing nonexistent or unsigned tag '%s'." % env.tag, file=sys.stderr) + gbp.log.info("Not pushing non-existent or unsigned tag '%s'." % env.tag, file=sys.stderr) return 0 + source = DebianSource(GitVfs(repo, env.tag)) + for dest in dests: - print("Pushing %s to %s" % (env.tag, dest)) + gbp.log.info("Pushing %s to %s" % (env.tag, dest)) repo.push_tag(dest, env.tag) - print("Pushing %s to %s" % (env.sha1, dest)) + gbp.log.info("Pushing %s to %s %s" % (env.sha1, dest, dests[dest])) repo.push(dest, env.sha1, dests[dest]) if options.push_upstream and upstream_tag: - print("Pushing %s to %s" % (upstream_tag, dest)) + gbp.log.info("Pushing %s to %s" % (upstream_tag, dest)) repo.push_tag(dest, upstream_tag) if not repo.branch_contains("%s/%s" % (dest, options.upstream_branch), upstream_sha1, remote=True): - print("Pushing %s to %s" % (upstream_sha1, dest)) + gbp.log.info("Pushing %s to %s %s" % (upstream_sha1, dest, options.upstream_branch)) repo.push(dest, upstream_sha1, options.upstream_branch) - print("done.") + + if options.upload_cmd: + version = repo.tag_to_version(env.tag, options.debian_tag) + changes = find_changes(source.sourcepkg, version) + if len(changes): + retval = upload_changes(changes, options.upload_cmd, options.dryrun) + else: + gbp.log.info("No changes file found, nothing to upload.") + else: + gbp.log.info("No upload command defined, not uploading to the archive") + return retval + if __name__ == '__main__': sys.exit(main(sys.argv)) |