| #!/usr/bin/env python2 |
| # Copyright 2017 Google Inc. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import json |
| import re |
| import subprocess |
| import sys |
| import urllib |
| |
| # TODO(halcanary): document functions and script usage. |
| |
| def retrieve_changeid(commit_or_branch): |
| try: |
| cmd = ['git', 'log', '-1', '--format=%B', commit_or_branch, '--'] |
| body = subprocess.check_output(cmd) |
| except OSError: |
| raise Exception('git not found') |
| except subprocess.CalledProcessError: |
| raise Exception('`%s` failed' % ' '.join(cmd)) |
| match = re.search(r'^Change-Id: *(.*) *$', body, re.MULTILINE) |
| if match is None: |
| raise Exception('Change-Id field missing from commit %s' % commit_or_branch) |
| return match.group(1) |
| |
| |
| def gerrit_change_id_to_number(site, cid): |
| url = 'https://%s/changes/?q=change:%s' % (site, cid) |
| try: |
| content = urllib.urlopen(url).read() |
| except IOError: |
| raise Exception('error reading "%s"' % url) |
| try: |
| parsed = json.loads(content[content.find('['):]) |
| except ValueError: |
| raise Exception('unable to parse content\n"""\n%s\n"""' % content) |
| try: |
| return parsed[0]['_number'] |
| except (IndexError, KeyError): |
| raise Exception('Content missing\n"""\n%s\n"""' % |
| json.dumps(parsed, indent=2)) |
| |
| |
| def args_to_changeid(argv): |
| if len(argv) == 2 and len(argv[1]) == 41 and argv[1][0] == 'I': |
| return argv[1] |
| else: |
| return retrieve_changeid(argv[1] if len(argv) == 2 else 'HEAD') |
| |
| |
| if __name__ == '__main__': |
| try: |
| sys.stdout.write('%d\n' % |
| gerrit_change_id_to_number('skia-review.googlesource.com', |
| args_to_changeid(sys.argv))) |
| except Exception as e: |
| sys.stderr.write('%s\n' % e) |
| sys.exit(1) |
| |
| |