# HG changeset patch # User Thomas De Schampheleire # Date 1601465973 -7200 # Node ID 9f65a573a29853e6cababa782265bb88ec59d3d8 # Parent 96c86063278c85e119b3f093fd1c5a219ccbf774 model: handle redundant reviewers in add_reviewers Don't attempt to add reviewers that are already a reviewer for the specified PR (redundant reviewers). Return the list of added and redundant reviewers, for the controller to handle. Under normal circumstances, the pullrequest controller already processes the list of reviewers and only calls add_reviewers for new reviewers. But, there could be ways were this checking fails, for example due to a race condition between two simultaneous requests for the same pullrequest, or due to a bug in the web server framework that causes the same request to be handled again. diff -r 96c86063278c -r 9f65a573a298 kallithea/model/pull_request.py --- a/kallithea/model/pull_request.py Fri Sep 25 11:11:11 2020 +0200 +++ b/kallithea/model/pull_request.py Wed Sep 30 13:39:33 2020 +0200 @@ -58,7 +58,18 @@ mention_recipients = set(mention_recipients) - reviewers _assert_valid_reviewers(mention_recipients) - # members + redundant_reviewers = set(User.query() \ + .join(PullRequestReviewer) \ + .filter(PullRequestReviewer.pull_request == pr) \ + .filter(PullRequestReviewer.user_id.in_(r.user_id for r in reviewers)) + .all()) + + if redundant_reviewers: + log.debug('Following reviewers were already part of pull request %s: %s', pr.pull_request_id, redundant_reviewers) + + reviewers -= redundant_reviewers + + log.debug('Adding reviewers to pull request %s: %s', pr.pull_request_id, reviewers) for reviewer in reviewers: prr = PullRequestReviewer(reviewer, pr) Session().add(prr) @@ -116,6 +127,8 @@ type_=NotificationModel.TYPE_PULL_REQUEST, email_kwargs=email_kwargs) + return reviewers, redundant_reviewers + def mention_from_description(self, user, pr, old_description=''): mention_recipients = (extract_mentioned_users(pr.description) - extract_mentioned_users(old_description))