#!/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 -.

Taken from IPython project
"""
#-----------------------------------------------------------------------------
# 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}')