diff options
Diffstat (limited to 'tools/bionicbb/gerrit.py')
-rw-r--r-- | tools/bionicbb/gerrit.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/tools/bionicbb/gerrit.py b/tools/bionicbb/gerrit.py new file mode 100644 index 0000000..51df4fb --- /dev/null +++ b/tools/bionicbb/gerrit.py @@ -0,0 +1,56 @@ +# pylint: disable=bad-indentation +# vim: set sw=2 ts=2: +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 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 = 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 |