| Index: owners.py
|
| diff --git a/owners.py b/owners.py
|
| index 78c7cca9cb7e6d9385fd954ce3512ce13ffd2da6..b97405926fed138561d3cdbee2ee8b14e4345e47 100644
|
| --- a/owners.py
|
| +++ b/owners.py
|
| @@ -118,6 +118,9 @@ class Database(object):
|
| # Mapping reviewers to the preceding comment per file in the OWNERS files.
|
| self.comments = {}
|
|
|
| + # Cache of compiled regexes for _fnmatch()
|
| + self._fnmatch_cache = {}
|
| +
|
| # Set of paths that stop us from looking above them for owners.
|
| # (This is implicitly true for the root directory).
|
| self._stop_looking = set([''])
|
| @@ -197,13 +200,13 @@ class Database(object):
|
| dirpath = self.os_path.dirname(dirpath)
|
|
|
| def _should_stop_looking(self, objname):
|
| - return any(fnmatch.fnmatch(objname, stop_looking)
|
| + return any(self._fnmatch(objname, stop_looking)
|
| for stop_looking in self._stop_looking)
|
|
|
| def _owners_for(self, objname):
|
| obj_owners = set()
|
| for owned_path, path_owners in self._paths_to_owners.iteritems():
|
| - if fnmatch.fnmatch(objname, owned_path):
|
| + if self._fnmatch(objname, owned_path):
|
| obj_owners |= path_owners
|
| return obj_owners
|
|
|
| @@ -339,6 +342,14 @@ class Database(object):
|
| distance += 1
|
| return all_possible_owners
|
|
|
| + def _fnmatch(self, filename, pattern):
|
| + """Same as fnmatch.fnmatch(), but interally caches the compiled regexes."""
|
| + matcher = self._fnmatch_cache.get(pattern)
|
| + if matcher is None:
|
| + matcher = re.compile(fnmatch.translate(pattern)).match
|
| + self._fnmatch_cache[pattern] = matcher
|
| + return matcher(filename)
|
| +
|
| @staticmethod
|
| def total_costs_by_owner(all_possible_owners, dirs):
|
| # We want to minimize both the number of reviewers and the distance
|
|
|