| OLD | NEW | 
|---|
| 1 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be | 
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. | 
| 4 | 4 | 
| 5 """A database of OWNERS files.""" | 5 """A database of OWNERS files.""" | 
| 6 | 6 | 
| 7 import collections | 7 import collections | 
| 8 import re | 8 import re | 
| 9 | 9 | 
| 10 | 10 | 
| 11 # If this is present by itself on a line, this means that everyone can review. | 11 # If this is present by itself on a line, this means that everyone can review. | 
| 12 EVERYONE = '*' | 12 EVERYONE = '*' | 
| 13 | 13 | 
| 14 | 14 | 
| 15 # Recognizes 'X@Y' email addresses. Very simplistic. | 15 # Recognizes 'X@Y' email addresses. Very simplistic. | 
| 16 BASIC_EMAIL_REGEXP = r'^[\w\-\+\%\.]+\@[\w\-\+\%\.]+$' | 16 BASIC_EMAIL_REGEXP = r'^[\w\-\+\%\.]+\@[\w\-\+\%\.]+$' | 
| 17 | 17 | 
| 18 | 18 | 
| 19 def _assert_is_collection(obj): | 19 def _assert_is_collection(obj): | 
| 20   assert (isinstance(obj, collections.Iterable) and | 20   assert not isinstance(obj, basestring) | 
| 21           isinstance(obj, collections.Sized) and | 21   if hasattr(collections, 'Iterable') and hasattr(collections, 'Sized'): | 
| 22           not isinstance(obj, basestring)) | 22     assert (isinstance(obj, collections.Iterable) and | 
|  | 23             isinstance(obj, collections.Sized)) | 
| 23 | 24 | 
| 24 | 25 | 
| 25 class SyntaxErrorInOwnersFile(Exception): | 26 class SyntaxErrorInOwnersFile(Exception): | 
| 26   def __init__(self, path, lineno, msg): | 27   def __init__(self, path, lineno, msg): | 
| 27     super(SyntaxErrorInOwnersFile, self).__init__((path, lineno, msg)) | 28     super(SyntaxErrorInOwnersFile, self).__init__((path, lineno, msg)) | 
| 28     self.path = path | 29     self.path = path | 
| 29     self.lineno = lineno | 30     self.lineno = lineno | 
| 30     self.msg = msg | 31     self.msg = msg | 
| 31 | 32 | 
| 32   def __str__(self): | 33   def __str__(self): | 
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 166     # short combinations of owners. | 167     # short combinations of owners. | 
| 167     every_owner = set() | 168     every_owner = set() | 
| 168     for f in files: | 169     for f in files: | 
| 169       dirname = self.os_path.dirname(f) | 170       dirname = self.os_path.dirname(f) | 
| 170       while dirname in self.owners_for: | 171       while dirname in self.owners_for: | 
| 171         every_owner |= self.owners_for[dirname] | 172         every_owner |= self.owners_for[dirname] | 
| 172         if self._stop_looking(dirname): | 173         if self._stop_looking(dirname): | 
| 173           break | 174           break | 
| 174         dirname = self.os_path.dirname(dirname) | 175         dirname = self.os_path.dirname(dirname) | 
| 175     return every_owner | 176     return every_owner | 
| OLD | NEW | 
|---|