|
|
#!/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.strip().lower() in ('', 'y', 'yes'):
|
|
|
sh('git checkout {onto}')
|
|
|
sh('git branch -D {branch_spec}')
|
|
|
|