git-mrb
80 lines
| 2.3 KiB
| text/plain
|
TextLexer
/ tools / git-mrb
Fernando Perez
|
r5623 | #!/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}') | ||||