From 7af2173014b07fdb5e176127417d832ce12c0a06 Mon Sep 17 00:00:00 2001 From: rafa Date: Mon, 24 Aug 2026 15:26:05 -0400 Subject: [PATCH] sync_audio_bulk.sh: parada dura real en --carta + ruta absoluta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - carta_article_ids() en sync_audio_to_prod.py ahora comprueba returncode del docker exec y lanza RuntimeError si falla, en vez de devolver una lista vacía silenciosa (bug preexistente: un fallo de Docker/consulta se confundía con "la carta no tiene artículos"). - El wrapper resuelve --carta a fichero temporal en vez de mapfile con sustitución de procesos (mapfile < <(cmd) no deja comprobar el exit code real de cmd), captura el rc de python explícitamente y aborta con exit 1 sin sincronizar nada si la consulta falla. - sys.path ya no depende del cwd ("scripts" relativo): se pasa la ruta absoluta de SCRIPT_DIR al script inline. Probado: --carta real sin cambios de comportamiento (28 candidatos, ok=21/skip=7); consulta rota a propósito (FEA_DB_CONTAINER inexistente) aborta limpio con exit=1 y 0 sincronizaciones; invocación desde otro directorio de trabajo da el mismo resultado que desde la raíz del repo. Revisión de Codix en el PR #215. --- scripts/sync_audio_bulk.sh | 23 ++++++++++++++++++----- scripts/sync_audio_to_prod.py | 2 ++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/scripts/sync_audio_bulk.sh b/scripts/sync_audio_bulk.sh index c063b58..384f2aa 100755 --- a/scripts/sync_audio_bulk.sh +++ b/scripts/sync_audio_bulk.sh @@ -57,15 +57,28 @@ if [ -n "$ids_csv" ]; then elif [ -n "$ids_file" ]; then mapfile -t ids < "$ids_file" elif [ -n "$carta" ]; then - mapfile -t ids < <( - python3 - "$carta" <<'PYEOF' -import subprocess, sys -sys.path.insert(0, "scripts") + # No usar `mapfile < <(cmd)`: la sustitución de procesos no deja comprobar + # de forma fiable el exit code de `cmd` (mapfile ve su propio $?, no el de + # la tubería). Si la consulta falla, un array vacío se confundiría con + # "la carta no tiene artículos" y el lote saldría "éxito" sin sincronizar + # nada. Se resuelve a fichero temporal y se comprueba el rc de python + # explícitamente antes de poblar el array. + carta_tmpfile="$(mktemp)" + python3 - "$carta" "$SCRIPT_DIR" > "$carta_tmpfile" <<'PYEOF' +import sys +sys.path.insert(0, sys.argv[2]) from sync_audio_to_prod import carta_article_ids for pid in carta_article_ids(int(sys.argv[1])): print(pid) PYEOF - ) + py_rc=$? + if [ $py_rc -ne 0 ]; then + echo "ERROR: fallo consultando la cola de la carta $carta (exit $py_rc), no se sincroniza nada." >&2 + rm -f "$carta_tmpfile" + exit 1 + fi + mapfile -t ids < "$carta_tmpfile" + rm -f "$carta_tmpfile" else usage fi diff --git a/scripts/sync_audio_to_prod.py b/scripts/sync_audio_to_prod.py index 9a1ef30..31e83b4 100644 --- a/scripts/sync_audio_to_prod.py +++ b/scripts/sync_audio_to_prod.py @@ -86,6 +86,8 @@ def carta_article_ids(carta_id: int) -> list[int]: DB_NAME, "-N", "-e", q], capture_output=True, text=True, timeout=60, ) + if r.returncode != 0: + raise RuntimeError(f"consulta de _carta_id={carta_id} falló (rc={r.returncode}): {r.stderr.strip()[:300]}") return [int(x) for x in r.stdout.split() if x.isdigit()]