Merge branch 'FIX-prevent-error-empty-addon-path' into 'main'

[FIX] Do not crash silently, when a repos.yml file reference an empty addons folder.

See merge request odoo-openupgrade-wizard/odoo-openupgrade-wizard!56
This commit is contained in:
Rémy Taymans 2024-03-01 14:12:35 +00:00
commit 02c6fa48cf
3 changed files with 49 additions and 14 deletions

View File

@ -102,6 +102,15 @@ def get_base_module_folder(migration_step: dict) -> str:
return "openerp" return "openerp"
def get_manifest_name(migration_step: dict) -> str:
"""return the name of the manifest file present in
each odoo module"""
if migration_step["version"] >= 10.0:
return "__manifest__.py"
return "__openerp__.py"
def skip_addon_path(migration_step: dict, path: Path) -> bool: def skip_addon_path(migration_step: dict, path: Path) -> bool:
"""return a boolean to indicate if the addon_path should be """return a boolean to indicate if the addon_path should be
remove (during the generation of the addons_path). remove (during the generation of the addons_path).

View File

@ -11,6 +11,7 @@ from loguru import logger
from odoo_openupgrade_wizard.configuration_version_dependant import ( from odoo_openupgrade_wizard.configuration_version_dependant import (
get_base_module_folder, get_base_module_folder,
get_manifest_name,
get_odoo_folder, get_odoo_folder,
get_odoo_run_command, get_odoo_run_command,
get_server_wide_modules_upgrade, get_server_wide_modules_upgrade,
@ -47,8 +48,17 @@ def get_repo_file_path(ctx, odoo_version: float) -> Path:
def get_odoo_addons_path( def get_odoo_addons_path(
ctx, root_path: Path, migration_step: dict, execution_context: str = False ctx,
odoo_env_path: Path,
migration_step: dict,
execution_context: str = False,
) -> str: ) -> str:
"""Return
- addons_path: a list of Path of that contains odoo module
for the current migration_step,
based on the analysis of the repos.yml file
- empty_addons_path: a list of Path of empty folders.
(without any odoo module)"""
repo_file = get_repo_file_path(ctx, migration_step["version"]) repo_file = get_repo_file_path(ctx, migration_step["version"])
base_module_folder = get_base_module_folder(migration_step) base_module_folder = get_base_module_folder(migration_step)
stream = open(repo_file, "r") stream = open(repo_file, "r")
@ -56,9 +66,10 @@ def get_odoo_addons_path(
data = data data = data
addons_path = [] addons_path = []
empty_addons_path = []
odoo_folder = get_odoo_folder(migration_step, execution_context) odoo_folder = get_odoo_folder(migration_step, execution_context)
for key in data.keys(): for key in data.keys():
path = root_path / Path(key) path = Path(key)
if str(path).endswith(odoo_folder): if str(path).endswith(odoo_folder):
# Add two folder for odoo folder # Add two folder for odoo folder
addons_path.append(path / Path("addons")) addons_path.append(path / Path("addons"))
@ -67,10 +78,21 @@ def get_odoo_addons_path(
) )
elif skip_addon_path(migration_step, path): elif skip_addon_path(migration_step, path):
pass pass
else: elif is_addons_path(ctx, odoo_env_path / path, migration_step):
addons_path.append(path) addons_path.append(path)
else:
empty_addons_path.append(path)
return addons_path return addons_path, empty_addons_path
def is_addons_path(ctx, path: Path, migration_step: dict):
for folder in [x for x in path.iterdir() if x.is_dir()]:
if (folder / "__init__.py").exists() and (
folder / get_manifest_name(migration_step)
).exists():
return True
return False
def get_odoo_env_path(ctx, odoo_version: float) -> Path: def get_odoo_env_path(ctx, odoo_version: float) -> Path:
@ -123,14 +145,18 @@ def generate_odoo_command(
) )
# compute 'addons_path' # compute 'addons_path'
addons_path = ",".join( addons_path_list, empty_addons_path_list = get_odoo_addons_path(
[ ctx, odoo_env_path, migration_step, execution_context
str(x)
for x in get_odoo_addons_path(
ctx, Path("/odoo_env"), migration_step, execution_context
)
]
) )
addons_path = ",".join(
[str(Path("/odoo_env") / x) for x in addons_path_list]
)
for empty_addons_path in empty_addons_path_list:
logger.info(
"Skipping addons path"
f" '{(odoo_env_path / empty_addons_path).resolve()}'"
" because it doesn't contain any odoo module."
)
# compute 'log_file' # compute 'log_file'
log_file_name = "{}____{}.log".format( log_file_name = "{}____{}.log".format(

View File

@ -379,14 +379,14 @@ class OdooModule(object):
""" """
# Try to find the repository that contains the module # Try to find the repository that contains the module
main_path = get_odoo_env_path(ctx, current_version) main_path = get_odoo_env_path(ctx, current_version)
addons_path = get_odoo_addons_path( addons_path, _ = get_odoo_addons_path(
ctx, ctx,
main_path, main_path,
{"version": current_version, "execution_context": "openupgrade"}, {"version": current_version, "execution_context": "openupgrade"},
) )
for addon_path in addons_path: for addon_path in addons_path:
if (addon_path / module_name).exists(): if (main_path / addon_path / module_name).exists():
return addon_path return main_path / addon_path
return False return False