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))