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

#!/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)