| #!/usr/bin/env python |
| # 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. |
| """ |
| |
| from __future__ import print_function |
| |
| 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) |