From dcb7e7618ce649cd1e1de9525ae2cb06f6d6ff20 2011-12-06 03:11:53 From: Fernando Perez Date: 2011-12-06 03:11:53 Subject: [PATCH] Add 'git mrb' tool for 'git merge remote branch'. It's a little utility I wrote that makes it super quick to merge remote branches from remotes you're already tracking locally. --- diff --git a/tools/git-mrb b/tools/git-mrb new file mode 100755 index 0000000..7ba4723 --- /dev/null +++ b/tools/git-mrb @@ -0,0 +1,80 @@ +#!/usr/bin/env python +"""git-mrb: merge remote branch. + +git mrb [remote:branch OR remote-branch] [onto] [upstream] + +remote must be locally available, and branch must exist in that remote. + +If 'onto' branch isn't given, default is 'master'. + +If 'upstream' repository isn't given, default is 'origin'. + +You can separate the remote and branch spec with either a : or a -. +""" +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +from subprocess import check_call +import sys + +#----------------------------------------------------------------------------- +# Functions +#----------------------------------------------------------------------------- + +def sh(cmd): + cmd = cmd.format(**shvars) + print '$', cmd + check_call(cmd, shell=True) + +#----------------------------------------------------------------------------- +# Main Script +#----------------------------------------------------------------------------- + +argv = sys.argv[1:] +narg = len(argv) + +try: + branch_spec = argv[0] + sep = ':' if ':' in branch_spec else '-' + remote, branch = branch_spec.split(':', 1) + if not branch: + raise ValueError('Branch spec %s invalid, branch not found' % + branch_spec) +except: + import traceback as tb + tb.print_exc() + print __doc__ + sys.exit(1) + +onto = argv[1] if narg >= 2 else 'master' +upstream = argv[1] if narg == 3 else 'origin' + +# Git doesn't like ':' in branch names. +if sep == ':': + branch_spec = branch_spec.replace(':', '-') + +# Global used by sh +shvars = dict(remote=remote, branch_spec=branch_spec, branch=branch, + onto=onto, upstream=upstream) + +# Start git calls. +sh('git fetch {remote}') +sh('git checkout -b {branch_spec} {onto}') +sh('git merge {remote}/{branch}') + +print """ +************************************************************* + Run test suite. If tests pass, run the following to merge: + +git checkout {onto} +git merge {branch_spec} +git push {upstream} {onto} + +************************************************************* +""".format(**shvars) + +ans = raw_input("Revert to master and delete temporary branch? [y/N]: ") +if ans.lower() in ('y', 'yes'): + sh('git checkout {onto}') + sh('git branch -D {branch_spec}')