Index: presubmit_canned_checks.py |
=================================================================== |
--- presubmit_canned_checks.py (revision 125361) |
+++ presubmit_canned_checks.py (working copy) |
@@ -729,47 +729,62 @@ |
def CheckOwners(input_api, output_api, source_file_filter=None): |
- if not input_api.is_committing: |
- return [] |
- if input_api.tbr: |
- return [output_api.PresubmitNotifyResult( |
- '--tbr was specified, skipping OWNERS check')] |
- if not input_api.change.issue: |
- return [output_api.PresubmitError( |
- "OWNERS check failed: this change has no Rietveld issue number, so " |
- "we can't check it for approvals.")] |
+ if input_api.is_committing: |
+ if input_api.tbr: |
+ return [output_api.PresubmitNotifyResult( |
+ '--tbr was specified, skipping OWNERS check')] |
+ if not input_api.change.issue: |
+ return [output_api.PresubmitError("OWNERS check failed: this change has " |
+ "no Rietveld issue number, so we can't check it for approvals.")] |
+ needed = 'LGTM from an OWNER' |
+ output = output_api.PresubmitError |
+ else: |
+ needed = 'OWNER reviewers' |
+ output = output_api.PresubmitNotifyResult |
affected_files = set([f.LocalPath() for f in |
input_api.change.AffectedFiles(file_filter=source_file_filter)]) |
owners_db = input_api.owners_db |
- owner_email, approvers = _RietveldOwnerAndApprovers(input_api, |
- owners_db.email_regexp) |
- if not owner_email: |
+ owner_email, reviewers = _RietveldOwnerAndReviewers( |
+ input_api, |
+ owners_db.email_regexp, |
+ approval_needed=input_api.is_committing) |
+ |
+ if owner_email: |
+ reviewers_plus_owner = reviewers.union(set([owner_email])) |
+ elif input_api.is_committing: |
return [output_api.PresubmitWarning( |
'The issue was not uploaded so you have no OWNER approval.')] |
+ else: |
+ owner_email = '' |
+ reviewers_plus_owner = set() |
- approvers_plus_owner = approvers.union(set([owner_email])) |
+ missing_directories = owners_db.directories_not_covered_by(affected_files, |
+ reviewers_plus_owner) |
+ if missing_directories: |
+ return [output('Missing %s for files in these directories:\n %s' % |
+ (needed, '\n '.join(missing_directories)))] |
- missing_files = owners_db.files_not_covered_by(affected_files, |
- approvers_plus_owner) |
- if missing_files: |
- return [output_api.PresubmitError('Missing LGTM from an OWNER for: %s' % |
- ','.join(missing_files))] |
- |
- if not approvers: |
- return [output_api.PresubmitError('Missing LGTM from someone other than %s' |
- % owner_email)] |
+ if input_api.is_committing and not reviewers: |
+ return [output('Missing LGTM from someone other than %s' % owner_email)] |
return [] |
-def _RietveldOwnerAndApprovers(input_api, email_regexp): |
- """Return the owner and approvers of a change, if any.""" |
+def _RietveldOwnerAndReviewers(input_api, email_regexp, approval_needed=False): |
+ """Return the owner and reviewers of a change, if any. |
+ |
+ If approval_needed is True, only reviewers who have approved the change |
+ will be returned. |
+ """ |
if not input_api.change.issue: |
return None, None |
issue_props = input_api.rietveld.get_issue_properties( |
int(input_api.change.issue), True) |
+ if not approval_needed: |
+ return issue_props['owner_email'], set(issue_props['reviewers']) |
+ |
owner_email = issue_props['owner_email'] |
def match_reviewer(r): |