Index: tools/presubmit.py |
diff --git a/tools/presubmit.py b/tools/presubmit.py |
index f9ae2bdea465846fe8212d9bd568844ca3de9f57..553a5ae364152063391c04c6d879789664df205f 100755 |
--- a/tools/presubmit.py |
+++ b/tools/presubmit.py |
@@ -71,6 +71,8 @@ LINT_RULES = """ |
LINT_OUTPUT_PATTERN = re.compile(r'^.+[:(]\d+[:)]|^Done processing') |
FLAGS_LINE = re.compile("//\s*Flags:.*--([A-z0-9-])+_[A-z0-9].*\n") |
+TOOLS_PATH = dirname(abspath(__file__)) |
+ |
def CppLintWorker(command): |
try: |
process = subprocess.Popen(command, stderr=subprocess.PIPE) |
@@ -156,13 +158,34 @@ class SourceFileProcessor(object): |
files and invoke a custom check on the files. |
""" |
- def Run(self, path): |
+ def RunOnPath(self, path): |
+ """Runs processor on all files under the given path.""" |
+ |
all_files = [] |
for file in self.GetPathsToSearch(): |
all_files += self.FindFilesIn(join(path, file)) |
- if not self.ProcessFiles(all_files, path): |
- return False |
- return True |
+ return self.ProcessFiles(all_files) |
+ |
+ def RunOnFiles(self, files): |
+ """Runs processor only on affected files.""" |
+ |
+ # Helper for getting directory pieces. |
+ dirs = lambda f: dirname(f).split(os.sep) |
+ |
+ # Path offsets where to look (to be in sync with RunOnPath). |
+ # Normalize '.' to check for it with str.startswith. |
+ search_paths = [('' if p == '.' else p) for p in self.GetPathsToSearch()] |
+ |
+ all_files = [ |
+ f.AbsoluteLocalPath() |
+ for f in files |
+ if (not self.IgnoreFile(f.LocalPath()) and |
+ self.IsRelevant(f.LocalPath()) and |
+ all(not self.IgnoreDir(d) for d in dirs(f.LocalPath())) and |
+ any(map(f.LocalPath().startswith, search_paths))) |
+ ] |
+ |
+ return self.ProcessFiles(all_files) |
def IgnoreDir(self, name): |
return (name.startswith('.') or |
@@ -214,7 +237,7 @@ class CppLintProcessor(SourceFileProcessor): |
return None |
- def ProcessFiles(self, files, path): |
+ def ProcessFiles(self, files): |
good_files_cache = FileContentsCache('.cpplint-cache') |
good_files_cache.Load() |
files = good_files_cache.FilterUnchangedFiles(files) |
@@ -224,7 +247,7 @@ class CppLintProcessor(SourceFileProcessor): |
filters = ",".join([n for n in LINT_RULES]) |
command = [sys.executable, 'cpplint.py', '--filter', filters] |
- cpplint = self.GetCpplintScript(join(path, "tools")) |
+ cpplint = self.GetCpplintScript(TOOLS_PATH) |
if cpplint is None: |
print('Could not find cpplint.py. Make sure ' |
'depot_tools is installed and in the path.') |
@@ -381,7 +404,7 @@ class SourceProcessor(SourceFileProcessor): |
result = False |
return result |
- def ProcessFiles(self, files, path): |
+ def ProcessFiles(self, files): |
success = True |
violations = 0 |
for file in files: |
@@ -492,10 +515,10 @@ def Main(): |
success = True |
print "Running C++ lint check..." |
if not options.no_lint: |
- success &= CppLintProcessor().Run(workspace) |
+ success &= CppLintProcessor().RunOnPath(workspace) |
print "Running copyright header, trailing whitespaces and " \ |
"two empty lines between declarations check..." |
- success &= SourceProcessor().Run(workspace) |
+ success &= SourceProcessor().RunOnPath(workspace) |
success &= CheckStatusFiles(workspace) |
if success: |
return 0 |