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

Side by Side Diff: owners.py

Issue 2293233002: owners.py: partial fix for owners-check perf regression (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « no previous file | no next file » | 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 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 if fnmatch.fnmatch(objname, owned_pattern): 174 if fnmatch.fnmatch(objname, owned_pattern):
175 return True 175 return True
176 if self._should_stop_looking(objname): 176 if self._should_stop_looking(objname):
177 break 177 break
178 objname = self.os_path.dirname(objname) 178 objname = self.os_path.dirname(objname)
179 return False 179 return False
180 180
181 def _enclosing_dir_with_owners(self, objname): 181 def _enclosing_dir_with_owners(self, objname):
182 """Returns the innermost enclosing directory that has an OWNERS file.""" 182 """Returns the innermost enclosing directory that has an OWNERS file."""
183 dirpath = objname 183 dirpath = objname
184 while not self._owners_for(dirpath): 184 while not self._owners_for(dirpath):
ncarter (slow) 2016/08/30 22:51:27 I wonder if this check needs something like what h
185 if self._should_stop_looking(dirpath): 185 if self._should_stop_looking(dirpath):
186 break 186 break
187 dirpath = self.os_path.dirname(dirpath) 187 dirpath = self.os_path.dirname(dirpath)
188 return dirpath 188 return dirpath
189 189
190 def load_data_needed_for(self, files): 190 def load_data_needed_for(self, files):
191 for f in files: 191 for f in files:
192 loaded_dirs = set()
192 dirpath = self.os_path.dirname(f) 193 dirpath = self.os_path.dirname(f)
193 while not self._owners_for(dirpath): 194 while dirpath not in loaded_dirs:
dtu 2016/08/31 02:35:46 Is loaded_dirs supposed to be at the top-level? I
194 self._read_owners(self.os_path.join(dirpath, 'OWNERS')) 195 self._read_owners(self.os_path.join(dirpath, 'OWNERS'))
196 loaded_dirs.add(dirpath)
195 if self._should_stop_looking(dirpath): 197 if self._should_stop_looking(dirpath):
196 break 198 break
197 dirpath = self.os_path.dirname(dirpath) 199 dirpath = self.os_path.dirname(dirpath)
198 200
199 def _should_stop_looking(self, objname): 201 def _should_stop_looking(self, objname):
200 return any(fnmatch.fnmatch(objname, stop_looking) 202 return any(fnmatch.fnmatch(objname, stop_looking)
201 for stop_looking in self._stop_looking) 203 for stop_looking in self._stop_looking)
202 204
203 def _owners_for(self, objname): 205 def _owners_for(self, objname):
204 obj_owners = set() 206 obj_owners = set()
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 @staticmethod 364 @staticmethod
363 def lowest_cost_owner(all_possible_owners, dirs): 365 def lowest_cost_owner(all_possible_owners, dirs):
364 total_costs_by_owner = Database.total_costs_by_owner(all_possible_owners, 366 total_costs_by_owner = Database.total_costs_by_owner(all_possible_owners,
365 dirs) 367 dirs)
366 # Return the lowest cost owner. In the case of a tie, pick one randomly. 368 # Return the lowest cost owner. In the case of a tie, pick one randomly.
367 lowest_cost = min(total_costs_by_owner.itervalues()) 369 lowest_cost = min(total_costs_by_owner.itervalues())
368 lowest_cost_owners = filter( 370 lowest_cost_owners = filter(
369 lambda owner: total_costs_by_owner[owner] == lowest_cost, 371 lambda owner: total_costs_by_owner[owner] == lowest_cost,
370 total_costs_by_owner) 372 total_costs_by_owner)
371 return random.Random().choice(lowest_cost_owners) 373 return random.Random().choice(lowest_cost_owners)
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698