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