You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.7 KiB
62 lines
1.7 KiB
#!/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)
|
|
|
|
|