Chromium Code Reviews| Index: owners.py |
| diff --git a/owners.py b/owners.py |
| index cc667beea3c575f527470d9bd25269b4e95c6bae..67fbb700145424fb7cc29c9441217720454f5f4f 100644 |
| --- a/owners.py |
| +++ b/owners.py |
| @@ -78,7 +78,7 @@ class SyntaxErrorInOwnersFile(Exception): |
| self.msg = msg |
| def __str__(self): |
| - return "%s:%d syntax error: %s" % (self.path, self.lineno, self.msg) |
| + return '%s:%d syntax error: %s' % (self.path, self.lineno, self.msg) |
| class Database(object): |
| @@ -111,9 +111,12 @@ 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(['']) |
| + self.stop_looking = {''} |
| def reviewers_for(self, files, author): |
| """Returns a suggested set of reviewers that will cover the files. |
| @@ -122,13 +125,13 @@ 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: |
| suggested_owners.remove(EVERYONE) |
| else: |
| - suggested_owners = set(['<anyone>']) |
| + suggested_owners = {'<anyone>'} |
| return suggested_owners |
| def files_not_covered_by(self, files, reviewers): |
| @@ -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,18 +198,28 @@ 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: |
|
M-A Ruel
2013/04/24 18:43:45
if you were using comments as a list, you would ju
Bei Zhang
2013/04/24 20:55:44
I agree that we should use a list instead of strin
|
| + 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 |
| - m = re.match("per-file (.+)=(.+)", line) |
| + m = re.match('per-file (.+)=(.+)', line) |
| if m: |
| glob_string = m.group(1).strip() |
| directive = m.group(2).strip() |
| @@ -217,20 +230,24 @@ class Database(object): |
| line) |
| 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) |
| + self._add_entry(baseline, directive, 'per-file line', |
| + 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): |
| - if directive == "set noparent": |
| + 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: |
|
M-A Ruel
2013/04/24 18:43:45
self.comments.setdefault(directive, {})
Bei Zhang
2013/04/24 20:55:44
Thanks. This looks much better.
|
| + 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: |