Skip to content
This repository was archived by the owner on Mar 14, 2023. It is now read-only.

Commit c2f0b97

Browse files
Add functionality to assign a random team member with r? @<team-ping>
1 parent b4c738f commit c2f0b97

File tree

2 files changed

+40
-18
lines changed

2 files changed

+40
-18
lines changed

highfive/newpr.py

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
review_with_reviewer = 'r? @%s\n\n(rust_highfive has picked a reviewer for you, use r? to override)'
3737
review_without_reviewer = '@%s: no appropriate reviewer found, use r? to override'
3838

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\-]+)")
4040
submodule_re = re.compile(".*\+Subproject\scommit\s.*", re.DOTALL | re.MULTILINE)
4141

4242
rustaceans_api_url = "http://www.ncameron.org/rustaceans/user?username={username}"
@@ -247,27 +247,46 @@ def is_new_contributor(self, username, owner, repo):
247247
else:
248248
raise e
249249

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):
251263
"""
252264
If the user specified a reviewer, return the username, otherwise returns
253265
None.
254266
"""
255267
if msg is not None:
256268
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)
258284

259285
def choose_reviewer(self, repo, owner, diff, exclude):
260286
"""Choose a reviewer for the PR."""
261287
# Get JSON data on reviewers.
262288
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()
271290

272291
most_changed = None
273292
# If there's directories with specially assigned groups/users
@@ -310,6 +329,9 @@ def choose_reviewer(self, repo, owner, diff, exclude):
310329
if not potential:
311330
potential = groups['core']
312331

332+
return self.pick_reviewer(groups, potential, exclude)
333+
334+
def pick_reviewer(self, groups, potential, exclude):
313335
# expand the reviewers list by group
314336
reviewers = []
315337
seen = {"all"}
@@ -394,7 +416,7 @@ def new_pr(self):
394416
if not self.payload['pull_request', 'assignees']:
395417
# Only try to set an assignee if one isn't already set.
396418
msg = self.payload['pull_request', 'body']
397-
reviewer = self.find_reviewer(msg)
419+
reviewer = self.find_reviewer(msg, author)
398420
post_msg = False
399421

400422
if not reviewer:
@@ -449,7 +471,7 @@ def new_comment(self):
449471

450472
# Check for r? and set the assignee.
451473
msg = self.payload['comment', 'body']
452-
reviewer = self.find_reviewer(msg)
474+
reviewer = self.find_reviewer(msg, author)
453475
if reviewer:
454476
issue = str(self.payload['issue', 'number'])
455477
self.set_assignee(

highfive/tests/test_newpr.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -339,11 +339,11 @@ def test_find_reviewer(self):
339339
handler = HighfiveHandlerMock(Payload({})).handler
340340

341341
for (msg, reviewer) in found_cases:
342-
assert handler.find_reviewer(msg) == reviewer, \
342+
assert handler.find_reviewer(msg, None) == reviewer, \
343343
"expected '%s' from '%s'" % (reviewer, msg)
344344

345345
for msg in not_found_cases:
346-
assert handler.find_reviewer(msg) is None, \
346+
assert handler.find_reviewer(msg, None) is None, \
347347
"expected '%s' to have no reviewer extracted" % msg
348348

349349
def setup_get_irc_nick_mocks(self, mock_urllib, status_code, data=None):
@@ -833,7 +833,7 @@ def assert_set_assignee_branch_calls(self, reviewer, to_mention):
833833
self.mocks['api_req'].assert_called_once_with(
834834
'GET', 'https://the.url/', None, 'application/vnd.github.v3.diff'
835835
)
836-
self.mocks['find_reviewer'].assert_called_once_with('The PR comment.')
836+
self.mocks['find_reviewer'].assert_called_once_with('The PR comment.', 'prAuthor')
837837
self.mocks['set_assignee'].assert_called_once_with(
838838
reviewer, 'repo-owner', 'repo-name', '7', self.user, 'prAuthor',
839839
to_mention
@@ -1093,7 +1093,7 @@ def test_no_reviewer(self):
10931093
self.mocks['find_reviewer'].return_value = None
10941094
handler.new_comment()
10951095
self.mocks['is_collaborator'].assert_not_called()
1096-
self.mocks['find_reviewer'].assert_called_with('comment!')
1096+
self.mocks['find_reviewer'].assert_called_with('comment!', 'userA')
10971097
self.mocks['set_assignee'].assert_not_called()
10981098

10991099
def test_has_reviewer(self):
@@ -1102,7 +1102,7 @@ def test_has_reviewer(self):
11021102
self.mocks['find_reviewer'].return_value = 'userD'
11031103
handler.new_comment()
11041104
self.mocks['is_collaborator'].assert_not_called()
1105-
self.mocks['find_reviewer'].assert_called_with('comment!')
1105+
self.mocks['find_reviewer'].assert_called_with('comment!', 'userA')
11061106
self.mocks['set_assignee'].assert_called_with(
11071107
'userD', 'repo-owner', 'repo-name', '7', 'integrationUser',
11081108
'userA', None

0 commit comments

Comments
 (0)