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