2 # Copyright 2014 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
7 Explicitly set/remove/print the merge-base for the current branch.
9 This manually set merge base will be a stand-in for `git merge-base` for the
10 purposes of the chromium depot_tools git extensions. Passing no arguments will
11 just print the effective merge base for the current branch.
17 from subprocess2 import CalledProcessError
19 from git_common import remove_merge_base, manual_merge_base, current_branch
20 from git_common import get_or_create_merge_base, hash_one, upstream
24 parser = argparse.ArgumentParser(
25 description=__doc__.strip().splitlines()[0],
26 epilog=' '.join(__doc__.strip().splitlines()[1:]))
27 g = parser.add_mutually_exclusive_group()
29 'merge_base', nargs='?',
30 help='The new hash to use as the merge base for the current branch'
32 g.add_argument('--delete', '-d', action='store_true',
33 help='Remove the set mark.')
34 opts = parser.parse_args(argv)
36 cur = current_branch()
40 remove_merge_base(cur)
41 except CalledProcessError:
42 print "No merge base currently exists for %s." % cur
47 opts.merge_base = hash_one(opts.merge_base)
48 except CalledProcessError:
49 print >> sys.stderr, (
50 'fatal: could not resolve %s as a commit' % (opts.merge_base)
54 manual_merge_base(cur, opts.merge_base, upstream(cur))
57 actual = get_or_create_merge_base(cur)
58 if opts.merge_base and opts.merge_base != actual:
60 print "Invalid merge_base %s" % opts.merge_base
62 print "merge_base(%s): %s" % (cur, actual)
67 if __name__ == '__main__':
68 sys.exit(main(sys.argv[1:]))