From d75c4f085fb03740fbbd3a128e6129dbd01af86b Mon Sep 17 00:00:00 2001 From: Xavier-Do Date: Thu, 16 Jan 2020 13:41:29 +0100 Subject: [PATCH] [FIX] runbot: fix duplicate id and improve global_state --- runbot/fields.py | 2 +- runbot/models/build.py | 10 +++++++--- runbot/tests/test_build.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/runbot/fields.py b/runbot/fields.py index 56b5ee6a..3835009a 100644 --- a/runbot/fields.py +++ b/runbot/fields.py @@ -14,7 +14,7 @@ class JsonDictField(Field): def convert_to_column(self, value, record, values=None, validate=True): val = self.convert_to_cache(value, record, validate=validate) - return Json(value) if val else val + return Json(val) if val else False def convert_to_cache(self, value, record, validate=True): return value.dict if isinstance(value, FieldDict) else value if isinstance(value, dict) else None diff --git a/runbot/models/build.py b/runbot/models/build.py index 13d8cdc3..40be4d06 100644 --- a/runbot/models/build.py +++ b/runbot/models/build.py @@ -126,10 +126,14 @@ class runbot_build(models.Model): for record in self: if record.duplicate_id: record.global_state = record.duplicate_id.global_state + elif record.global_state == 'done' and self.local_state == 'done': + # avoid to recompute if done, mostly important whith many orphan childrens + record.global_state = 'done' else: waiting_score = record._get_state_score('waiting') - if record._get_state_score(record.local_state) > waiting_score and record.children_ids: # if finish, check children - children_state = record._get_youngest_state([child.global_state for child in record.children_ids]) + children_ids = [child for child in record.children_ids if not child.orphan_result] + if record._get_state_score(record.local_state) > waiting_score and children_ids: # if finish, check children + children_state = record._get_youngest_state([child.global_state for child in children_ids]) if record._get_state_score(children_state) > waiting_score: record.global_state = record.local_state else: @@ -248,7 +252,7 @@ class runbot_build(models.Model): '|', ('local_result', '=', False), ('local_result', '!=', 'skipped'), # had to reintroduce False posibility for selections ('config_id', '=', build_id.config_id.id), ('extra_params', '=', build_id.extra_params), - ('config_data', '=', build_id.config_data), + ('config_data', '=', build_id.config_data or False), ] candidates = self.search(domain) if candidates and nb_deps: diff --git a/runbot/tests/test_build.py b/runbot/tests/test_build.py index 8b497975..43cbdc4a 100644 --- a/runbot/tests/test_build.py +++ b/runbot/tests/test_build.py @@ -89,6 +89,40 @@ class Test_Build(RunbotCase): build.env.cr.execute("SELECT config_data, config_data->'test_write' AS written, config_data->'test_build' AS test_build FROM runbot_build WHERE id = %s", [build.id]) self.assertEqual([({'test_write': 'written', 'test_build': 'foo'}, 'written', 'foo')], self.env.cr.fetchall()) + def test_config_data_duplicate(self): + + build = self.create_build({ + 'branch_id': self.branch.id, + 'name': 'd0d0caca0000ffffffffffffffffffffffffffff', + }) + + build2 = self.create_build({ + 'branch_id': self.branch.id, + 'name': 'd0d0caca0000ffffffffffffffffffffffffffff', + }) + self.assertEqual(build2.duplicate_id, build) + + build3 = self.create_build({ + 'branch_id': self.branch.id, + 'name': 'd0d0caca0000ffffffffffffffffffffffffffff', + 'config_data': {'test':'aa'}, + }) + self.assertFalse(build3.duplicate_id) + build4 = self.create_build({ + 'branch_id': self.branch.id, + 'name': 'd0d0caca0000ffffffffffffffffffffffffffff', + 'config_data': {'test':'aa'}, + }) + self.assertEqual(build4.duplicate_id, build3) + + build5 = self.create_build({ + 'branch_id': self.branch.id, + 'name': 'd0d0caca0000ffffffffffffffffffffffffffff', + 'config_data': {'test':'bb'}, + }) + self.assertFalse(build5.duplicate_id) + + @patch('odoo.addons.runbot.models.build.runbot_build._get_repo_available_modules') def test_filter_modules(self, mock_get_repo_mods): """ test module filtering """