blob: 673e2b433220c518959f7cf836612696243e3eab [file] [log] [blame]
iannucci@chromium.orgc050a5b2014-03-26 06:18:50 +00001#!/usr/bin/env python
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.
5
6"""
7Explicitly set/remove/print the merge-base for the current branch.
8
9This manually set merge base will be a stand-in for `git merge-base` for the
10purposes of the chromium depot_tools git extensions. Passing no arguments will
11just print the effective merge base for the current branch.
12"""
13
14import argparse
15import sys
16
17from subprocess2 import CalledProcessError
18
19from git_common import remove_merge_base, manual_merge_base, current_branch
iannucci@chromium.org10fbe872014-05-16 22:31:13 +000020from git_common import get_or_create_merge_base, hash_one, upstream
iannucci@chromium.orgc050a5b2014-03-26 06:18:50 +000021
22
23def main(argv):
24 parser = argparse.ArgumentParser(
25 description=__doc__.strip().splitlines()[0],
26 epilog=' '.join(__doc__.strip().splitlines()[1:]))
27 g = parser.add_mutually_exclusive_group()
28 g.add_argument(
29 'merge_base', nargs='?',
30 help='The new hash to use as the merge base for the current branch'
31 )
32 g.add_argument('--delete', '-d', action='store_true',
33 help='Remove the set mark.')
34 opts = parser.parse_args(argv)
35
36 cur = current_branch()
37
38 if opts.delete:
39 try:
40 remove_merge_base(cur)
41 except CalledProcessError:
42 print "No merge base currently exists for %s." % cur
43 return 0
44
45 if opts.merge_base:
46 try:
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)
51 )
52 return 1
53
iannucci@chromium.org10fbe872014-05-16 22:31:13 +000054 manual_merge_base(cur, opts.merge_base, upstream(cur))
iannucci@chromium.orgc050a5b2014-03-26 06:18:50 +000055
56 ret = 0
57 actual = get_or_create_merge_base(cur)
58 if opts.merge_base and opts.merge_base != actual:
59 ret = 1
60 print "Invalid merge_base %s" % opts.merge_base
61
62 print "merge_base(%s): %s" % (cur, actual)
63
64 return ret
65
66
67if __name__ == '__main__':
68 sys.exit(main(sys.argv[1:]))