git_rename_branch.py 1.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#!/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.

"""Rename the current branch while maintaining correct dependencies."""

import argparse
import sys

import subprocess2

from git_common import current_branch, run, set_branch_config, branch_config
from git_common import branch_config_map

def main(args):
  current = current_branch()
  if current == 'HEAD':
    current = None
  old_name_help = 'The old branch to rename.'
  if current:
    old_name_help += ' (default %(default)r)'

  parser = argparse.ArgumentParser()
  parser.add_argument('old_name', nargs=('?' if current else 1),
                      help=old_name_help, default=current)
  parser.add_argument('new_name', help='The new branch name.')

  opts = parser.parse_args(args)

  # when nargs=1, we get a list :(
  if isinstance(opts.old_name, list):
    opts.old_name = opts.old_name[0]

  try:
    run('branch', '-m', opts.old_name, opts.new_name)

    # update the downstreams
    for branch, merge in branch_config_map('merge').iteritems():
      if merge == 'refs/heads/' + opts.old_name:
        # Only care about local branches
        if branch_config(branch, 'remote') == '.':
          set_branch_config(branch, 'merge', 'refs/heads/' + opts.new_name)
  except subprocess2.CalledProcessError as cpe:
    sys.stderr.write(cpe.stderr)
    return 1
47
  return 0
48 49 50


if __name__ == '__main__':  # pragma: no cover
51 52 53 54 55
  try:
    sys.exit(main(sys.argv[1:]))
  except KeyboardInterrupt:
    sys.stderr.write('interrupted\n')
    sys.exit(1)