diff --git a/runbot/models/build_config.py b/runbot/models/build_config.py index 85ebcf1df..494f88d6f 100644 --- a/runbot/models/build_config.py +++ b/runbot/models/build_config.py @@ -191,7 +191,12 @@ class ConfigStep(models.Model): # wip replace previous field by matrix upgrade_matrix_id = fields.Many2one('runbot.upgrade.matrix', 'Upgrade matrix', tracking=True) - + upgrade_current_source = fields.Boolean('Upgrade Curent source', help='Use current build as Source if version match', default=True, tracking=True) + upgrade_current_target = fields.Boolean('Upgrade Curent target', help='Use current build as target if version match', default=True, tracking=True) + # TODO maybe remove this field in the future, should all work in the same build + upgrade_from_bellow = fields.boolean('Upgrade from bellow', help="Standard upgrade behaviour", default=True, tracking=True) + upgrade_to_above = fields.boolean('Upgrade to above', help="Will behave as a complement", default=True, tracking=True) + upgrade_flat = fields.Boolean("Flat", help="Take all decisions in on build") upgrade_config_id = fields.Many2one('runbot.build.config',string='Upgrade Config', tracking=True, index=True) @@ -864,16 +869,32 @@ def _reference_builds(self, batch, trigger): refs_builds = refs_batches.mapped('slot_ids').filtered( lambda slot: slot.trigger_id == upgrade_dumps_trigger_id ).mapped('build_id') - # should we filter on active? implicit. On match type? on skipped ? - # is last_"done"_batch enough? - # TODO active test false and take last done/running build limit 1 -> in case of rebuild return refs_builds def _is_upgrade_step(self): return self.job_type in ('configure_upgrade', 'configure_upgrade_complement') def _reference_batches(self, batch, trigger): - if self.job_type == 'configure_upgrade_complement': + # upgrade_matrix_id + # upgrade_current_source + # upgrade_current_target + # upgrade_from_bellow + # upgrade_to_above + + if self.upgrade_matrix_id: + batches = self.env['runbot.batch'] + base_batch = batch if batch.reference_batch_ids else batch.base_reference_batch_id + reference_batch_ids = base_batch.reference_batch_ids + if self.upgrade_from_bellow: + from_versions = self.upgrade_matrix_id._get_versions_to(batch.version_id) + batches |= reference_batch_ids.filtered(lambda batch: batch.bundle_id.version_id in from_versions) + + if self.upgrade_to_above: + to_versions = self.upgrade_matrix_id._get_versions_from(batch.version_id) + batches |= reference_batch_ids.filtered(lambda batch: batch.bundle_id.version_id in to_versions) + return batches + + elif self.job_type == 'configure_upgrade_complement': return self._reference_batches_complement(batch, trigger) else: return self._reference_batches_upgrade(batch, trigger.upgrade_dumps_trigger_id.category_id.id) diff --git a/runbot/models/upgrade.py b/runbot/models/upgrade.py index d1594909e..72ab6186b 100644 --- a/runbot/models/upgrade.py +++ b/runbot/models/upgrade.py @@ -105,8 +105,6 @@ def _compute_matrix_summary(self): from_versions_string = ', '.join(sorted(from_versions)) lines.append(f'{to_version.number} - ({from_versions_string})') matrix.matrix_summary = '\n'.join(lines) - print('recompute') - print(matrix.matrix_summary) def update_matrix_entries(self): for metric in self: @@ -138,6 +136,16 @@ def _update_matrix_entries(self): def reset_matrix_enabled(self): for matrix in self: matrix.entry_ids._update_enabled(force=True) + + def _get_versions_from(self, from_version): + entries = self.entries.filtered(lambda e: e.enabled) + if from_version: + return entries.filtered(lambda e: e.from_version_id == from_version).mapped('to_version_id') + + def _get_versions_to(self, to_version): + entries = self.entries.filtered(lambda e: e.enabled) + if to_version: + return entries.filtered(lambda e: e.to_version_id == to_version).mapped('from_version_id') class UpgradeMatrixEntry(models.Model):