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 @@ - +