feature/generador-instaladores-linux-windows

This commit is contained in:
2026-07-01 10:33:05 -06:00
parent 0d8d80d61d
commit 0c14f1166b
17 changed files with 802 additions and 90 deletions

View File

@@ -16,6 +16,7 @@ from ..constants import (
DIR_PROCESADOS,
DIR_TEMP,
ENV_PATH,
IS_WINDOWS,
LOGS_DIR,
ODBC_DIR,
SEVEN_ZIP_DIR,
@@ -25,10 +26,32 @@ from .env_loader import render_env_template
def _copy_tree_if_missing(src: Path, dest: Path) -> None:
if not src.is_dir() or dest.exists():
if not src.is_dir():
return
dest.parent.mkdir(parents=True, exist_ok=True)
shutil.copytree(src, dest)
# dest puede existir pero VACÍO: ensure_runtime_layout crea ODBC_DIR/SEVEN_ZIP_DIR
# antes de llamar aquí. Solo saltar si ya tiene contenido (evita re-copiar en cada
# arranque). Antes se saltaba por dest.exists(), dejando 7-Zip/ODBC sin desplegar.
if dest.exists() and any(dest.iterdir()):
return
dest.mkdir(parents=True, exist_ok=True)
shutil.copytree(src, dest, dirs_exist_ok=True)
def _ensure_seven_zip_executable() -> None:
"""
Asegura el bit de ejecución del 7-Zip embebido en Linux/macOS. shutil.copytree
suele preservar los permisos, pero esto es una salvaguarda barata: si el binario
quedó sin 'x', la extracción fallaría con PermissionError.
"""
if IS_WINDOWS:
return
for exe_name in ("7zz", "7za", "7z"):
exe_path = SEVEN_ZIP_DIR / exe_name
if exe_path.is_file():
try:
exe_path.chmod(0o755)
except OSError:
pass
def _write_env_if_missing() -> None:
@@ -71,6 +94,7 @@ def ensure_runtime_layout() -> None:
_copy_tree_if_missing(BUNDLED_SOURCE_7ZIP, SEVEN_ZIP_DIR)
_copy_tree_if_missing(BUNDLED_SOURCE_ODBC, ODBC_DIR)
_ensure_seven_zip_executable()
from ..constants import DB_PATH