63 lines
2.4 KiB
Text
63 lines
2.4 KiB
Text
|
#!/usr/bin/env python
|
||
|
import sys
|
||
|
import argparse
|
||
|
from subprocess import check_call, call, check_output
|
||
|
|
||
|
|
||
|
def main():
|
||
|
parser = argparse.ArgumentParser(
|
||
|
description="Creates a PR for merging two branches")
|
||
|
parser.add_argument("from_branch",
|
||
|
help="From branch (e.g 1.1)")
|
||
|
parser.add_argument("to_branch",
|
||
|
help="To branch (e.g master)")
|
||
|
parser.add_argument("--yes", action="store_true",
|
||
|
help="Assume yes. Warning: discards local changes.")
|
||
|
parser.add_argument("--continue", action="store_true",
|
||
|
help="Continue after fixing merging errors.")
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
tmp_branch = "automatic_merge_from_{}_to_{}_branch".format(
|
||
|
args.from_branch, args.to_branch)
|
||
|
|
||
|
if not vars(args)["continue"]:
|
||
|
if not args.yes and raw_input("This will destroy all local changes. " +
|
||
|
"Continue? [y/n]: ") != "y":
|
||
|
return 1
|
||
|
check_call("git reset --hard", shell=True)
|
||
|
check_call("git clean -df", shell=True)
|
||
|
check_call("git fetch", shell=True)
|
||
|
|
||
|
check_call("git checkout {}".format(args.from_branch), shell=True)
|
||
|
check_call("git pull", shell=True)
|
||
|
|
||
|
check_call("git checkout {}".format(args.to_branch), shell=True)
|
||
|
check_call("git pull", shell=True)
|
||
|
call("git branch -D {} > /dev/null".format(tmp_branch), shell=True)
|
||
|
check_call("git checkout -b {}".format(tmp_branch), shell=True)
|
||
|
if call("git merge {}".format(args.from_branch), shell=True) != 0:
|
||
|
print("Looks like you have merge errors.")
|
||
|
print("Fix them, commit, then run: {} --continue"
|
||
|
.format(" ".join(sys.argv)))
|
||
|
return 1
|
||
|
|
||
|
if len(check_output("git status -s", shell=True).strip()) > 0:
|
||
|
print("Looks like you have uncommitted changes")
|
||
|
return 1
|
||
|
|
||
|
if len(check_output("git log HEAD...{}".format(args.to_branch),
|
||
|
shell=True).strip()) == 0:
|
||
|
print("No commit to push")
|
||
|
return 1
|
||
|
|
||
|
print("Ready to push branch.")
|
||
|
remote = raw_input("To which remote should I push? (your fork): ")
|
||
|
call("git push {} :{} > /dev/null".format(remote, tmp_branch),
|
||
|
shell=True)
|
||
|
check_call("git push --set-upstream {} {}"
|
||
|
.format(remote, tmp_branch), shell=True)
|
||
|
print("Done. Go to Github and open the PR")
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
sys.exit(main())
|