From 77732edead25c141bc395015f4ca990a3f9cb8c1 Mon Sep 17 00:00:00 2001 From: Sergio Date: Mon, 14 Sep 2026 19:38:33 +0000 Subject: [PATCH] =?UTF-8?q?hydrate-profile:=20encontrar=20el=20binario=20d?= =?UTF-8?q?onde=20EST=C3=89=20=E2=80=94=20no=20s=C3=B3lo=20en=20el=20?= =?UTF-8?q?=C3=A1rbol=20de=20desarrollo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `HAMMER` estaba cableado a `ROOT/target/release/takana`, así que el guión no corre en una caja INSTALADA, donde el binario es `/usr/bin/takana` y `target/` ni existe: FileNotFoundError: [Errno 2] … '/opt/takana/target/release/takana' Es la misma deuda que este frente ya pagó dos veces —`respaldo-storagebox.sh` y el «unhashable 875» con el lab perfecto—: el instrumental asume que el hub es un árbol de desarrollo. Ahora busca en `$TAKANA`, `$HAMMER`, el árbol de desarrollo y el `PATH`, en ese orden. Salió al ir a actualizar la caja de producción a la imagen nueva, que es exactamente el caso de uso para el que no servía. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn --- scripts/hydrate-profile.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/scripts/hydrate-profile.py b/scripts/hydrate-profile.py index 8f081373..3d76a912 100755 --- a/scripts/hydrate-profile.py +++ b/scripts/hydrate-profile.py @@ -34,7 +34,22 @@ import yupana import targets as targets_mod ROOT = yupana.ROOT -HAMMER = str(ROOT / "target/release/takana") + +def _binario_takana(): + """El binario, buscado en los TRES sitios donde puede estar — no sólo en el árbol de desarrollo. + + Estaba cableado a `ROOT/target/release/takana` y por eso este script no corría en una caja + INSTALADA, donde el binario es `/usr/bin/takana` y `target/` ni existe. Es la misma deuda que el + frente del servidor ya pagó en `respaldo-storagebox.sh` y en los grafos («unhashable 875» con el + lab perfecto): el instrumental asume que el hub es un árbol de desarrollo. Falla al invocar, con + un `FileNotFoundError` que nombra una ruta que en esa máquina nunca va a existir. + """ + for c in (os.environ.get("TAKANA"), os.environ.get("HAMMER"), str(ROOT / "target/release/takana")): + if c and os.path.exists(c): + return c + return shutil.which("takana") or shutil.which("hammer") or str(ROOT / "target/release/takana") + +HAMMER = _binario_takana() def opcion(nombre, defecto=None):