Index: PRESUBMIT.py |
diff --git a/PRESUBMIT.py b/PRESUBMIT.py |
index 9d1e9badc73671cc5d333ad712e6a6638a173628..dc8cb77c0c002e829c005b65920efb07802d01ea 100644 |
--- a/PRESUBMIT.py |
+++ b/PRESUBMIT.py |
@@ -9,9 +9,11 @@ See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts |
for more details about the presubmit API built into gcl. |
""" |
+import fnmatch |
import os |
import re |
import sys |
+import traceback |
REVERT_CL_SUBJECT_PREFIX = 'Revert ' |
@@ -25,6 +27,8 @@ PUBLIC_API_OWNERS = ( |
'bsalomon@google.com', |
) |
+AUTHORS_FILE_NAME = 'AUTHORS' |
+ |
def _CheckChangeHasEol(input_api, output_api, source_file_filter=None): |
"""Checks that files end with atleast one \n (LF).""" |
@@ -106,6 +110,48 @@ def _CheckTreeStatus(input_api, output_api, json_url): |
return tree_status_results |
+def _CheckOwnerIsInAuthorsFile(input_api, output_api): |
+ results = [] |
+ issue = input_api.change.issue |
+ if issue and input_api.rietveld: |
+ issue_properties = input_api.rietveld.get_issue_properties( |
+ issue=int(issue), messages=False) |
+ owner_email = issue_properties['owner_email'] |
+ |
+ try: |
+ authors_content = '' |
+ for line in open(AUTHORS_FILE_NAME): |
+ if not line.startswith('#'): |
+ authors_content += line |
+ email_fnmatches = re.findall('<(.*)>', authors_content) |
+ for email_fnmatch in email_fnmatches: |
+ if fnmatch.fnmatch(owner_email, email_fnmatch): |
+ # Found a match, the user is in the AUTHORS file break out of the loop |
+ break |
+ else: |
+ # TODO(rmistry): Remove the below CLA messaging once a CLA checker has |
+ # been added to the CQ. |
+ results.append( |
+ output_api.PresubmitError( |
+ 'The email %s is not in Skia\'s AUTHORS file.\n' |
+ 'Issue owner, this CL must include an addition to the Skia AUTHORS ' |
+ 'file.\n' |
+ 'Googler reviewers, please check that the AUTHORS entry ' |
+ 'corresponds to an email address in http://goto/cla-signers. If it ' |
+ 'does not then ask the issue owner to sign the CLA at ' |
+ 'https://developers.google.com/open-source/cla/individual ' |
+ '(individual) or ' |
+ 'https://developers.google.com/open-source/cla/corporate ' |
+ '(corporate).' |
+ % owner_email)) |
+ except IOError: |
+ # Do not fail if authors file cannot be found. |
+ traceback.print_exc() |
+ input_api.logging.error('AUTHORS file not found!') |
+ |
+ return results |
+ |
+ |
def _CheckLGTMsForPublicAPI(input_api, output_api): |
"""Check LGTMs for public API changes. |
@@ -168,4 +214,5 @@ def CheckChangeOnCommit(input_api, output_api): |
_CheckTreeStatus(input_api, output_api, json_url=( |
SKIA_TREE_STATUS_URL + '/banner-status?format=json'))) |
results.extend(_CheckLGTMsForPublicAPI(input_api, output_api)) |
+ results.extend(_CheckOwnerIsInAuthorsFile(input_api, output_api)) |
return results |