diff --git a/runbot/models/version.py b/runbot/models/version.py index 51be9d58..bedefd73 100644 --- a/runbot/models/version.py +++ b/runbot/models/version.py @@ -1,6 +1,7 @@ import logging import re from odoo import models, fields, api, tools +from odoo.exceptions import ValidationError _logger = logging.getLogger(__name__) @@ -25,6 +26,20 @@ class Version(models.Model): dockerfile_id = fields.Many2one('runbot.dockerfile', default=lambda self: self.env['runbot.version'].search([('name', '=', 'master')], limit=1).dockerfile_id or self.env.ref('runbot.docker_default', raise_if_not_found=False)) + _sql_constraints = [ + ('unique_name', 'unique (name)', 'avoid duplicate name'), + ('unique_number', 'unique (number)', 'avoid duplicate number'), + ] + + @api.constrains("name") + def _check_match_is_base(self): + icp = self.env['ir.config_parameter'].sudo() + regex = icp.get_param('runbot.runbot_is_base_regex', False) + if regex: + for record in self: + if not re.match(regex, record.name): + raise ValidationError(f"Version name {record.name} does not match base version regex {regex}") + @api.depends('name') def _compute_version_number(self): for version in self: diff --git a/runbot/tests/common.py b/runbot/tests/common.py index 140304c5..abc7ed4f 100644 --- a/runbot/tests/common.py +++ b/runbot/tests/common.py @@ -97,7 +97,7 @@ class RunbotCase(TransactionCase): 'token': '123', }) - self.version_13 = self.Version.create({'name': '13.0'}) + self.version_13 = self.Version._get('13.0') self.default_config = self.env.ref('runbot.runbot_build_config_default') self.initial_server_commit = self.Commit.create({ diff --git a/runbot/tests/test_version.py b/runbot/tests/test_version.py index 166c8ac5..cab5ed15 100644 --- a/runbot/tests/test_version.py +++ b/runbot/tests/test_version.py @@ -6,17 +6,17 @@ class TestVersion(RunbotCase): def test_basic_version(self): - major_version = self.Version.create({'name': '12.0'}) + major_version = self.Version._get('12.0') self.assertEqual(major_version.number, '12.00') self.assertTrue(major_version.is_major) - saas_version = self.Version.create({'name': 'saas-12.1'}) + saas_version = self.Version._get('saas-12.1') self.assertEqual(saas_version.number, '12.01') self.assertFalse(saas_version.is_major) self.assertGreater(saas_version.number, major_version.number) - master_version = self.Version.create({'name': 'master'}) + master_version = self.Version._get('master') self.assertEqual(master_version.number, '~') self.assertGreater(master_version.number, saas_version.number) diff --git a/runbot/views/build_error_views.xml b/runbot/views/build_error_views.xml index 9a607672..ef9dbf07 100644 --- a/runbot/views/build_error_views.xml +++ b/runbot/views/build_error_views.xml @@ -57,8 +57,8 @@ - - + + diff --git a/runbot/views/build_views.xml b/runbot/views/build_views.xml index 69f1891e..9a5f6c17 100644 --- a/runbot/views/build_views.xml +++ b/runbot/views/build_views.xml @@ -67,6 +67,7 @@ +