Index: owners.py |
=================================================================== |
--- owners.py (revision 125361) |
+++ owners.py (working copy) |
@@ -79,24 +79,40 @@ |
"""Returns whether every file is owned by at least one reviewer.""" |
return not self.files_not_covered_by(files, reviewers) |
- def files_not_covered_by(self, files, reviewers): |
- """Returns the set of files that are not owned by at least one reviewer. |
+ def directories_not_covered_by(self, files, reviewers): |
+ """Returns the set of directories that are not owned by a reviewer. |
+ See files_not_covered_by() for details. |
+ """ |
+ return self.files_not_covered_by(files, reviewers, directories=True) |
+ |
+ def files_not_covered_by(self, files, reviewers, directories=False): |
Dirk Pranke
2012/03/07 21:51:47
With your change in presubmit_canned_checks, I thi
Pam (message me for reviews)
2012/03/07 22:21:11
Done. It slightly changes the special-cased behavi
|
+ """Returns the set of items that are not owned by at least one reviewer. |
+ |
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. |
+ if directories is True, returns a set of directories; otherwise, |
+ returns a set of files. |
+ """ |
self._check_paths(files) |
self._check_reviewers(reviewers) |
- if not reviewers: |
+ if not reviewers and not directories: |
return files |
self._load_data_needed_for(files) |
files_by_dir = self._files_by_dir(files) |
- covered_dirs = self._dirs_covered_by(reviewers) |
+ if reviewers: |
+ covered_dirs = self._dirs_covered_by(reviewers) |
+ else: |
+ covered_dirs = set() |
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) |
+ if directories: |
+ uncovered_files.append(self._enclosing_dir_with_owners(d)) |
+ else: |
+ uncovered_files.extend(files_in_d) |
return set(uncovered_files) |
def _check_paths(self, files): |
@@ -129,6 +145,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) |