Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1734)

Unified Diff: owners.py

Issue 9621012: Show a list of directories missing OWNER reviewers on upload, and show directories rather than file… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools/
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | presubmit_canned_checks.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « no previous file | presubmit_canned_checks.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698