diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py index f18609a6..98287b86 100644 --- a/runbot_merge/models/pull_requests.py +++ b/runbot_merge/models/pull_requests.py @@ -809,8 +809,16 @@ class PullRequests(models.Model): msg = "This PR is already reviewed, reviewing it again is useless." elif not param and is_author: newstate = RMINUS.get(self.state) - if newstate: - self.state = newstate + if self.priority == 0 or newstate: + if newstate: + self.state = newstate + if self.priority == 0: + self.priority = 1 + Feedback.create({ + 'repository': self.repository.id, + 'pull_request': self.number, + 'message': "PR priority reset to 1, as pull requests with priority 0 ignore review state.", + }) self.unstage("unreview (r-) by %s", author.github_login) ok = True else: diff --git a/runbot_merge/tests/test_basic.py b/runbot_merge/tests/test_basic.py index d63894f4..a5bbe1f4 100644 --- a/runbot_merge/tests/test_basic.py +++ b/runbot_merge/tests/test_basic.py @@ -3020,6 +3020,40 @@ class TestRMinus: assert pr2.state == 'validated', "state should have been reset" assert not env['runbot_merge.split'].search([]), "there should be no split left" + def test_rminus_p0(self, env, repo, config, users): + """ In and of itself r- doesn't do anything on p=0 since they bypass + approval, so unstage and downgrade to p=1. + """ + + with repo: + m = repo.make_commit(None, 'initial', None, tree={'m': 'm'}) + repo.make_ref('heads/master', m) + + c = repo.make_commit(m, 'first', None, tree={'m': 'c'}) + prx = repo.make_pr(title='title', body=None, target='master', head=c) + repo.post_status(prx.head, 'success', 'ci/runbot') + repo.post_status(prx.head, 'success', 'legal/cla') + prx.post_comment('hansen p=0', config['role_reviewer']['token']) + env.run_crons() + + pr = env['runbot_merge.pull_requests'].search([ + ('repository.name', '=', repo.name), + ('number', '=', prx.number), + ]) + assert pr.priority == 0 + assert pr.staging_id + + with repo: + prx.post_comment('hansen r-', config['role_reviewer']['token']) + env.run_crons() + assert not pr.staging_id, "pr should have been unstaged" + assert pr.priority == 1, "priority should have been downgraded" + assert prx.comments == [ + (users['reviewer'], 'hansen p=0'), + (users['reviewer'], 'hansen r-'), + (users['user'], "PR priority reset to 1, as pull requests with priority 0 ignore review state."), + ] + class TestComments: def test_address_method(self, repo, env, config): with repo: