diff --git a/forwardport/models/project.py b/forwardport/models/project.py
index a5c60d8f..d4a30f21 100644
--- a/forwardport/models/project.py
+++ b/forwardport/models/project.py
@@ -38,8 +38,8 @@ from odoo.tools.misc import topological_sort, groupby, Reverse
from odoo.tools.sql import reverse_order
from odoo.tools.appdirs import user_cache_dir
from odoo.addons.base.models.res_partner import Partner
-from odoo.addons.runbot_merge import git, utils
-from odoo.addons.runbot_merge.models.pull_requests import RPLUS, Branch
+from odoo.addons.runbot_merge import git
+from odoo.addons.runbot_merge.models.pull_requests import Branch
from odoo.addons.runbot_merge.models.stagings_create import Message
@@ -258,12 +258,6 @@ class PullRequests(models.Model):
token_field='fp_github_token',
format_args={'pr': parent, 'child': p},
)
- # if we change the policy to skip CI, schedule followups on existing FPs
- if vals.get('fw_policy') == 'skipci' and self.state == 'merged':
- self.env['runbot_merge.pull_requests'].search([
- ('source_id', '=', self.id),
- ('state', 'not in', ('closed', 'merged')),
- ])._schedule_fp_followup()
return r
def _try_closing(self, by):
@@ -396,7 +390,7 @@ class PullRequests(models.Model):
if not pr.parent_id:
_logger.info('-> no parent %s (%s)', pr.display_name, pr.parent_id)
continue
- if not self.env.context.get('force_fw') and self.source_id.fw_policy != 'skipci' and pr.state not in ['validated', 'ready']:
+ if not self.env.context.get('force_fw') and self.source_id.batch_id.fw_policy != 'skipci' and pr.state not in ['validated', 'ready']:
_logger.info('-> wrong state %s (%s)', pr.display_name, pr.state)
continue
@@ -424,7 +418,7 @@ class PullRequests(models.Model):
# check if batch-mate are all valid
mates = batch.prs
# wait until all of them are validated or ready
- if not self.env.context.get('force_fw') and any(pr.source_id.fw_policy != 'skipci' and pr.state not in ('validated', 'ready') for pr in mates):
+ if not self.env.context.get('force_fw') and any(pr.source_id.batch_id.fw_policy != 'skipci' and pr.state not in ('validated', 'ready') for pr in mates):
_logger.info("-> not ready (%s)", [(pr.display_name, pr.state) for pr in mates])
continue
@@ -989,6 +983,16 @@ class Batch(models.Model):
super().write(vals)
+ # if we change the policy to skip CI, schedule followups on existing FPs
+ # FIXME: although this should be managed by the command handler already,
+ # this should probably allow setting the fw policy on any batch
+ # of the sequence
+ if vals.get('fw_policy') == 'skipci' and self.merge_date:
+ self.env['runbot_merge.pull_requests'].search([
+ ('source_id', '=', self.prs[:1].id),
+ ('state', 'not in', ('closed', 'merged')),
+ ])._schedule_fp_followup()
+
return True
# ordering is a bit unintuitive because the lowest sequence (and name)
diff --git a/forwardport/tests/test_weird.py b/forwardport/tests/test_weird.py
index 8f7f8acd..0c2170b4 100644
--- a/forwardport/tests/test_weird.py
+++ b/forwardport/tests/test_weird.py
@@ -655,7 +655,7 @@ def test_skip_ci_all(env, config, make_repo):
assert env['runbot_merge.pull_requests'].search([
('repository.name', '=', prod.name),
('number', '=', pr.number)
- ]).fw_policy == 'skipci'
+ ]).batch_id.fw_policy == 'skipci'
with prod:
prod.post_status('staging.a', 'success', 'legal/cla')
@@ -695,7 +695,7 @@ def test_skip_ci_next(env, config, make_repo):
'hansen fw=skipci',
config['role_reviewer']['token']
)
- assert pr0_id.fw_policy == 'skipci'
+ assert pr0_id.batch_id.fw_policy == 'skipci'
env.run_crons()
_, _, pr2_id = env['runbot_merge.pull_requests'].search([], order='number')
diff --git a/runbot_merge/models/batch.py b/runbot_merge/models/batch.py
index a9f6a3d1..8e9a3674 100644
--- a/runbot_merge/models/batch.py
+++ b/runbot_merge/models/batch.py
@@ -20,6 +20,11 @@ class Batch(models.Model):
prs = fields.One2many('runbot_merge.pull_requests', 'batch_id')
+ fw_policy = fields.Selection([
+ ('default', "Default"),
+ ('skipci', "Skip CI"),
+ ], required=True, default="default", string="Forward Port Policy")
+
merge_date = fields.Datetime(tracking=True)
skipchecks = fields.Boolean(
string="Skips Checks",
diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py
index eb28fe20..74f7dbe7 100644
--- a/runbot_merge/models/pull_requests.py
+++ b/runbot_merge/models/pull_requests.py
@@ -798,7 +798,7 @@ class PullRequests(models.Model):
feedback(close=True)
case commands.FW():
if source_reviewer or is_reviewer:
- (self.source_id or self).fw_policy = command.name.lower()
+ (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."
diff --git a/runbot_merge/views/mergebot.xml b/runbot_merge/views/mergebot.xml
index dc219101..f4a65b61 100644
--- a/runbot_merge/views/mergebot.xml
+++ b/runbot_merge/views/mergebot.xml
@@ -159,7 +159,7 @@
-
+