|
36 | 36 | review_with_reviewer = 'r? @%s\n\n(rust_highfive has picked a reviewer for you, use r? to override)'
|
37 | 37 | review_without_reviewer = '@%s: no appropriate reviewer found, use r? to override'
|
38 | 38 |
|
39 |
| -reviewer_re = re.compile("\\b[rR]\?[:\- ]*@([a-zA-Z0-9\-]+)") |
| 39 | +reviewer_re = re.compile("\\b[rR]\?[:\- ]*@(?:([a-zA-Z0-9\-]+)/)?([a-zA-Z0-9\-]+)") |
40 | 40 | submodule_re = re.compile(".*\+Subproject\scommit\s.*", re.DOTALL | re.MULTILINE)
|
41 | 41 |
|
42 | 42 | rustaceans_api_url = "http://www.ncameron.org/rustaceans/user?username={username}"
|
@@ -247,27 +247,46 @@ def is_new_contributor(self, username, owner, repo):
|
247 | 247 | else:
|
248 | 248 | raise e
|
249 | 249 |
|
250 |
| - def find_reviewer(self, msg): |
| 250 | + def get_groups(self): |
| 251 | + groups = deepcopy(self.repo_config['groups']) |
| 252 | + |
| 253 | + # fill in the default groups, ensuring that overwriting is an |
| 254 | + # error. |
| 255 | + global_ = self._load_json_file('_global.json') |
| 256 | + for name, people in global_['groups'].items(): |
| 257 | + assert name not in groups, "group %s overlaps with _global.json" % name |
| 258 | + groups[name] = people |
| 259 | + |
| 260 | + return groups |
| 261 | + |
| 262 | + def find_reviewer(self, msg, exclude): |
251 | 263 | """
|
252 | 264 | If the user specified a reviewer, return the username, otherwise returns
|
253 | 265 | None.
|
254 | 266 | """
|
255 | 267 | if msg is not None:
|
256 | 268 | match = reviewer_re.search(msg)
|
257 |
| - return match.group(1) if match else None |
| 269 | + if match: |
| 270 | + if match.group(1): |
| 271 | + # assign someone from the specified team |
| 272 | + groups = self.get_groups() |
| 273 | + potential = groups.get(match.group(2)) |
| 274 | + if potential is None: |
| 275 | + potential = groups.get("%s/%s" % (match.group(1), match.group(2))) |
| 276 | + if potential is None: |
| 277 | + potential = groups["all"] |
| 278 | + else: |
| 279 | + potential.extend(groups["all"]) |
| 280 | + |
| 281 | + return self.pick_reviewer(groups, potential, exclude) |
| 282 | + else: |
| 283 | + return match.group(2) |
258 | 284 |
|
259 | 285 | def choose_reviewer(self, repo, owner, diff, exclude):
|
260 | 286 | """Choose a reviewer for the PR."""
|
261 | 287 | # Get JSON data on reviewers.
|
262 | 288 | dirs = self.repo_config.get('dirs', {})
|
263 |
| - groups = deepcopy(self.repo_config['groups']) |
264 |
| - |
265 |
| - # fill in the default groups, ensuring that overwriting is an |
266 |
| - # error. |
267 |
| - global_ = self._load_json_file('_global.json') |
268 |
| - for name, people in global_['groups'].items(): |
269 |
| - assert name not in groups, "group %s overlaps with _global.json" % name |
270 |
| - groups[name] = people |
| 289 | + groups = self.get_groups() |
271 | 290 |
|
272 | 291 | most_changed = None
|
273 | 292 | # If there's directories with specially assigned groups/users
|
@@ -310,6 +329,9 @@ def choose_reviewer(self, repo, owner, diff, exclude):
|
310 | 329 | if not potential:
|
311 | 330 | potential = groups['core']
|
312 | 331 |
|
| 332 | + return self.pick_reviewer(groups, potential, exclude) |
| 333 | + |
| 334 | + def pick_reviewer(self, groups, potential, exclude): |
313 | 335 | # expand the reviewers list by group
|
314 | 336 | reviewers = []
|
315 | 337 | seen = {"all"}
|
@@ -394,7 +416,7 @@ def new_pr(self):
|
394 | 416 | if not self.payload['pull_request', 'assignees']:
|
395 | 417 | # Only try to set an assignee if one isn't already set.
|
396 | 418 | msg = self.payload['pull_request', 'body']
|
397 |
| - reviewer = self.find_reviewer(msg) |
| 419 | + reviewer = self.find_reviewer(msg, author) |
398 | 420 | post_msg = False
|
399 | 421 |
|
400 | 422 | if not reviewer:
|
@@ -449,7 +471,7 @@ def new_comment(self):
|
449 | 471 |
|
450 | 472 | # Check for r? and set the assignee.
|
451 | 473 | msg = self.payload['comment', 'body']
|
452 |
| - reviewer = self.find_reviewer(msg) |
| 474 | + reviewer = self.find_reviewer(msg, author) |
453 | 475 | if reviewer:
|
454 | 476 | issue = str(self.payload['issue', 'number'])
|
455 | 477 | self.set_assignee(
|
|
0 commit comments