1 # 2 # Copyright (C) 2015 The Android Open Source Project 3 # 4 # Licensed under the Apache License, Version 2.0 (the 'License'); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an 'AS IS' BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 # 16 import json 17 import requests 18 19 20 class GerritError(RuntimeError): 21 def __init__(self, code, url): 22 self.code = code 23 self.url = url 24 super(GerritError, self).__init__('Error {}: {}'.format(code, url)) 25 26 27 def get_commit(change_id, revision): 28 return json.loads( 29 call('/changes/{}/revisions/{}/commit'.format(change_id, revision))) 30 31 32 def get_files_for_revision(change_id, revision): 33 return json.loads( 34 call('/changes/{}/revisions/{}/files'.format( 35 change_id, revision))).keys() 36 37 38 def call(endpoint, method='GET'): 39 if method != 'GET': 40 raise NotImplementedError('Currently only HTTP GET is supported.') 41 gerrit_url = 'https://android-review.googlesource.com' 42 url = gerrit_url + endpoint 43 response = requests.get(url) 44 if response.status_code != 200: 45 raise GerritError(response.status_code, url) 46 return response.text[5:] 47 48 49 def ref_for_change(change_id): 50 endpoint = '/changes/{}/detail?o=CURRENT_REVISION'.format(change_id) 51 change = json.loads(call(endpoint)) 52 commit = change['current_revision'] 53 return change['revisions'][commit]['fetch']['http']['ref'] 54 55 56 def get_labels(change_id, patch_set): 57 """Returns labels attached to a revision. 58 59 Returned data is in the following format: 60 { 61 'Code-Review': { 62 <email>: <value>, 63 ... 64 }, 65 'Verified': { 66 <email>: <value>, 67 ... 68 } 69 } 70 """ 71 details = json.loads(call('/changes/{}/revisions/{}/review'.format( 72 change_id, patch_set))) 73 labels = {'Code-Review': {}, 'Verified': {}} 74 for review in details['labels']['Code-Review']['all']: 75 if 'value' in review and 'email' in review: 76 labels['Code-Review'][review['email']] = int(review['value']) 77 for review in details['labels']['Verified']['all']: 78 if 'value' in review and 'email' in review: 79 labels['Verified'][review['email']] = int(review['value']) 80 return labels 81