|  | # | 
|  | # Copyright (C) 2015 The Android Open Source Project | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the 'License'); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an 'AS IS' BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  | # | 
|  | import json | 
|  | import requests | 
|  |  | 
|  |  | 
|  | class GerritError(RuntimeError): | 
|  | def __init__(self, code, url): | 
|  | self.code = code | 
|  | self.url = url | 
|  | super(GerritError, self).__init__('Error {}: {}'.format(code, url)) | 
|  |  | 
|  |  | 
|  | def get_commit(change_id, revision): | 
|  | return json.loads( | 
|  | call('/changes/{}/revisions/{}/commit'.format(change_id, revision))) | 
|  |  | 
|  |  | 
|  | def get_files_for_revision(change_id, revision): | 
|  | return json.loads( | 
|  | call('/changes/{}/revisions/{}/files'.format( | 
|  | change_id, revision))).keys() | 
|  |  | 
|  |  | 
|  | def call(endpoint, method='GET'): | 
|  | if method != 'GET': | 
|  | raise NotImplementedError('Currently only HTTP GET is supported.') | 
|  | gerrit_url = 'https://android-review.googlesource.com' | 
|  | url = gerrit_url + endpoint | 
|  | response = requests.get(url) | 
|  | if response.status_code != 200: | 
|  | raise GerritError(response.status_code, url) | 
|  | return response.text[5:] | 
|  |  | 
|  |  | 
|  | def ref_for_change(change_id): | 
|  | endpoint = '/changes/{}/detail?o=CURRENT_REVISION'.format(change_id) | 
|  | change = json.loads(call(endpoint)) | 
|  | commit = change['current_revision'] | 
|  | return change['revisions'][commit]['fetch']['http']['ref'] | 
|  |  | 
|  |  | 
|  | def get_labels(change_id, patch_set): | 
|  | """Returns labels attached to a revision. | 
|  |  | 
|  | Returned data is in the following format: | 
|  | { | 
|  | 'Code-Review': { | 
|  | <email>: <value>, | 
|  | ... | 
|  | }, | 
|  | 'Verified': { | 
|  | <email>: <value>, | 
|  | ... | 
|  | } | 
|  | } | 
|  | """ | 
|  | details = json.loads(call('/changes/{}/revisions/{}/review'.format( | 
|  | change_id, patch_set))) | 
|  | labels = {'Code-Review': {}, 'Verified': {}} | 
|  | for review in details['labels']['Code-Review']['all']: | 
|  | if 'value' in review and 'email' in review: | 
|  | labels['Code-Review'][review['email']] = int(review['value']) | 
|  | for review in details['labels']['Verified']['all']: | 
|  | if 'value' in review and 'email' in review: | 
|  | labels['Verified'][review['email']] = int(review['value']) | 
|  | return labels |