pack: el control del target_bin AVISA, no aborta — abortar dejaba 65 paquetes fuera del catálogo

El control que agregué en el commit anterior era el natural y estaba mal: publicar el perfil
`servidor` entero con él dejó 65 de 175 paquetes fuera, porque son LIBRERÍAS (zlib, ncurses,
openssl, musl-*, gmp…) que no traen ningún binario y existen para que otros las resuelvan como
dep — un campo que su consumidor ni mira habría tirado un tercio del repo. Lo destapó el barrido,
no el razonamiento: la versión que abortaba pasaba los tests igual.

Ahora: corrige el path si el binario quedó en otro bindir (que es el caso que importa), y si no
hay ninguno lo dice y publica igual.

Medido con el perfil `servidor`: 162 publicados y firmados, 8 con target_bin corregido (bash, sed,
tar, parted, dhcpcd, squid, wpa_supplicant, zsh — todos publicados hasta hoy prometiendo un path
que no existe), 64 sin binario, 12 sin sellar en este store, 1 fallo (os-release, ya conocido).
Contra el repo firmado por HTTP: parted (6 parches + binario en /usr/sbin) instala en 0,17 s y
responde 3.7; bash responde 5.3.0(1).

Queda vivo: `install <librería>` directo sigue fallando tras hidratar (el .swm exige que el
target_bin exista). Hacer el campo opcional toca el formato — su propia unidad de trabajo.
This commit is contained in:
Sergio
2026-09-21 18:34:17 +00:00
parent 8f8c105e7d
commit 7be17b5a2a
2 changed files with 42 additions and 9 deletions
+13 -6
View File
@@ -4009,12 +4009,19 @@ fn target_bin_verificado(
return Ok(corregido);
}
}
anyhow::bail!(
"el artefacto {} no trae ningún '{bin}' en bin/, usr/bin/, sbin/, usr/sbin/ ni \
usr/local/bin/: el paquete prometería un binario que no existe y el `install` fallaría \
DESPUÉS de hidratar. Fijá el path real con --target-bin",
root.display()
)
// No abortamos: la mitad del perfil `servidor` son LIBRERÍAS (zlib, ncurses, openssl, musl-*)
// que no traen ningún binario y que se publican para que otros las resuelvan como dep — cortar
// acá dejaría 65 de 175 paquetes fuera del catálogo por un campo que su consumidor no mira.
// Pero se dice, porque `install <nombre>` DIRECTO sobre uno de ellos sí falla tras hidratar:
// el `.swm` exige hoy que el `target_bin` exista, y para una librería eso no tiene respuesta
// buena (es su propia unidad de trabajo — `target_bin` opcional toca el formato).
eprintln!(
"target_bin: el artefacto no trae ningún '{bin}' en bin/, usr/bin/, sbin/, usr/sbin/ ni \
usr/local/bin/ — publico '{target_bin}' igual (sirve como dependencia), pero un \
`install` directo de este paquete fallará DESPUÉS de hidratar. Fijalo con --target-bin \
si el binario existe con otro nombre."
);
Ok(target_bin)
}
/// Lee los patches declarados por la receta **en orden y uno por entrada** (nunca concatenados:
+29 -3
View File
@@ -521,9 +521,35 @@ después de hidratar los 1331 ficheros**:
Error: source_patch declara target_bin=/usr/bin/zsh pero no quedó en <prefix>/usr/bin/zsh
```
Con `--build` el artefacto está delante: ahora `pack` comprueba el path contra él, lo corrige si el
binario quedó en otro bindir (diciéndolo) y **aborta al publicar** si no hay ningún binario con ese
nombre. Un paquete que promete algo que no trae no debería llegar a existir.
Con `--build` el artefacto está delante: ahora `pack` comprueba el path contra él y lo **corrige**
si el binario quedó en otro bindir, diciéndolo.
**Y el primer intento fue abortar, que era lo natural y estaba MAL.** Al publicar el perfil
entero con esa versión, **65 de 175 paquetes se quedaron fuera del catálogo**: son las LIBRERÍAS
—zlib, ncurses, openssl, musl-\*, gmp…—, que no traen ningún binario y existen para que otros las
resuelvan como dep. Un campo que su consumidor ni mira habría tirado un tercio del repo. Así que
no aborta: avisa, y el paquete se publica. Lo mide el barrido de abajo, no el razonamiento — esa
versión pasaba los tests igual.
**Publicando el perfil `servidor` entero con el `pack` arreglado** *(medido, store del hub)*:
| | |
|---|---|
| publicados y firmados | **162** (el índice verifica contra su `trust`) |
| **`target_bin` corregidos** | **8: `bash` `sed` `tar` `parted` `dhcpcd` `squid` `wpa_supplicant` `zsh`** |
| sin binario (librerías) | 64 — se publican, con aviso |
| sin sellar en ESTE store | 12 |
| fallaron | 1 (`os-release`, el mismo del §6.46) |
Esos 8 son paquetes que **estaban publicados prometiendo un path que no existe**: `install bash`
habría hidratado y muerto al final. Comprobado después del arreglo, contra el repo firmado servido
por HTTP: `parted` (6 parches **y** binario en `/usr/sbin`) instala en 0,17 s y responde
`parted (GNU parted) 3.7`; `bash` instala y responde `5.3.0(1)-release`.
**Lo que queda vivo y no se tocó:** un `install <librería>` DIRECTO sigue fallando tras hidratar,
porque el `.swm` exige que el `target_bin` exista y para una librería no hay respuesta buena. Hacer
`target_bin` opcional toca el formato ([SDD 06](06-swm-format.md)) y es su propia unidad de trabajo.
Como dep funcionan, que es para lo que están en el catálogo.
**El lazo, después:** `takana install zsh --repo http://… --require-signed` ⇒ cache-hit del hash
anclado, **1331 ficheros hidratados en 0,14 s**, y el binario corre (`zsh 5.9`). Antes: recompilar