From 02d4b82580618083ee9bd4412b6365f973e7b4a0 Mon Sep 17 00:00:00 2001 From: Edward Lesmes Date: Wed, 11 Nov 2020 00:37:35 +0000 Subject: [PATCH] [presubmit][owners] Skip owners check when Bot-Review is +1 Add support for Bot-Review label to allow trusted bots to bypass owners checks. Bug: 1093627 Change-Id: Ie7398041e9e32fd87bb415b239b5ec0a4740e1ec Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/2530516 Commit-Queue: Edward Lesmes Reviewed-by: Yulan Lin --- presubmit_canned_checks.py | 5 +++++ presubmit_support.py | 22 ++++++++++++++-------- tests/presubmit_unittest.py | 27 +++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/presubmit_canned_checks.py b/presubmit_canned_checks.py index 50d3f7a11d..f5d724e98d 100644 --- a/presubmit_canned_checks.py +++ b/presubmit_canned_checks.py @@ -1122,6 +1122,11 @@ def CheckOwnersFormat(input_api, output_api): def CheckOwners(input_api, output_api, source_file_filter=None): + # Skip OWNERS check when Bot-Commit label is approved. + if (input_api.change.issue + and input_api.gerrit.IsBotCommitApproved(input_api.change.issue)): + return [] + affected_files = set([f.LocalPath() for f in input_api.change.AffectedFiles(file_filter=source_file_filter)]) owners_db = input_api.owners_db diff --git a/presubmit_support.py b/presubmit_support.py index 8b006af7c2..c84933151a 100755 --- a/presubmit_support.py +++ b/presubmit_support.py @@ -433,20 +433,26 @@ class GerritAccessor(object): ref = 'refs/heads/%s' % ref return ref + def _GetApproversForLabel(self, issue, label): + change_info = self.GetChangeInfo(issue) + label_info = change_info.get('labels', {}).get(label, {}) + values = label_info.get('values', {}).keys() + if not values: + return [] + max_value = max(int(v) for v in values) + return [v for v in label_info.get('all', []) + if v.get('value', 0) == max_value] + + def IsBotCommitApproved(self, issue): + return bool(self._GetApproversForLabel(issue, 'Bot-Commit')) + def GetChangeOwner(self, issue): return self.GetChangeInfo(issue)['owner']['email'] def GetChangeReviewers(self, issue, approving_only=True): changeinfo = self.GetChangeInfo(issue) if approving_only: - labelinfo = changeinfo.get('labels', {}).get('Code-Review', {}) - values = labelinfo.get('values', {}).keys() - try: - max_value = max(int(v) for v in values) - reviewers = [r for r in labelinfo.get('all', []) - if r.get('value', 0) == max_value] - except ValueError: # values is the empty list - reviewers = [] + reviewers = self._GetApproversForLabel(issue, 'Code-Review') else: reviewers = changeinfo.get('reviewers', {}).get('REVIEWER', []) return [r.get('email') for r in reviewers] diff --git a/tests/presubmit_unittest.py b/tests/presubmit_unittest.py index fa538995b4..f5213c6ff2 100755 --- a/tests/presubmit_unittest.py +++ b/tests/presubmit_unittest.py @@ -2751,6 +2751,33 @@ the current line as well! response=response, expected_output='') + def testCannedCheckOwners_BotCommit(self): + response = { + "owner": {"email": "john@example.com"}, + "labels": {"Bot-Commit": { + u'all': [ + { + u'email': u'bot@example.com', + u'value': 1 + }, + ], + u'approved': {u'email': u'bot@example.org'}, + u'default_value': 0, + u'values': {u' 0': u'No score', + u'+1': u'Looks good to me'}, + }}, + "reviewers": {"REVIEWER": [{u'email': u'bot@example.com'}]}, + } + self.AssertOwnersWorks(approvers=set(), + response=response, + is_committing=True, + expected_output='') + + self.AssertOwnersWorks(approvers=set(), + is_committing=False, + response=response, + expected_output='') + def testCannedCheckOwners_Approved(self): response = { "owner": {"email": "john@example.com"},