|
33 | 33 | review_with_reviewer = 'r? @%s\n\n(rust-highfive has picked a reviewer for you, use r? to override)'
|
34 | 34 | review_without_reviewer = '@%s: no appropriate reviewer found, use r? to override'
|
35 | 35 |
|
36 |
| -reviewer_re = re.compile("\\b[rR]\?[:\- ]*@([a-zA-Z0-9\-]+)") |
| 36 | +reviewer_re = re.compile("\\b[rR]\?[:\- ]*@(?:([a-zA-Z0-9\-]+)/)?([a-zA-Z0-9\-]+)") |
37 | 37 | submodule_re = re.compile(".*\+Subproject\scommit\s.*", re.DOTALL | re.MULTILINE)
|
38 | 38 | target_re = re.compile("^[+-]{3} [ab]/compiler/rustc_target/src/spec/", re.MULTILINE)
|
39 | 39 |
|
@@ -230,27 +230,46 @@ def is_new_contributor(self, username, owner, repo):
|
230 | 230 | else:
|
231 | 231 | raise e
|
232 | 232 |
|
233 |
| - def find_reviewer(self, msg): |
| 233 | + def get_groups(self): |
| 234 | + groups = deepcopy(self.repo_config['groups']) |
| 235 | + |
| 236 | + # fill in the default groups, ensuring that overwriting is an |
| 237 | + # error. |
| 238 | + global_ = self._load_json_file('_global.json') |
| 239 | + for name, people in global_['groups'].items(): |
| 240 | + assert name not in groups, "group %s overlaps with _global.json" % name |
| 241 | + groups[name] = people |
| 242 | + |
| 243 | + return groups |
| 244 | + |
| 245 | + def find_reviewer(self, msg, exclude): |
234 | 246 | """
|
235 | 247 | If the user specified a reviewer, return the username, otherwise returns
|
236 | 248 | None.
|
237 | 249 | """
|
238 | 250 | if msg is not None:
|
239 | 251 | match = reviewer_re.search(msg)
|
240 |
| - return match.group(1) if match else None |
| 252 | + if match: |
| 253 | + if match.group(1): |
| 254 | + # assign someone from the specified team |
| 255 | + groups = self.get_groups() |
| 256 | + potential = groups.get(match.group(2)) |
| 257 | + if potential is None: |
| 258 | + potential = groups.get("%s/%s" % (match.group(1), match.group(2))) |
| 259 | + if potential is None: |
| 260 | + potential = groups["all"] |
| 261 | + else: |
| 262 | + potential.extend(groups["all"]) |
| 263 | + |
| 264 | + return self.pick_reviewer(groups, potential, exclude) |
| 265 | + else: |
| 266 | + return match.group(2) |
241 | 267 |
|
242 | 268 | def choose_reviewer(self, repo, owner, diff, exclude):
|
243 | 269 | """Choose a reviewer for the PR."""
|
244 | 270 | # Get JSON data on reviewers.
|
245 | 271 | dirs = self.repo_config.get('dirs', {})
|
246 |
| - groups = deepcopy(self.repo_config['groups']) |
247 |
| - |
248 |
| - # fill in the default groups, ensuring that overwriting is an |
249 |
| - # error. |
250 |
| - global_ = self._load_json_file('_global.json') |
251 |
| - for name, people in global_['groups'].items(): |
252 |
| - assert name not in groups, "group %s overlaps with _global.json" % name |
253 |
| - groups[name] = people |
| 272 | + groups = self.get_groups() |
254 | 273 |
|
255 | 274 | most_changed = None
|
256 | 275 | # If there's directories with specially assigned groups/users
|
@@ -293,6 +312,9 @@ def choose_reviewer(self, repo, owner, diff, exclude):
|
293 | 312 | if not potential:
|
294 | 313 | potential = groups['core']
|
295 | 314 |
|
| 315 | + return self.pick_reviewer(groups, potential, exclude) |
| 316 | + |
| 317 | + def pick_reviewer(self, groups, potential, exclude): |
296 | 318 | # expand the reviewers list by group
|
297 | 319 | reviewers = []
|
298 | 320 | seen = {"all"}
|
@@ -382,7 +404,7 @@ def new_pr(self):
|
382 | 404 | if not self.payload['pull_request', 'assignees']:
|
383 | 405 | # Only try to set an assignee if one isn't already set.
|
384 | 406 | msg = self.payload['pull_request', 'body']
|
385 |
| - reviewer = self.find_reviewer(msg) |
| 407 | + reviewer = self.find_reviewer(msg, author) |
386 | 408 | post_msg = False
|
387 | 409 |
|
388 | 410 | if not reviewer:
|
@@ -437,7 +459,7 @@ def new_comment(self):
|
437 | 459 |
|
438 | 460 | # Check for r? and set the assignee.
|
439 | 461 | msg = self.payload['comment', 'body']
|
440 |
| - reviewer = self.find_reviewer(msg) |
| 462 | + reviewer = self.find_reviewer(msg, author) |
441 | 463 | if reviewer:
|
442 | 464 | issue = str(self.payload['issue', 'number'])
|
443 | 465 | self.set_assignee(
|
|
0 commit comments