atuq-nested: el rootfs se revalida por HASH, no por existencia

El script daba por bueno el rootfs si el directorio estaba: «¿ya está hidratado?». Es la pregunta
equivocada. Tras el re-hash de la cadena atk→gtk3→firefox→atuq el directorio seguía ahí con los
artefactos VIEJOS, así que habría abierto contento la versión que acabábamos de arreglar y el
diagnóstico habría sido buscar en el sitio equivocado. Misma forma del cache-hit que congela
regresiones.

Ahora resuelve los hashes vigentes, los anota en `.raices` y rehidrata cuando difieren.

De paso: nada de `diff <(...)`, que es de bash. El shebang dice /bin/sh y un script que sólo anda
cuando /bin/sh resulta ser bash es una trampa que salta en otra máquina.
This commit is contained in:
Sergio
2026-09-05 11:52:18 +00:00
parent 00910be94d
commit d2527284b9
+27 -9
View File
@@ -38,19 +38,37 @@ RAICES="atuq gtk3 atk gdk-pixbuf pango cairo libepoxy glib-shared pcre2-shared l
libjpeg-turbo-shared wayland libxkbcommon mesa libdrm dbus pipewire pulseaudio alsa-lib
libxml2-shared dejavu-fonts"
if [ "${REHIDRATAR:-0}" = "1" ] || [ ! -d "$RFS/usr/lib/atuq" ]; then
# ── EL ROOTFS SE REVALIDA POR HASH, NO POR EXISTENCIA ──────────────────────────────────────────
# «Ya está hidratado» es la pregunta equivocada: tras cualquier re-hash del corpus el directorio
# sigue ahí, con los artefactos VIEJOS, y el script abriría contento la versión que acabás de
# arreglar. Es la misma forma del cache-hit que congela regresiones. La pregunta correcta es si los
# hashes VIGENTES son los que están puestos, así que se anota la lista resuelta y se compara.
VIGENTES=""
faltan=""
for r in $RAICES; do
h="$("$H" --store "$STORE" hash "recipes/$r.toml" 2>/dev/null | tail -1 | sed 's/^b3://')"
if [ -z "$h" ] || [ ! -d "$STORE/$h-$r" ]; then faltan="$faltan $r"; continue; fi
VIGENTES="$VIGENTES$h-$r
"
done
# Un nodo sin artefacto NO se saltea en silencio: un rootfs al que le faltan tres paquetes arranca
# y falla tres capas más abajo.
[ -z "$faltan" ] || { echo "✗ faltan artefactos:$faltan" >&2; exit 1; }
SELLO="$RFS/.raices"
if [ "${REHIDRATAR:-0}" = "1" ] || [ ! -f "$SELLO" ] || [ "$VIGENTES" != "$(cat "$SELLO")" ]; then
# Nada de `diff <(...)`: esto es /bin/sh, y la sustitución de proceso es de bash. Un script que
# sólo funciona cuando /bin/sh resulta ser bash es una trampa que salta en otra máquina.
[ -f "$SELLO" ] && echo "==> el rootfs está DESACTUALIZADO — se rehidrata"
echo "==> hidratando $(echo $RAICES | wc -w) raíces en $RFS"
rm -rf "$RFS"; mkdir -p "$RFS"
faltan=""
for r in $RAICES; do
h="$("$H" --store "$STORE" hash "recipes/$r.toml" 2>/dev/null | tail -1 | sed 's/^b3://')"
if [ -z "$h" ] || [ ! -d "$STORE/$h-$r" ]; then faltan="$faltan $r"; continue; fi
"$H" --store "$STORE" hydrate "$h" --into "$RFS" >/dev/null
echo "$VIGENTES" | while read -r d; do
[ -n "$d" ] && "$H" --store "$STORE" hydrate "${d%%-*}" --into "$RFS" >/dev/null
done
# Un nodo sin artefacto NO se saltea en silencio: un rootfs al que le faltan tres paquetes
# arranca y falla tres capas más abajo.
[ -z "$faltan" ] || { echo "✗ faltan artefactos:$faltan" >&2; exit 1; }
printf '%s' "$VIGENTES" > "$SELLO"
echo "==> hidratado: $(find "$RFS" -type f | wc -l) ficheros"
else
echo "==> rootfs al día ($(echo "$VIGENTES" | grep -c . ) raíces, hashes vigentes)"
fi
[ -n "${WAYLAND_DISPLAY:-}" ] || { echo "✗ no hay WAYLAND_DISPLAY — esto necesita una pantalla" >&2; exit 1; }