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; }