gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 188Rust 55Shell 30Markdown 281211 Definiciones

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.

d2527284b9fd6687fdfc1d5fe3570c05e728d87f · por Sergio · (hace 1 mes) · padre 00910be94 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

1 archivos · +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; }