| Index: owners.py
|
| diff --git a/owners.py b/owners.py
|
| index d8692c362b32415a30e3fb4dcd9d58b99605d51c..a7067cba4e9915413572616645eb1b45d0703abc 100644
|
| --- a/owners.py
|
| +++ b/owners.py
|
| @@ -165,15 +165,56 @@ class Database(object):
|
| 'or an email address: "%s"' % line))
|
|
|
| def _covering_set_of_owners_for(self, files):
|
| - # TODO(dpranke): implement the greedy algorithm for covering sets, and
|
| - # consider returning multiple options in case there are several equally
|
| - # short combinations of owners.
|
| - every_owner = set()
|
| + # Get the set of directories from the files.
|
| + dirs = set()
|
| for f in files:
|
| - dirname = self.os_path.dirname(f)
|
| + dirs.add(self.os_path.dirname(f))
|
| +
|
| + owned_dirs = {}
|
| + dir_owners = {}
|
| +
|
| + for current_dir in dirs:
|
| + # Get the list of owners for each directory.
|
| + current_owners = set()
|
| + dirname = current_dir
|
| while dirname in self.owners_for:
|
| - every_owner |= self.owners_for[dirname]
|
| + for owner in self.owners_for[dirname]:
|
| + current_owners.add(owner)
|
| if self._stop_looking(dirname):
|
| break
|
| dirname = self.os_path.dirname(dirname)
|
| - return every_owner
|
| +
|
| + # Map each directory to a list of its owners.
|
| + dir_owners[current_dir] = current_owners
|
| +
|
| + # Add the directory to the list of each owner.
|
| + for owner in current_owners:
|
| + if not owner in owned_dirs:
|
| + owned_dirs[owner] = set()
|
| + owned_dirs[owner].add(current_dir)
|
| +
|
| + final_owners = set()
|
| + while dirs:
|
| + # Find the owner that has the most directories.
|
| + max_count = 0
|
| + max_owner = None
|
| + owner_count = {}
|
| + for dirname in dirs:
|
| + for owner in dir_owners[dirname]:
|
| + count = owner_count.get(owner, 0) + 1
|
| + owner_count[owner] = count
|
| + if count >= max_count:
|
| + max_owner = owner
|
| +
|
| + # If no more directories have OWNERS, we're done.
|
| + if not max_owner:
|
| + break
|
| +
|
| + final_owners.add(max_owner)
|
| +
|
| + # Remove all directories owned by the current owner from the remaining
|
| + # list.
|
| + for dirname in owned_dirs[max_owner]:
|
| + dirs.remove(dirname)
|
| +
|
| + return final_owners
|
|
|