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