diff options
Diffstat (limited to 'tools/bionicbb')
-rw-r--r-- | tools/bionicbb/build_listener.py | 166 | ||||
-rw-r--r-- | tools/bionicbb/gerrit.py | 97 | ||||
-rw-r--r-- | tools/bionicbb/gmail_listener.py | 467 | ||||
-rw-r--r-- | tools/bionicbb/setup.cfg | 2 |
4 files changed, 386 insertions, 346 deletions
diff --git a/tools/bionicbb/build_listener.py b/tools/bionicbb/build_listener.py index b63c18d..f7f52ed 100644 --- a/tools/bionicbb/build_listener.py +++ b/tools/bionicbb/build_listener.py @@ -1,6 +1,19 @@ #!/usr/bin/env python2 -# pylint: disable=bad-indentation -# vim: set sw=2 ts=2: +# +# 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 import termcolor @@ -12,93 +25,94 @@ app = Flask(__name__) def gerrit_url(endpoint): - gerrit_base_url = 'https://android-review.googlesource.com' - return gerrit_base_url + endpoint + gerrit_base_url = 'https://android-review.googlesource.com' + return gerrit_base_url + endpoint @app.route('/', methods=['POST']) def handle_build_message(): - result = json.loads(request.data) - - name = result['name'] - number = result['build']['number'] - status = result['build']['status'] - go_url = 'http://go/bionicbb/' + result['build']['url'] - full_url = result['build']['full_url'] - params = result['build']['parameters'] - change_id = params['CHANGE_ID'] - ref = params['REF'] - patch_set = ref.split('/')[-1] - - print '{} #{} {}: {}'.format(name, number, status, full_url) - - # bionic-lint is always broken, so we don't want to reject changes for those - # failures until we clean things up. - if name == 'bionic-presubmit': - message_lines = ['{} #{} checkbuild {}: {}'.format( - name, number, status, go_url)] - if status == 'FAILURE': - message_lines += ['If you believe this Verified-1 was in error, +1 the ' - 'change and bionicbb will remove the -1 shortly.'] - - request_data = { - 'message': '\n'.join(message_lines) - } - - label = 'Verified' - if status == 'FAILURE': - request_data['labels'] = {label: -1} - elif status == 'SUCCESS': - request_data['labels'] = {label: +1} - - url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id, - patch_set)) - - headers = {'Content-Type': 'application/json;charset=UTF-8'} - print 'POST {}: {}'.format(url, request_data) - print requests.post(url, headers=headers, json=request_data) - elif name == 'clean-bionic-presubmit': - request_data = {'message': 'out/ directory removed'} - url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id, - patch_set)) - headers = {'Content-Type': 'application/json;charset=UTF-8'} - print 'POST {}: {}'.format(url, request_data) - print requests.post(url, headers=headers, json=request_data) - elif name == 'bionic-lint': - print 'IGNORED' - else: - print '{}: {}'.format(termcolor.colored('red', 'UNKNOWN'), name) - return '' + result = json.loads(request.data) + + name = result['name'] + number = result['build']['number'] + status = result['build']['status'] + go_url = 'http://go/bionicbb/' + result['build']['url'] + full_url = result['build']['full_url'] + params = result['build']['parameters'] + change_id = params['CHANGE_ID'] + ref = params['REF'] + patch_set = ref.split('/')[-1] + + print '{} #{} {}: {}'.format(name, number, status, full_url) + + # bionic-lint is always broken, so we don't want to reject changes for + # those failures until we clean things up. + if name == 'bionic-presubmit': + message_lines = ['{} #{} checkbuild {}: {}'.format( + name, number, status, go_url)] + if status == 'FAILURE': + message_lines += ['If you believe this Verified-1 was in error, ' + '+1 the change and bionicbb will remove the -1 ' + 'shortly.'] + + request_data = { + 'message': '\n'.join(message_lines) + } + + label = 'Verified' + if status == 'FAILURE': + request_data['labels'] = {label: -1} + elif status == 'SUCCESS': + request_data['labels'] = {label: +1} + + url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id, + patch_set)) + + headers = {'Content-Type': 'application/json;charset=UTF-8'} + print 'POST {}: {}'.format(url, request_data) + print requests.post(url, headers=headers, json=request_data) + elif name == 'clean-bionic-presubmit': + request_data = {'message': 'out/ directory removed'} + url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id, + patch_set)) + headers = {'Content-Type': 'application/json;charset=UTF-8'} + print 'POST {}: {}'.format(url, request_data) + print requests.post(url, headers=headers, json=request_data) + elif name == 'bionic-lint': + print 'IGNORED' + else: + print '{}: {}'.format(termcolor.colored('red', 'UNKNOWN'), name) + return '' @app.route('/drop-rejection', methods=['POST']) def drop_rejection(): - revision_info = json.loads(request.data) + revision_info = json.loads(request.data) - change_id = revision_info['changeid'] - patch_set = revision_info['patchset'] + change_id = revision_info['changeid'] + patch_set = revision_info['patchset'] - bb_email = 'bionicbb@android.com' - labels = gerrit.get_labels(change_id, patch_set) - if bb_email in labels['Verified']: - bb_review = labels['Verified'][bb_email] - else: - bb_review = 0 + bb_email = 'bionicbb@android.com' + labels = gerrit.get_labels(change_id, patch_set) + if bb_email in labels['Verified']: + bb_review = labels['Verified'][bb_email] + else: + bb_review = 0 - if bb_review >= 0: - print 'No rejection to drop: {} {}'.format(change_id, patch_set) - return '' + if bb_review >= 0: + print 'No rejection to drop: {} {}'.format(change_id, patch_set) + return '' - print 'Dropping rejection: {} {}'.format(change_id, patch_set) + print 'Dropping rejection: {} {}'.format(change_id, patch_set) - request_data = {'labels': {'Verified': 0}} - url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id, - patch_set)) - headers = {'Content-Type': 'application/json;charset=UTF-8'} - print 'POST {}: {}'.format(url, request_data) - print requests.post(url, headers=headers, json=request_data) - return '' + request_data = {'labels': {'Verified': 0}} + url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id, + patch_set)) + headers = {'Content-Type': 'application/json;charset=UTF-8'} + print 'POST {}: {}'.format(url, request_data) + print requests.post(url, headers=headers, json=request_data) + return '' if __name__ == "__main__": - app.run(host='0.0.0.0', debug=True) + app.run(host='0.0.0.0', debug=True) diff --git a/tools/bionicbb/gerrit.py b/tools/bionicbb/gerrit.py index 51df4fb..a3d5887 100644 --- a/tools/bionicbb/gerrit.py +++ b/tools/bionicbb/gerrit.py @@ -1,56 +1,69 @@ -# pylint: disable=bad-indentation -# vim: set sw=2 ts=2: +# +# 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 __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:] + 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'] + 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 + """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 diff --git a/tools/bionicbb/gmail_listener.py b/tools/bionicbb/gmail_listener.py index 95ae3ae..8718484 100644 --- a/tools/bionicbb/gmail_listener.py +++ b/tools/bionicbb/gmail_listener.py @@ -1,6 +1,19 @@ #!/usr/bin/env python2 -# pylint: disable=bad-indentation -# vim: set sw=2 ts=2: +# +# 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 base64 import httplib import httplib2 @@ -20,228 +33,229 @@ import gerrit class GmailError(RuntimeError): - def __init__(self, message): - super(GmailError, self).__init__(message) + def __init__(self, message): + super(GmailError, self).__init__(message) def get_gerrit_label(labels): - for label in labels: - if label['name'] == 'gerrit': - return label['id'] - return None + for label in labels: + if label['name'] == 'gerrit': + return label['id'] + return None def get_headers(msg): - headers = {} - for hdr in msg['payload']['headers']: - headers[hdr['name']] = hdr['value'] - return headers + headers = {} + for hdr in msg['payload']['headers']: + headers[hdr['name']] = hdr['value'] + return headers def build_service(): - from apiclient.discovery import build - from oauth2client.client import flow_from_clientsecrets - from oauth2client.file import Storage - from oauth2client.tools import run + from apiclient.discovery import build + from oauth2client.client import flow_from_clientsecrets + from oauth2client.file import Storage + from oauth2client.tools import run - OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.modify' - STORAGE = Storage('oauth.storage') + OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.modify' + STORAGE = Storage('oauth.storage') - # Start the OAuth flow to retrieve credentials - flow = flow_from_clientsecrets(config.client_secret_file, scope=OAUTH_SCOPE) - http = httplib2.Http() + # Start the OAuth flow to retrieve credentials + flow = flow_from_clientsecrets(config.client_secret_file, + scope=OAUTH_SCOPE) + http = httplib2.Http() - # Try to retrieve credentials from storage or run the flow to generate them - credentials = STORAGE.get() - if credentials is None or credentials.invalid: - credentials = run(flow, STORAGE, http=http) + # Try to retrieve credentials from storage or run the flow to generate them + credentials = STORAGE.get() + if credentials is None or credentials.invalid: + credentials = run(flow, STORAGE, http=http) - http = credentials.authorize(http) - return build('gmail', 'v1', http=http) + http = credentials.authorize(http) + return build('gmail', 'v1', http=http) def get_all_messages(service, label): - msgs = [] - response = service.users().messages().list( - userId='me', labelIds=label).execute() - if 'messages' in response: - msgs.extend(response['messages']) - while 'nextPageToken' in response: - page_token = response['nextPageToken'] + msgs = [] response = service.users().messages().list( - userId='me', pageToken=page_token).execute() - msgs.extend(response['messages']) - return msgs + userId='me', labelIds=label).execute() + if 'messages' in response: + msgs.extend(response['messages']) + while 'nextPageToken' in response: + page_token = response['nextPageToken'] + response = service.users().messages().list( + userId='me', pageToken=page_token).execute() + msgs.extend(response['messages']) + return msgs def get_body(msg): - if 'attachmentId' in msg['payload']['body']: - raise NotImplementedError('Handling of messages contained in ' - 'attachments not yet implemented.') - b64_body = msg['payload']['body']['data'] - return base64.urlsafe_b64decode(b64_body.encode('ASCII')) + if 'attachmentId' in msg['payload']['body']: + raise NotImplementedError('Handling of messages contained in ' + 'attachments not yet implemented.') + b64_body = msg['payload']['body']['data'] + return base64.urlsafe_b64decode(b64_body.encode('ASCII')) def get_gerrit_info(body): - info = {} - gerrit_pattern = r'^Gerrit-(\S+): (.+)$' - for match in re.finditer(gerrit_pattern, body, flags=re.MULTILINE): - info[match.group(1)] = match.group(2).strip() - return info + info = {} + gerrit_pattern = r'^Gerrit-(\S+): (.+)$' + for match in re.finditer(gerrit_pattern, body, flags=re.MULTILINE): + info[match.group(1)] = match.group(2).strip() + return info def clean_project(gerrit_info, dry_run): - username = config.jenkins_credentials['username'] - password = config.jenkins_credentials['password'] - jenkins_url = config.jenkins_url - jenkins = jenkinsapi.api.Jenkins(jenkins_url, username, password) - - build = 'clean-bionic-presubmit' - if build in jenkins: - if not dry_run: - job = jenkins[build].invoke() - url = job.get_build().baseurl + username = config.jenkins_credentials['username'] + password = config.jenkins_credentials['password'] + jenkins_url = config.jenkins_url + jenkins = jenkinsapi.api.Jenkins(jenkins_url, username, password) + + build = 'clean-bionic-presubmit' + if build in jenkins: + if not dry_run: + job = jenkins[build].invoke() + url = job.get_build().baseurl + else: + url = 'DRY_RUN_URL' + print '{}({}): {} {}'.format( + termcolor.colored('CLEAN', 'green'), + gerrit_info['MessageType'], + build, + url) else: - url = 'DRY_RUN_URL' - print '{}({}): {} {}'.format( - termcolor.colored('CLEAN', 'green'), - gerrit_info['MessageType'], - build, - url) - else: - print '{}({}): {}'.format( - termcolor.colored('CLEAN', 'red'), - gerrit_info['MessageType'], - termcolor.colored(build, 'red')) - return True + print '{}({}): {}'.format( + termcolor.colored('CLEAN', 'red'), + gerrit_info['MessageType'], + termcolor.colored(build, 'red')) + return True def build_project(gerrit_info, dry_run): - project_to_jenkins_map = { - 'platform/bionic': 'bionic-presubmit', - 'platform/build': 'bionic-presubmit', - 'platform/external/jemalloc': 'bionic-presubmit', - 'platform/external/libcxx': 'bionic-presubmit', - 'platform/external/libcxxabi': 'bionic-presubmit', - 'platform/external/compiler-rt': 'bionic-presubmit', - } - - username = config.jenkins_credentials['username'] - password = config.jenkins_credentials['password'] - jenkins_url = config.jenkins_url - jenkins = jenkinsapi.api.Jenkins(jenkins_url, username, password) - - project = gerrit_info['Project'] - change_id = gerrit_info['Change-Id'] - if project in project_to_jenkins_map: - build = project_to_jenkins_map[project] - else: - build = 'bionic-presubmit' - - if build in jenkins: - project_path = '/'.join(project.split('/')[1:]) - if not project_path: - raise RuntimeError('bogus project: {}'.format(project)) - if project_path.startswith('platform/'): - print '{}({}): {} => {}'.format( - termcolor.colored('ERROR', 'red'), - 'project', - project, - project_path) - return False - try: - ref = gerrit.ref_for_change(change_id) - except gerrit.GerritError as ex: - print '{}({}): {} {}'.format( - termcolor.colored('GERRIT-ERROR', 'red'), - ex.code, - change_id, - ex.url) - return False - params = { - 'REF': ref, - 'CHANGE_ID': change_id, - 'PROJECT': project_path + project_to_jenkins_map = { + 'platform/bionic': 'bionic-presubmit', + 'platform/build': 'bionic-presubmit', + 'platform/external/jemalloc': 'bionic-presubmit', + 'platform/external/libcxx': 'bionic-presubmit', + 'platform/external/libcxxabi': 'bionic-presubmit', + 'platform/external/compiler-rt': 'bionic-presubmit', } - if not dry_run: - job = jenkins[build].invoke(build_params=params) - url = job.get_build().baseurl + + username = config.jenkins_credentials['username'] + password = config.jenkins_credentials['password'] + jenkins_url = config.jenkins_url + jenkins = jenkinsapi.api.Jenkins(jenkins_url, username, password) + + project = gerrit_info['Project'] + change_id = gerrit_info['Change-Id'] + if project in project_to_jenkins_map: + build = project_to_jenkins_map[project] else: - url = 'DRY_RUN_URL' - print '{}({}): {} => {} {} {}'.format( - termcolor.colored('BUILD', 'green'), - gerrit_info['MessageType'], - project, - build, - url, - change_id) - else: - print '{}({}): {} => {} {}'.format( - termcolor.colored('BUILD', 'red'), - gerrit_info['MessageType'], - project, - termcolor.colored(build, 'red'), - change_id) - return True + build = 'bionic-presubmit' + + if build in jenkins: + project_path = '/'.join(project.split('/')[1:]) + if not project_path: + raise RuntimeError('bogus project: {}'.format(project)) + if project_path.startswith('platform/'): + print '{}({}): {} => {}'.format( + termcolor.colored('ERROR', 'red'), + 'project', + project, + project_path) + return False + try: + ref = gerrit.ref_for_change(change_id) + except gerrit.GerritError as ex: + print '{}({}): {} {}'.format( + termcolor.colored('GERRIT-ERROR', 'red'), + ex.code, + change_id, + ex.url) + return False + params = { + 'REF': ref, + 'CHANGE_ID': change_id, + 'PROJECT': project_path + } + if not dry_run: + job = jenkins[build].invoke(build_params=params) + url = job.get_build().baseurl + else: + url = 'DRY_RUN_URL' + print '{}({}): {} => {} {} {}'.format( + termcolor.colored('BUILD', 'green'), + gerrit_info['MessageType'], + project, + build, + url, + change_id) + else: + print '{}({}): {} => {} {}'.format( + termcolor.colored('BUILD', 'red'), + gerrit_info['MessageType'], + project, + termcolor.colored(build, 'red'), + change_id) + return True def handle_change(gerrit_info, _, dry_run): - return build_project(gerrit_info, dry_run) + return build_project(gerrit_info, dry_run) handle_newchange = handle_change handle_newpatchset = handle_change def drop_rejection(gerrit_info, dry_run): - request_data = { - 'changeid': gerrit_info['Change-Id'], - 'patchset': gerrit_info['PatchSet'] - } - url = '{}/{}'.format(config.build_listener_url, 'drop-rejection') - headers = {'Content-Type': 'application/json;charset=UTF-8'} - if not dry_run: - try: - requests.post(url, headers=headers, data=json.dumps(request_data)) - except requests.exceptions.ConnectionError as ex: - print '{}(drop-rejection): {}'.format( - termcolor.colored('ERROR', 'red'), ex) - return False - print '{}({}): {}'.format( - termcolor.colored('CHECK', 'green'), - gerrit_info['MessageType'], - gerrit_info['Change-Id']) - return True + request_data = { + 'changeid': gerrit_info['Change-Id'], + 'patchset': gerrit_info['PatchSet'] + } + url = '{}/{}'.format(config.build_listener_url, 'drop-rejection') + headers = {'Content-Type': 'application/json;charset=UTF-8'} + if not dry_run: + try: + requests.post(url, headers=headers, data=json.dumps(request_data)) + except requests.exceptions.ConnectionError as ex: + print '{}(drop-rejection): {}'.format( + termcolor.colored('ERROR', 'red'), ex) + return False + print '{}({}): {}'.format( + termcolor.colored('CHECK', 'green'), + gerrit_info['MessageType'], + gerrit_info['Change-Id']) + return True def handle_comment(gerrit_info, body, dry_run): - if 'Verified+1' in body: - drop_rejection(gerrit_info, dry_run) + if 'Verified+1' in body: + drop_rejection(gerrit_info, dry_run) - command_map = { - 'clean': lambda: clean_project(gerrit_info, dry_run), - 'retry': lambda: build_project(gerrit_info, dry_run), - } + command_map = { + 'clean': lambda: clean_project(gerrit_info, dry_run), + 'retry': lambda: build_project(gerrit_info, dry_run), + } - def handle_unknown_command(): - pass # TODO(danalbert): should complain to the commenter. + def handle_unknown_command(): + pass # TODO(danalbert): should complain to the commenter. - commands = [match.group(1).strip() for match in - re.finditer(r'^bionicbb:\s*(.+)$', body, flags=re.MULTILINE)] + commands = [match.group(1).strip() for match in + re.finditer(r'^bionicbb:\s*(.+)$', body, flags=re.MULTILINE)] - for command in commands: - if command in command_map: - command_map[command]() - else: - handle_unknown_command() + for command in commands: + if command in command_map: + command_map[command]() + else: + handle_unknown_command() - return True + return True def skip_handler(gerrit_info, _, __): - print '{}({}): {}'.format( - termcolor.colored('SKIP', 'yellow'), - gerrit_info['MessageType'], - gerrit_info['Change-Id']) - return True + print '{}({}): {}'.format( + termcolor.colored('SKIP', 'yellow'), + gerrit_info['MessageType'], + gerrit_info['Change-Id']) + return True handle_abandon = skip_handler handle_merged = skip_handler handle_restore = skip_handler @@ -249,62 +263,63 @@ handle_revert = skip_handler def process_message(msg, dry_run): - try: - body = get_body(msg) - gerrit_info = get_gerrit_info(body) - if not gerrit_info: - print termcolor.colored('No info found: {}'.format(msg['id']), 'red') - msg_type = gerrit_info['MessageType'] - handler = 'handle_{}'.format(gerrit_info['MessageType']) - if handler in globals(): - return globals()[handler](gerrit_info, body, dry_run) - else: - print termcolor.colored( - 'MessageType {} unhandled.'.format(msg_type), 'red') - print - return False - except NotImplementedError as ex: - print ex - return False + try: + body = get_body(msg) + gerrit_info = get_gerrit_info(body) + if not gerrit_info: + print termcolor.colored('No info found: {}'.format(msg['id']), + 'red') + msg_type = gerrit_info['MessageType'] + handler = 'handle_{}'.format(gerrit_info['MessageType']) + if handler in globals(): + return globals()[handler](gerrit_info, body, dry_run) + else: + print termcolor.colored( + 'MessageType {} unhandled.'.format(msg_type), 'red') + print + return False + except NotImplementedError as ex: + print ex + return False def main(argc, argv): - dry_run = False - if argc == 2 and argv[1] == '--dry-run': - dry_run = True - elif argc > 2: - sys.exit('usage: python {} [--dry-run]'.format(argv[0])) - - gmail_service = build_service() - msg_service = gmail_service.users().messages() - - while True: - try: - labels = gmail_service.users().labels().list(userId='me').execute() - if not labels['labels']: - raise GmailError('Could not retrieve Gmail labels') - label_id = get_gerrit_label(labels['labels']) - if not label_id: - raise GmailError('Could not find gerrit label') - - for msg in get_all_messages(gmail_service, label_id): - msg = msg_service.get(userId='me', id=msg['id']).execute() - if process_message(msg, dry_run) and not dry_run: - msg_service.trash(userId='me', id=msg['id']).execute() - time.sleep(60 * 5) - except GmailError as ex: - print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex) - time.sleep(60 * 5) - except apiclient.errors.HttpError as ex: - print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex) - time.sleep(60 * 5) - except httplib.BadStatusLine: - pass - except httplib2.ServerNotFoundError: - pass - except socket.error: - pass + dry_run = False + if argc == 2 and argv[1] == '--dry-run': + dry_run = True + elif argc > 2: + sys.exit('usage: python {} [--dry-run]'.format(argv[0])) + + gmail_service = build_service() + msg_service = gmail_service.users().messages() + + while True: + try: + labels = gmail_service.users().labels().list(userId='me').execute() + if not labels['labels']: + raise GmailError('Could not retrieve Gmail labels') + label_id = get_gerrit_label(labels['labels']) + if not label_id: + raise GmailError('Could not find gerrit label') + + for msg in get_all_messages(gmail_service, label_id): + msg = msg_service.get(userId='me', id=msg['id']).execute() + if process_message(msg, dry_run) and not dry_run: + msg_service.trash(userId='me', id=msg['id']).execute() + time.sleep(60 * 5) + except GmailError as ex: + print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex) + time.sleep(60 * 5) + except apiclient.errors.HttpError as ex: + print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex) + time.sleep(60 * 5) + except httplib.BadStatusLine: + pass + except httplib2.ServerNotFoundError: + pass + except socket.error: + pass if __name__ == '__main__': - main(len(sys.argv), sys.argv) + main(len(sys.argv), sys.argv) diff --git a/tools/bionicbb/setup.cfg b/tools/bionicbb/setup.cfg deleted file mode 100644 index 47cd585..0000000 --- a/tools/bionicbb/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[pep8] -ignore = E111 |