summaryrefslogtreecommitdiffstats
path: root/tools/bionicbb/gerrit.py
blob: 51df4fbce47b8a5d84aa4a07891d0d73a8a60cc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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