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