From d2e6c9d5010ab8092eff37775e92b486f89d28fc Mon Sep 17 00:00:00 2001 From: Christophe Simonis <chs@odoo.com> Date: Thu, 3 Nov 2022 14:58:49 +0000 Subject: [PATCH] [FIX] core: merge scripts found in `--upgrade-path` Don't limit on the first directory found in the upgrade-path. It follow the same behavior regarding scripts found in the `maintenance` directory and the ones in the local `upgrades` directory of modules. opw-2868713 closes odoo/odoo#104887 Signed-off-by: Christophe Simonis <chs@odoo.com> --- odoo/modules/migration.py | 40 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/odoo/modules/migration.py b/odoo/modules/migration.py index bd5e8f3a1326..8354967a2670 100644 --- a/odoo/modules/migration.py +++ b/odoo/modules/migration.py @@ -66,14 +66,13 @@ class MigrationManager(object): for path in odoo.upgrade.__path__: upgrade_path = opj(path, pkg) if os.path.exists(upgrade_path): - return upgrade_path - return None + yield upgrade_path def get_scripts(path): if not path: return {} return { - version: glob.glob1(opj(path, version), '*.py') + version: glob.glob(opj(path, version, '*.py')) for version in os.listdir(path) if os.path.isdir(opj(path, version)) } @@ -86,9 +85,14 @@ class MigrationManager(object): self.migrations[pkg.name] = { 'module': get_scripts(get_resource_path(pkg.name, 'migrations')), 'module_upgrades': get_scripts(get_resource_path(pkg.name, 'upgrades')), - 'upgrade': get_scripts(_get_upgrade_path(pkg.name)), } + scripts = defaultdict(list) + for p in _get_upgrade_path(pkg.name): + for v, s in get_scripts(p).items(): + scripts[v].extend(s) + self.migrations[pkg.name]["upgrade"] = scripts + def migrate_module(self, pkg, stage): assert stage in ('pre', 'post', 'end') stageformat = { @@ -126,26 +130,16 @@ class MigrationManager(object): """ return a list of migration script files """ m = self.migrations[pkg.name] - lst = [] - - mapping = { - 'module': opj(pkg.name, 'migrations'), - 'module_upgrades': opj(pkg.name, 'upgrades'), - } - for path in odoo.upgrade.__path__: - if os.path.exists(opj(path, pkg.name)): - mapping['upgrade'] = opj(path, pkg.name) - break - - for x in mapping: - if version in m.get(x): - for f in m[x][version]: - if not f.startswith(stage + '-'): - continue - lst.append(opj(mapping[x], version, f)) - lst.sort() - return lst + return sorted( + ( + f + for k in m + for f in m[k].get(version, []) + if os.path.basename(f).startswith(f"{stage}-") + ), + key=os.path.basename, + ) installed_version = getattr(pkg, 'load_version', pkg.installed_version) or '' parsed_installed_version = parse_version(installed_version) -- GitLab