1cb93a386Sopenharmony_ci#!/usr/bin/env python2
2cb93a386Sopenharmony_ci# Copyright 2017 Google Inc.
3cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be
4cb93a386Sopenharmony_ci# found in the LICENSE file.
5cb93a386Sopenharmony_ci
6cb93a386Sopenharmony_ciimport json
7cb93a386Sopenharmony_ciimport re
8cb93a386Sopenharmony_ciimport subprocess
9cb93a386Sopenharmony_ciimport sys
10cb93a386Sopenharmony_ciimport urllib
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ci# TODO(halcanary): document functions and script usage.
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_cidef retrieve_changeid(commit_or_branch):
15cb93a386Sopenharmony_ci  try:
16cb93a386Sopenharmony_ci    cmd = ['git', 'log', '-1', '--format=%B', commit_or_branch, '--']
17cb93a386Sopenharmony_ci    body = subprocess.check_output(cmd)
18cb93a386Sopenharmony_ci  except OSError:
19cb93a386Sopenharmony_ci    raise Exception('git not found')
20cb93a386Sopenharmony_ci  except subprocess.CalledProcessError:
21cb93a386Sopenharmony_ci    raise Exception('`%s` failed' % ' '.join(cmd))
22cb93a386Sopenharmony_ci  match = re.search(r'^Change-Id: *(.*) *$', body, re.MULTILINE)
23cb93a386Sopenharmony_ci  if match is None:
24cb93a386Sopenharmony_ci    raise Exception('Change-Id field missing from commit %s' % commit_or_branch)
25cb93a386Sopenharmony_ci  return match.group(1)
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_ci
28cb93a386Sopenharmony_cidef gerrit_change_id_to_number(site, cid):
29cb93a386Sopenharmony_ci  url = 'https://%s/changes/?q=change:%s' % (site, cid)
30cb93a386Sopenharmony_ci  try:
31cb93a386Sopenharmony_ci    content = urllib.urlopen(url).read()
32cb93a386Sopenharmony_ci  except IOError:
33cb93a386Sopenharmony_ci    raise Exception('error reading "%s"' % url)
34cb93a386Sopenharmony_ci  try:
35cb93a386Sopenharmony_ci    parsed = json.loads(content[content.find('['):])
36cb93a386Sopenharmony_ci  except ValueError:
37cb93a386Sopenharmony_ci    raise Exception('unable to parse content\n"""\n%s\n"""' % content)
38cb93a386Sopenharmony_ci  try:
39cb93a386Sopenharmony_ci    return parsed[0]['_number']
40cb93a386Sopenharmony_ci  except (IndexError, KeyError):
41cb93a386Sopenharmony_ci    raise Exception('Content missing\n"""\n%s\n"""' %
42cb93a386Sopenharmony_ci                    json.dumps(parsed, indent=2))
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_ci
45cb93a386Sopenharmony_cidef args_to_changeid(argv):
46cb93a386Sopenharmony_ci  if len(argv) == 2 and len(argv[1]) == 41 and argv[1][0] == 'I':
47cb93a386Sopenharmony_ci    return argv[1]
48cb93a386Sopenharmony_ci  else:
49cb93a386Sopenharmony_ci    return retrieve_changeid(argv[1] if len(argv) == 2 else 'HEAD')
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ci
52cb93a386Sopenharmony_ciif __name__ == '__main__':
53cb93a386Sopenharmony_ci  try:
54cb93a386Sopenharmony_ci    sys.stdout.write('%d\n' %
55cb93a386Sopenharmony_ci        gerrit_change_id_to_number('skia-review.googlesource.com',
56cb93a386Sopenharmony_ci                                   args_to_changeid(sys.argv)))
57cb93a386Sopenharmony_ci  except Exception as e:
58cb93a386Sopenharmony_ci    sys.stderr.write('%s\n' % e)
59cb93a386Sopenharmony_ci    sys.exit(1)
60cb93a386Sopenharmony_ci
61cb93a386Sopenharmony_ci
62