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.
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +27 −9
- scripts/atuq-nested.sh +27 −9
diff --git a/scripts/atuq-nested.sh b/scripts/atuq-nested.sh
index 863e5712..f613d1b5 100755
--- a/scripts/atuq-nested.sh
+++ b/scripts/atuq-nested.sh
@@ -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; }