123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #!/usr/bin/env python3
- # Copyright 2015 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.
- """Usage: %prog <commit>*
- Given a commit, finds the release where it first appeared (e.g. 47.0.2500.0) as
- well as attempting to determine the branches to which it was merged.
- Note that it uses the "cherry picked from" annotation to find merges, so it will
- only work on merges that followed the "use cherry-pick -x" instructions.
- """
- import optparse
- import re
- import sys
- import git_common as git
- def GetNameForCommit(sha1):
- name = re.sub(r'~.*$', '', git.run('name-rev', '--tags', '--name-only',
- sha1))
- if name == 'undefined':
- name = git.run('name-rev', '--refs', 'remotes/branch-heads/*',
- '--name-only', sha1) + ' [untagged]'
- return name
- def GetMergesForCommit(sha1):
- return [
- c.split()[0]
- for c in git.run('log', '--oneline', '-F', '--all', '--no-abbrev',
- '--grep', 'cherry picked from commit %s' %
- sha1).splitlines()
- ]
- def main(args):
- parser = optparse.OptionParser(usage=sys.modules[__name__].__doc__)
- _, args = parser.parse_args(args)
- if len(args) == 0:
- parser.error('Need at least one commit.')
- for arg in args:
- commit_name = GetNameForCommit(arg)
- if not commit_name:
- print('%s not found' % arg)
- return 1
- print('commit %s was:' % arg)
- print(' initially in ' + commit_name)
- merges = GetMergesForCommit(arg)
- for merge in merges:
- print(' merged to ' + GetNameForCommit(merge) + ' (as ' + merge +
- ')')
- if not merges:
- print('No merges found. If this seems wrong, be sure that you did:')
- print(' git fetch origin && gclient sync --with_branch_heads')
- return 0
- if __name__ == '__main__':
- try:
- sys.exit(main(sys.argv[1:]))
- except KeyboardInterrupt:
- sys.stderr.write('interrupted\n')
- sys.exit(1)
|