Chromium Code Reviews| 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) |