Index: git_mark_merge_base.py |
diff --git a/git_mark_merge_base.py b/git_mark_merge_base.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..cefb6df9cf2e0023c1a1038ad1f25e92f27dded5 |
--- /dev/null |
+++ b/git_mark_merge_base.py |
@@ -0,0 +1,68 @@ |
+#!/usr/bin/env python |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+""" |
+Explicitly set/remove/print the merge-base for the current branch. |
+ |
+This manually set merge base will be a stand-in for `git merge-base` for the |
+purposes of the chromium depot_tools git extensions. Passing no arguments will |
+just print the effective merge base for the current branch. |
+""" |
+ |
+import argparse |
+import sys |
+ |
+from subprocess2 import CalledProcessError |
+ |
+from git_common import remove_merge_base, manual_merge_base, current_branch |
+from git_common import get_or_create_merge_base, hash_one |
+ |
+ |
+def main(argv): |
+ parser = argparse.ArgumentParser( |
+ description=__doc__.strip().splitlines()[0], |
+ epilog=' '.join(__doc__.strip().splitlines()[1:])) |
+ g = parser.add_mutually_exclusive_group() |
+ g.add_argument( |
+ 'merge_base', nargs='?', |
+ help='The new hash to use as the merge base for the current branch' |
+ ) |
+ g.add_argument('--delete', '-d', action='store_true', |
+ help='Remove the set mark.') |
+ opts = parser.parse_args(argv) |
+ |
+ cur = current_branch() |
+ |
+ if opts.delete: |
+ try: |
+ remove_merge_base(cur) |
+ except CalledProcessError: |
+ print "No merge base currently exists for %s." % cur |
+ return 0 |
+ |
+ if opts.merge_base: |
+ try: |
+ opts.merge_base = hash_one(opts.merge_base) |
+ except CalledProcessError: |
+ print >> sys.stderr, ( |
+ 'fatal: could not resolve %s as a commit' % (opts.merge_base) |
+ ) |
+ return 1 |
+ |
+ manual_merge_base(cur, opts.merge_base) |
+ |
+ ret = 0 |
+ actual = get_or_create_merge_base(cur) |
+ if opts.merge_base and opts.merge_base != actual: |
+ ret = 1 |
+ print "Invalid merge_base %s" % opts.merge_base |
+ |
+ print "merge_base(%s): %s" % (cur, actual) |
+ |
+ return ret |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main(sys.argv[1:])) |