Index: PRESUBMIT.py |
diff --git a/PRESUBMIT.py b/PRESUBMIT.py |
index 71d6b6f7b3cae6fa4f431a13dbdf18056c335ccf..819c4e64fdcd2c4592c0332f61bd4c1141e1e165 100644 |
--- a/PRESUBMIT.py |
+++ b/PRESUBMIT.py |
@@ -33,9 +33,66 @@ LINT_FILTERS = [ |
'-whitespace/indent', |
] |
+ |
+def _CheckUnwantedDependencies(input_api, output_api): |
+ """Runs checkdeps on #include statements added in this |
+ change. Breaking - rules is an error, breaking ! rules is a |
+ warning. |
+ """ |
+ import sys |
+ # We need to wait until we have an input_api object and use this |
+ # roundabout construct to import checkdeps because this file is |
+ # eval-ed and thus doesn't have __file__. |
+ original_sys_path = sys.path |
+ try: |
+ sys.path = sys.path + [input_api.os_path.join( |
+ input_api.PresubmitLocalPath(), 'buildtools', 'checkdeps')] |
+ import checkdeps |
+ from cpp_checker import CppChecker |
+ from rules import Rule |
+ finally: |
+ # Restore sys.path to what it was before. |
+ sys.path = original_sys_path |
+ |
+ added_includes = [] |
+ for f in input_api.AffectedFiles(): |
+ if not CppChecker.IsCppFile(f.LocalPath()): |
+ continue |
+ |
+ changed_lines = [line for line_num, line in f.ChangedContents()] |
+ added_includes.append([f.LocalPath(), changed_lines]) |
+ |
+ deps_checker = checkdeps.DepsChecker(input_api.PresubmitLocalPath()) |
+ |
+ error_descriptions = [] |
+ warning_descriptions = [] |
+ for path, rule_type, rule_description in deps_checker.CheckAddedCppIncludes( |
+ added_includes): |
+ description_with_path = '%s\n %s' % (path, rule_description) |
+ if rule_type == Rule.DISALLOW: |
+ error_descriptions.append(description_with_path) |
+ else: |
+ warning_descriptions.append(description_with_path) |
+ |
+ results = [] |
+ if error_descriptions: |
+ results.append(output_api.PresubmitError( |
+ 'You added one or more #includes that violate checkdeps rules.', |
+ error_descriptions)) |
+ if warning_descriptions: |
+ results.append(output_api.PresubmitPromptOrNotify( |
+ 'You added one or more #includes of files that are temporarily\n' |
+ 'allowed but being removed. Can you avoid introducing the\n' |
+ '#include? See relevant DEPS file(s) for details and contacts.', |
+ warning_descriptions)) |
+ return results |
+ |
+ |
def CheckChangeOnUpload(input_api, output_api): |
results = [] |
+ results += _CheckUnwantedDependencies(input_api, output_api) |
results += input_api.canned_checks.CheckPatchFormatted(input_api, output_api) |
results += input_api.canned_checks.CheckChangeLintsClean( |
input_api, output_api, None, LINT_FILTERS) |
+ |
return results |