Mercurial > kallithea
changeset 8647:9f65a573a298
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.
author | Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> |
---|---|
date | Wed, 30 Sep 2020 13:39:33 +0200 |
parents | 96c86063278c |
children | af7b367f6b5a |
files | kallithea/model/pull_request.py |
diffstat | 1 files changed, 14 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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))