Index: presubmit_canned_checks.py |
diff --git a/presubmit_canned_checks.py b/presubmit_canned_checks.py |
index c7c93be6ca5b484d5b70e99a1479bffc73a01d2d..51dfcff37e40cf1ebeff077845fb3b541485675b 100644 |
--- a/presubmit_canned_checks.py |
+++ b/presubmit_canned_checks.py |
@@ -450,17 +450,48 @@ def RunPythonUnitTests(input_api, output_api, unit_tests): |
return [] |
-def RunPylint(input_api, output_api, source_file_filter=None): |
- """Run pylint on python files.""" |
- import warnings |
+def RunPylint(input_api, output_api, white_list=None, black_list=None): |
+ """Run pylint on python files. |
+ |
+ The default white_list enforces looking only a *.py files. |
+ """ |
+ white_list = white_list or ['.*\.py$'] |
+ black_list = black_list or input_api.DEFAULT_BLACK_LIST |
+ |
+ # Only trigger if there is at least one python file affected. |
+ src_filter = lambda x: input_api.FilterSourceFile(x, white_list, black_list) |
+ if not input_api.AffectedSourceFiles(src_filter): |
+ return [] |
+ |
# On certain pylint/python version combination, running pylint throws a lot of |
# warning messages. |
+ import warnings |
warnings.filterwarnings('ignore', category=DeprecationWarning) |
try: |
- if not source_file_filter: |
- source_file_filter = lambda f: f.LocalPath().endswith('.py') |
- files = [f.LocalPath() |
- for f in input_api.AffectedSourceFiles(source_file_filter)] |
+ # We cannot use AffectedFiles here because we want to test every python |
+ # file on each single python change. It's because a change in a python file |
+ # can break another unmodified file. |
+ # Use code similar to InputApi.FilterSourceFile() |
+ def Find(filepath, filters): |
+ for item in filters: |
+ if input_api.re.match(item, filepath): |
+ return True |
+ return False |
+ |
+ import os |
+ files = [] |
+ for dirpath, dirnames, filenames in os.walk(input_api.PresubmitLocalPath()): |
+ # Passes dirnames in black list to speed up search. |
+ for item in dirnames[:]: |
+ if Find(input_api.os_path.join(dirpath, item), black_list): |
+ dirnames.remove(item) |
+ for item in filenames: |
+ filepath = input_api.os_path.join(dirpath, item) |
+ if Find(filepath, white_list) and not Find(filepath, black_list): |
+ files.append(filepath) |
+ |
+ # Now that at least one python file was modified and all the python files |
+ # were listed, try to run pylint. |
try: |
from pylint import lint |
if lint.Run(sorted(files)): |