Changeset - 9f65a573a298
[Not reviewed]
default
0 1 0
Thomas De Schampheleire - 5 years ago 2020-09-30 13:39:33
thomas.de_schampheleire@nokia.com
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.
1 file changed with 14 insertions and 1 deletions:
0 comments (0 inline, 0 general)
kallithea/model/pull_request.py
Show inline comments
 
@@ -58,7 +58,18 @@ class PullRequestModel(object):
 
            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 @@ class PullRequestModel(object):
 
                                       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))
0 comments (0 inline, 0 general)