| Index: presubmit_support.py
|
| ===================================================================
|
| --- presubmit_support.py (revision 17559)
|
| +++ presubmit_support.py (working copy)
|
| @@ -230,9 +230,8 @@
|
| dir_with_slash = normpath("%s/" % self.PresubmitLocalPath())
|
| if len(dir_with_slash) == 1:
|
| dir_with_slash = ''
|
| - return filter(
|
| - lambda x: normpath(x.AbsoluteLocalPath()).startswith(dir_with_slash),
|
| - self.change.AffectedFiles(include_dirs, include_deletes))
|
| + return filter(lambda x: normpath(x.LocalPath()).startswith(dir_with_slash),
|
| + self.change.AffectedFiles(include_dirs, include_deletes))
|
|
|
| def LocalPaths(self, include_dirs=False):
|
| """Returns local paths of input_api.AffectedFiles()."""
|
| @@ -549,29 +548,33 @@
|
| self.AffectedFiles(include_deletes=False)))
|
|
|
|
|
| -def ListRelevantPresubmitFiles(files, root):
|
| +def ListRelevantPresubmitFiles(files):
|
| """Finds all presubmit files that apply to a given set of source files.
|
|
|
| Args:
|
| files: An iterable container containing file paths.
|
| - root: Path where to stop searching.
|
|
|
| Return:
|
| - List of absolute paths of the existing PRESUBMIT.py scripts.
|
| + ['foo/blat/PRESUBMIT.py', 'mat/gat/PRESUBMIT.py']
|
| """
|
| - entries = []
|
| - for f in files:
|
| - f = normpath(os.path.join(root, f))
|
| - while f:
|
| - f = os.path.dirname(f)
|
| - if f in entries:
|
| + checked_dirs = {} # Keys are directory paths, values are ignored.
|
| + source_dirs = [os.path.dirname(f) for f in files]
|
| + presubmit_files = []
|
| + for dir in source_dirs:
|
| + while (True):
|
| + if dir in checked_dirs:
|
| + break # We've already walked up from this directory.
|
| +
|
| + test_path = os.path.join(dir, 'PRESUBMIT.py')
|
| + if os.path.isfile(test_path):
|
| + presubmit_files.append(normpath(test_path))
|
| +
|
| + checked_dirs[dir] = ''
|
| + if dir in ['', '.']:
|
| break
|
| - entries.append(f)
|
| - if f == root:
|
| - break
|
| - entries.sort()
|
| - entries = map(lambda x: os.path.join(x, 'PRESUBMIT.py'), entries)
|
| - return filter(lambda x: os.path.isfile(x), entries)
|
| + else:
|
| + dir = os.path.dirname(dir)
|
| + return presubmit_files
|
|
|
|
|
| class PresubmitExecuter(object):
|
| @@ -650,9 +653,7 @@
|
| Return:
|
| True if execution can continue, False if not.
|
| """
|
| - checkout_root = gcl.GetRepositoryRoot()
|
| - presubmit_files = ListRelevantPresubmitFiles(change_info.FileList(),
|
| - checkout_root)
|
| + presubmit_files = ListRelevantPresubmitFiles(change_info.FileList())
|
| if not presubmit_files and verbose:
|
| output_stream.write("Warning, no presubmit.py found.\n")
|
| results = []
|
| @@ -660,8 +661,7 @@
|
| if default_presubmit:
|
| if verbose:
|
| output_stream.write("Running default presubmit script.\n")
|
| - fake_path = os.path.join(checkout_root, 'PRESUBMIT.py')
|
| - results += executer.ExecPresubmitScript(default_presubmit, fake_path)
|
| + results += executer.ExecPresubmitScript(default_presubmit, 'PRESUBMIT.py')
|
| for filename in presubmit_files:
|
| filename = os.path.abspath(filename)
|
| if verbose:
|
|
|