diff --git a/forwardport/models/project.py b/forwardport/models/project.py index 2b58bf86..5c664c25 100644 --- a/forwardport/models/project.py +++ b/forwardport/models/project.py @@ -550,6 +550,9 @@ class Stagings(models.Model): if vals.get('active') is False and self.state == 'success': # check all batches to see if they should be forward ported for b in self.with_context(active_test=False).batch_ids: + if b.fw_policy == 'no': + continue + # if all PRs of a batch have parents they're part of an FP # sequence and thus handled separately, otherwise they're # considered regular merges diff --git a/forwardport/tests/test_limit.py b/forwardport/tests/test_limit.py index 1dd76980..1e8fcf7b 100644 --- a/forwardport/tests/test_limit.py +++ b/forwardport/tests/test_limit.py @@ -72,8 +72,8 @@ def test_ignore(env, config, make_repo, users): (users['reviewer'], "hansen ignore"), (users['reviewer'], "hansen r+ fw=no"), (users['user'], "'ignore' is deprecated, use 'fw=no' to disable forward porting."), - (users['user'], "Forward-port disabled."), - (users['user'], "Forward-port disabled."), + (users['user'], "Forward-port disabled (via limit)."), + (users['user'], "Disabled forward-porting."), ] @pytest.mark.expect_log_errors(reason="one of the limit-setting does not provide a branch name") diff --git a/runbot_merge/models/batch.py b/runbot_merge/models/batch.py index 0f0c82cf..c85eb4f7 100644 --- a/runbot_merge/models/batch.py +++ b/runbot_merge/models/batch.py @@ -68,9 +68,10 @@ class Batch(models.Model): active = fields.Boolean(compute='_compute_active', store=True, help="closed batches (batches containing only closed PRs)") fw_policy = fields.Selection([ + ('no', "Do not port forward"), ('default', "Default"), ('skipci', "Skip CI"), - ], required=True, default="default", string="Forward Port Policy") + ], required=True, default="default", string="Forward Port Policy", tracking=True) merge_date = fields.Datetime(tracking=True) # having skipchecks skip both validation *and approval* makes sense because @@ -89,7 +90,7 @@ class Batch(models.Model): ('default', "Default"), ('priority', "Priority"), ('alone', "Alone"), - ], default='default', group_operator=None, required=True, + ], default='default', group_operator=None, required=True, tracking=True, column_type=enum(_name, 'priority'), ) diff --git a/runbot_merge/models/commands.py b/runbot_merge/models/commands.py index 684209e3..675d71eb 100644 --- a/runbot_merge/models/commands.py +++ b/runbot_merge/models/commands.py @@ -363,6 +363,8 @@ class Parser: self.assert_next('=') f = next(self.it, "") try: + if f in ('disable', 'disabled'): + return FW.NO return FW[f.upper()] except KeyError: raise CommandError(f"unknown fw configuration {f or None!r}") from None diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py index 927536af..75c76880 100644 --- a/runbot_merge/models/pull_requests.py +++ b/runbot_merge/models/pull_requests.py @@ -873,35 +873,21 @@ For your own safety I've ignored *everything in your entire comment*. case commands.Close() if source_author: feedback(close=True) case commands.FW(): - if command == commands.FW.NO: - if is_author: - for p in self.batch_id.prs: - ping, m = p._maybe_update_limit(self.target.name) + match command: + case commands.FW.NO if is_author or source_author: + message = "Disabled forward-porting." + case commands.FW.DEFAULT if is_author or source_author: + message = "Waiting for CI to create followup forward-ports." + case commands.FW.SKIPCI if is_reviewer or source_reviewer: + message = "Not waiting for CI to create followup forward-ports." + case commands.FW.SKIPMERGE if is_reviewer or source_reviewer: + message = "Not waiting for merge to create followup forward-ports." + case _: + msg = f"you don't have the right to {command}." - if ping and p == self: - msg = m - else: - if ping: - m = f"@{login} {m}" - self.env['runbot_merge.pull_requests.feedback'].create({ - 'repository': p.repository.id, - 'pull_request': p.number, - 'message': m, - }) - else: - msg = "you can't set a forward-port limit." - elif source_reviewer or is_reviewer: + if not msg: (self.source_id or self).batch_id.fw_policy = command.name.lower() - match command: - case commands.FW.DEFAULT: - message = "Waiting for CI to create followup forward-ports." - case commands.FW.SKIPCI: - message = "Not waiting for CI to create followup forward-ports." - case commands.FW.SKIPMERGE: - message = "Not waiting for merge to create followup forward-ports." feedback(message=message) - else: - msg = "you can't configure forward-port CI." case commands.Limit(branch) if is_author: if branch is None: feedback(message="'ignore' is deprecated, use 'fw=no' to disable forward porting.") @@ -957,7 +943,7 @@ For your own safety I've ignored *everything in your entire comment*. if not self.source_id and self.state != 'merged': self.limit_id = limit_id if branch_key(limit_id) <= branch_key(self.target): - return False, "Forward-port disabled." + return False, "Forward-port disabled (via limit)." else: return False, f"Forward-porting to {limit_id.name!r}."