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:
+27
-9
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user