OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """ | 6 """ |
7 Checks out a downstream branch from the currently checked out branch. If there | 7 Checks out a downstream branch from the currently checked out branch. If there |
8 is more than one downstream branch, then this script will prompt you to select | 8 is more than one downstream branch, then this script will prompt you to select |
9 which branch. | 9 which branch. |
10 """ | 10 """ |
11 | 11 |
12 import argparse | 12 import argparse |
13 import sys | 13 import sys |
14 | 14 |
15 from git_common import current_branch, branches, upstream, run_stream, hash_one | 15 from git_common import current_branch, branches, upstream, run, hash_one |
16 | 16 |
17 | 17 |
18 def main(args): | 18 def main(args): |
19 parser = argparse.ArgumentParser() | 19 parser = argparse.ArgumentParser() |
20 parser.add_argument('--pick', | 20 parser.add_argument('--pick', |
21 help=( | 21 help=( |
22 'The number to pick if this command would ' | 22 'The number to pick if this command would ' |
23 'prompt')) | 23 'prompt')) |
24 opts = parser.parse_args(args) | 24 opts = parser.parse_args(args) |
25 | 25 |
26 upfn = upstream | 26 upfn = upstream |
27 cur = current_branch() | 27 cur = current_branch() |
28 if cur == 'HEAD': | 28 if cur == 'HEAD': |
29 def _upfn(b): | 29 def _upfn(b): |
30 parent = upstream(b) | 30 parent = upstream(b) |
31 if parent: | 31 if parent: |
32 return hash_one(parent) | 32 return hash_one(parent) |
33 upfn = _upfn | 33 upfn = _upfn |
34 cur = hash_one(cur) | 34 cur = hash_one(cur) |
35 downstreams = [b for b in branches() if upfn(b) == cur] | 35 downstreams = [b for b in branches() if upfn(b) == cur] |
36 if not downstreams: | 36 if not downstreams: |
37 return "No downstream branches" | 37 return "No downstream branches" |
38 elif len(downstreams) == 1: | 38 elif len(downstreams) == 1: |
39 run_stream('checkout', downstreams[0], stdout=sys.stdout, stderr=sys.stderr) | 39 run('checkout', downstreams[0], stdout=sys.stdout, stderr=sys.stderr) |
40 else: | 40 else: |
41 high = len(downstreams) - 1 | 41 high = len(downstreams) - 1 |
42 while True: | 42 while True: |
43 print "Please select a downstream branch" | 43 print "Please select a downstream branch" |
44 for i, b in enumerate(downstreams): | 44 for i, b in enumerate(downstreams): |
45 print " %d. %s" % (i, b) | 45 print " %d. %s" % (i, b) |
46 prompt = "Selection (0-%d)[0]: " % high | 46 prompt = "Selection (0-%d)[0]: " % high |
47 r = opts.pick | 47 r = opts.pick |
48 if r: | 48 if r: |
49 print prompt + r | 49 print prompt + r |
50 else: | 50 else: |
51 r = raw_input(prompt).strip() or '0' | 51 r = raw_input(prompt).strip() or '0' |
52 if not r.isdigit() or (0 > int(r) > high): | 52 if not r.isdigit() or (0 > int(r) > high): |
53 print "Invalid choice." | 53 print "Invalid choice." |
54 else: | 54 else: |
55 run_stream('checkout', downstreams[int(r)], stdout=sys.stdout, | 55 run('checkout', downstreams[int(r)], stdout=sys.stdout, |
56 stderr=sys.stderr) | 56 stderr=sys.stderr) |
57 break | 57 break |
58 | 58 |
59 | 59 |
60 if __name__ == '__main__': | 60 if __name__ == '__main__': |
61 try: | 61 try: |
62 sys.exit(main(sys.argv[1:])) | 62 sys.exit(main(sys.argv[1:])) |
63 except KeyboardInterrupt: | 63 except KeyboardInterrupt: |
64 pass | 64 pass |
OLD | NEW |