From 847d4e5ee6a50284bd814b261d8db5a7edc1587e Mon Sep 17 00:00:00 2001
From: Christophe Simonis <chs@odoo.com>
Date: Wed, 29 Mar 2023 12:21:27 +0000
Subject: [PATCH] [FIX] core: correctly handle major-less upgrade scripts
 during major version change

closes odoo/odoo#117886

X-original-commit: c38b5baaeac28a7952601878a5b5efadf7f52984
Signed-off-by: Christophe Simonis <chs@odoo.com>
---
 odoo/modules/migration.py | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/odoo/modules/migration.py b/odoo/modules/migration.py
index 8354967a2670..141a11134a4d 100644
--- a/odoo/modules/migration.py
+++ b/odoo/modules/migration.py
@@ -145,12 +145,23 @@ class MigrationManager(object):
         parsed_installed_version = parse_version(installed_version)
         current_version = parse_version(convert_version(pkg.data['version']))
 
-        versions = _get_migration_versions(pkg, stage)
+        def compare(version):
+            if version == "0.0.0" and parsed_installed_version < current_version:
+                return True
 
-        for version in versions:
-            if ((version == "0.0.0" and parsed_installed_version < current_version)
-               or parsed_installed_version < parse_version(convert_version(version)) <= current_version):
+            full_version = convert_version(version)
+            majorless_version = (version != full_version)
+
+            if majorless_version:
+                # We should not re-execute major-less scripts when upgrading to new Odoo version
+                # a module in `9.0.2.0` should not re-execute a `2.0` script when upgrading to `10.0.2.0`.
+                return parsed_installed_version < parse_version(full_version) < current_version
 
+            return parsed_installed_version < parse_version(full_version) <= current_version
+
+        versions = _get_migration_versions(pkg, stage)
+        for version in versions:
+            if compare(version):
                 strfmt = {'addon': pkg.name,
                           'stage': stage,
                           'version': stageformat[stage] % version,
-- 
GitLab