| Index: owners.py
|
| diff --git a/owners.py b/owners.py
|
| index cc667beea3c575f527470d9bd25269b4e95c6bae..cb75c6325b00e7032a42aad3310fa1f2792ee860 100644
|
| --- a/owners.py
|
| +++ b/owners.py
|
| @@ -111,6 +111,9 @@ class Database(object):
|
| # Mapping of paths to authorized owners.
|
| self.owners_for = {}
|
|
|
| + # Mapping reviewers to the most recent comment in the OWNERS files.
|
| + self.comments = {}
|
| +
|
| # Set of paths that stop us from looking above them for owners.
|
| # (This is implicitly true for the root directory).
|
| self.stop_looking = set([''])
|
| @@ -122,7 +125,7 @@ class Database(object):
|
| If author is nonempty, we ensure it is not included in the set returned
|
| in order avoid suggesting the author as a reviewer for their own changes."""
|
| self._check_paths(files)
|
| - self._load_data_needed_for(files)
|
| + self.load_data_needed_for(files)
|
| suggested_owners = self._covering_set_of_owners_for(files, author)
|
| if EVERYONE in suggested_owners:
|
| if len(suggested_owners) > 1:
|
| @@ -140,7 +143,7 @@ class Database(object):
|
| """
|
| self._check_paths(files)
|
| self._check_reviewers(reviewers)
|
| - self._load_data_needed_for(files)
|
| + self.load_data_needed_for(files)
|
|
|
| covered_objs = self._objs_covered_by(reviewers)
|
| uncovered_files = [f for f in files
|
| @@ -182,7 +185,7 @@ class Database(object):
|
| dirpath = self.os_path.dirname(dirpath)
|
| return dirpath
|
|
|
| - def _load_data_needed_for(self, files):
|
| + def load_data_needed_for(self, files):
|
| for f in files:
|
| dirpath = self.os_path.dirname(f)
|
| while not dirpath in self.owners_for:
|
| @@ -195,13 +198,23 @@ class Database(object):
|
| owners_path = self.os_path.join(self.root, dirpath, 'OWNERS')
|
| if not self.os_path.exists(owners_path):
|
| return
|
| -
|
| + comment = ""
|
| + last_line_is_comment = False
|
| lineno = 0
|
| for line in self.fopen(owners_path):
|
| lineno += 1
|
| line = line.strip()
|
| - if line.startswith('#') or line == '':
|
| + if line.startswith('#'):
|
| + if last_line_is_comment:
|
| + comment += " " + line[1:].strip()
|
| + else:
|
| + comment = line[1:].strip()
|
| + last_line_is_comment = True
|
| continue
|
| + if line == '':
|
| + continue
|
| + last_line_is_comment = False
|
| +
|
| if line == 'set noparent':
|
| self.stop_looking.add(dirpath)
|
| continue
|
| @@ -218,19 +231,23 @@ class Database(object):
|
| baselines = self.glob(full_glob_string)
|
| for baseline in (self.os_path.relpath(b, self.root) for b in baselines):
|
| self._add_entry(baseline, directive, "per-file line",
|
| - owners_path, lineno)
|
| + owners_path, lineno, comment)
|
| continue
|
|
|
| if line.startswith('set '):
|
| raise SyntaxErrorInOwnersFile(owners_path, lineno,
|
| 'unknown option: "%s"' % line[4:].strip())
|
|
|
| - self._add_entry(dirpath, line, "line", owners_path, lineno)
|
| + self._add_entry(dirpath, line, "line", owners_path, lineno, comment)
|
|
|
| - def _add_entry(self, path, directive, line_type, owners_path, lineno):
|
| + def _add_entry(self, path, directive,
|
| + line_type, owners_path, lineno, comment):
|
| if directive == "set noparent":
|
| self.stop_looking.add(path)
|
| elif self.email_regexp.match(directive) or directive == EVERYONE:
|
| + if directive not in self.comments:
|
| + self.comments[directive] = {}
|
| + self.comments[directive][path] = comment
|
| self.owned_by.setdefault(directive, set()).add(path)
|
| self.owners_for.setdefault(path, set()).add(directive)
|
| else:
|
|
|