Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(491)

Side by Side Diff: owners.py

Issue 11867016: handle OWNERS suggestions where anyone can approve better. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tests/owners_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2012 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 OWNERS files indicate who is allowed to approve changes in a specific directory 7 OWNERS files indicate who is allowed to approve changes in a specific directory
8 (or who is allowed to make changes without needing approval of another OWNER). 8 (or who is allowed to make changes without needing approval of another OWNER).
9 Note that all changes must still be reviewed by someone familiar with the code, 9 Note that all changes must still be reviewed by someone familiar with the code,
10 so you may need approval from both an OWNER and a reviewer in many cases. 10 so you may need approval from both an OWNER and a reviewer in many cases.
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 # Set of paths that stop us from looking above them for owners. 114 # Set of paths that stop us from looking above them for owners.
115 # (This is implicitly true for the root directory). 115 # (This is implicitly true for the root directory).
116 self.stop_looking = set(['']) 116 self.stop_looking = set([''])
117 117
118 def reviewers_for(self, files): 118 def reviewers_for(self, files):
119 """Returns a suggested set of reviewers that will cover the files. 119 """Returns a suggested set of reviewers that will cover the files.
120 120
121 files is a sequence of paths relative to (and under) self.root.""" 121 files is a sequence of paths relative to (and under) self.root."""
122 self._check_paths(files) 122 self._check_paths(files)
123 self._load_data_needed_for(files) 123 self._load_data_needed_for(files)
124 return self._covering_set_of_owners_for(files) 124 suggested_owners = self._covering_set_of_owners_for(files)
125 if EVERYONE in suggested_owners:
126 if len(suggested_owners) > 1:
127 suggested_owners.remove(EVERYONE)
128 else:
129 suggested_owners = set(['<anyone>'])
130 return suggested_owners
125 131
126 # TODO(dpranke): rename to objects_not_covered_by 132 # TODO(dpranke): rename to objects_not_covered_by
127 def directories_not_covered_by(self, files, reviewers): 133 def directories_not_covered_by(self, files, reviewers):
128 """Returns the set of directories that are not owned by a reviewer. 134 """Returns the set of directories that are not owned by a reviewer.
129 135
130 Determines which of the given files are not owned by at least one of the 136 Determines which of the given files are not owned by at least one of the
131 reviewers, then returns a set containing the applicable enclosing 137 reviewers, then returns a set containing the applicable enclosing
132 directories, i.e. the ones upward from the files that have OWNERS files. 138 directories, i.e. the ones upward from the files that have OWNERS files.
133 139
134 Args: 140 Args:
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 if num_directories_owned: 309 if num_directories_owned:
304 total_costs_by_owner[owner] = (total_distance / 310 total_costs_by_owner[owner] = (total_distance /
305 pow(num_directories_owned, 1.75)) 311 pow(num_directories_owned, 1.75))
306 312
307 # Return the lowest cost owner. In the case of a tie, pick one randomly. 313 # Return the lowest cost owner. In the case of a tie, pick one randomly.
308 lowest_cost = min(total_costs_by_owner.itervalues()) 314 lowest_cost = min(total_costs_by_owner.itervalues())
309 lowest_cost_owners = filter( 315 lowest_cost_owners = filter(
310 lambda owner: total_costs_by_owner[owner] == lowest_cost, 316 lambda owner: total_costs_by_owner[owner] == lowest_cost,
311 total_costs_by_owner) 317 total_costs_by_owner)
312 return random.Random().choice(lowest_cost_owners) 318 return random.Random().choice(lowest_cost_owners)
OLDNEW
« no previous file with comments | « no previous file | tests/owners_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698