| Index: owners.py
|
| ===================================================================
|
| --- owners.py (revision 125361)
|
| +++ owners.py (working copy)
|
| @@ -75,30 +75,28 @@
|
| self._load_data_needed_for(files)
|
| return self._covering_set_of_owners_for(files)
|
|
|
| - def files_are_covered_by(self, files, reviewers):
|
| - """Returns whether every file is owned by at least one reviewer."""
|
| - return not self.files_not_covered_by(files, reviewers)
|
| + def directories_not_covered_by(self, files, reviewers):
|
| + """Returns the set of directories that are not owned by a reviewer.
|
|
|
| - def files_not_covered_by(self, files, reviewers):
|
| - """Returns the set of files that are not owned by at least one reviewer.
|
| + Determines which of the given files are not owned by at least one of the
|
| + reviewers, then returns a set containing the applicable enclosing
|
| + directories, i.e. the ones upward from the files that have OWNERS files.
|
|
|
| Args:
|
| files is a sequence of paths relative to (and under) self.root.
|
| - reviewers is a sequence of strings matching self.email_regexp."""
|
| + reviewers is a sequence of strings matching self.email_regexp.
|
| + """
|
| self._check_paths(files)
|
| self._check_reviewers(reviewers)
|
| - if not reviewers:
|
| - return files
|
| + self._load_data_needed_for(files)
|
|
|
| - self._load_data_needed_for(files)
|
| - files_by_dir = self._files_by_dir(files)
|
| + dirs = set([self.os_path.dirname(f) for f in files])
|
| covered_dirs = self._dirs_covered_by(reviewers)
|
| - uncovered_files = []
|
| - for d, files_in_d in files_by_dir.iteritems():
|
| - if not self._is_dir_covered_by(d, covered_dirs):
|
| - uncovered_files.extend(files_in_d)
|
| - return set(uncovered_files)
|
| + uncovered_dirs = [self._enclosing_dir_with_owners(d) for d in dirs
|
| + if not self._is_dir_covered_by(d, covered_dirs)]
|
|
|
| + return set(uncovered_dirs)
|
| +
|
| def _check_paths(self, files):
|
| def _is_under(f, pfx):
|
| return self.os_path.abspath(self.os_path.join(pfx, f)).startswith(pfx)
|
| @@ -109,12 +107,6 @@
|
| _assert_is_collection(reviewers)
|
| assert all(self.email_regexp.match(r) for r in reviewers)
|
|
|
| - def _files_by_dir(self, files):
|
| - dirs = {}
|
| - for f in files:
|
| - dirs.setdefault(self.os_path.dirname(f), []).append(f)
|
| - return dirs
|
| -
|
| def _dirs_covered_by(self, reviewers):
|
| dirs = self.owned_by[EVERYONE]
|
| for r in reviewers:
|
| @@ -129,6 +121,15 @@
|
| dirname = self.os_path.dirname(dirname)
|
| return dirname in covered_dirs
|
|
|
| + def _enclosing_dir_with_owners(self, directory):
|
| + """Returns the innermost enclosing directory that has an OWNERS file."""
|
| + dirpath = directory
|
| + while not dirpath in self.owners_for:
|
| + if self._stop_looking(dirpath):
|
| + break
|
| + dirpath = self.os_path.dirname(dirpath)
|
| + return dirpath
|
| +
|
| def _load_data_needed_for(self, files):
|
| for f in files:
|
| dirpath = self.os_path.dirname(f)
|
|
|