| Index: commit-queue/verification/reviewer_lgtm.py
|
| ===================================================================
|
| --- commit-queue/verification/reviewer_lgtm.py (revision 249146)
|
| +++ commit-queue/verification/reviewer_lgtm.py (working copy)
|
| @@ -1,95 +0,0 @@
|
| -# coding=utf8
|
| -# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -"""Look for a LGTM in the messages from a valid reviewer."""
|
| -
|
| -import logging
|
| -import re
|
| -
|
| -from verification import base
|
| -
|
| -
|
| -def _regexp_check(value, whitelist, blacklist):
|
| - """Returns True if value passes whitelist and not blacklist.
|
| -
|
| - Both whitelist and blacklist are a list of regexp strings.
|
| - """
|
| - def match(value, checklist):
|
| - return any(re.match(i, value) for i in checklist)
|
| - return match(value, whitelist) and not match(value, blacklist)
|
| -
|
| -
|
| -class LgtmStatus(base.SimpleStatus):
|
| - NO_COMMENT = 'No comments yet.'
|
| - NO_LGTM = (
|
| - 'No LGTM from a valid reviewer yet. Only full committers are accepted.\n'
|
| - 'Even if an LGTM may have been provided, it was from a non-committer or\n'
|
| - 'a lowly provisional committer, _not_ a full super star committer.\n'
|
| - 'See http://www.chromium.org/getting-involved/become-a-committer\n'
|
| - 'Note that this has nothing to do with OWNERS files.')
|
| -
|
| - def __init__(self, pending=None, whitelist=None, blacklist=None, **kwargs):
|
| - super(LgtmStatus, self).__init__(**kwargs)
|
| - # Can't save 'pending' reference here but postpone() will need it as a
|
| - # parameter.
|
| - if pending:
|
| - self._check(pending, whitelist, blacklist)
|
| -
|
| - def _check(self, pending, whitelist, blacklist):
|
| - """Updates self.state and self.error_message properties."""
|
| - # The owner cannot be a reviewer.
|
| - blacklist_owner = blacklist + [re.escape(pending.owner)]
|
| -
|
| - if self._is_tbr(pending):
|
| - logging.debug('Change %s is TBR' % pending.issue)
|
| - if _regexp_check(pending.owner, whitelist, blacklist):
|
| - # TBR changes from a committer are fine.
|
| - self.state = base.SUCCEEDED
|
| - return
|
| -
|
| - if not pending.messages:
|
| - self.error_message = self.NO_COMMENT
|
| - self.state = base.FAILED
|
| - return
|
| -
|
| - def match_reviewer(r):
|
| - return _regexp_check(r, whitelist, blacklist_owner)
|
| -
|
| - for i in pending.messages:
|
| - if i['approval'] and match_reviewer(i['sender']):
|
| - logging.info('Found lgtm by %s' % i['sender'])
|
| - self.state = base.SUCCEEDED
|
| - return
|
| -
|
| - # TODO: Force a refresh of the meta data and use postpone() instead of
|
| - # bailing out if there is a valid reviewer that hasn't replied yet.
|
| - self.error_message = self.NO_LGTM
|
| - self.state = base.FAILED
|
| -
|
| - @staticmethod
|
| - def _is_tbr(pending):
|
| - """Returns True if a description contains TBR=.
|
| -
|
| - This function should be moved elsewhere.
|
| - """
|
| - return bool(re.search(r'^TBR=.*$', pending.description, re.MULTILINE))
|
| -
|
| -
|
| -class ReviewerLgtmVerifier(base.Verifier):
|
| - """Needs at least one reviewer matching at least one regexp in
|
| - self.reviewers that is not also the owner of the issue.
|
| - """
|
| - name = 'reviewer_lgtm'
|
| -
|
| - def __init__(self, whitelist, blacklist):
|
| - super(ReviewerLgtmVerifier, self).__init__()
|
| - self.whitelist = whitelist
|
| - self.blacklist = blacklist
|
| -
|
| - def verify(self, pending):
|
| - pending.verifications[self.name] = LgtmStatus(
|
| - pending=pending, whitelist=self.whitelist, blacklist=self.blacklist)
|
| -
|
| - def update_status(self, queue):
|
| - pass
|
|
|