Files
takana/scripts/farm/saldar-deuda-static.sh
T
Sergio 1c3e185167 takana: las variables de entorno leen las dos formas, gana la nueva
TAKANA_X con caída a HAMMER_X (ADR 0016). No es un sed: estas variables son
contrato de usuario —knobs del instalador, el entorno del worker, mirror-env.sh—
y viven en perfiles de shell y units FUERA del repo, así que un renombre duro no
falla ruidosamente: la variable no aparece, se toma el default y el build se
comporta distinto sin que nada lo diga.

Rust: takana_core::env::{var,var_os} toma el nombre canónico y deriva el viejo
cambiando el prefijo — se le pasa TAKANA_* para que un grep del nombre nuevo
encuentre todas las lecturas. 5 tests, con DOS controles negativos: sin ninguna
de las dos no hay valor, y un nombre sin prefijo no inventa una caída.
Migrados los 17 sitios directos y los indirectos que el grep no mostraba
(bases_de_mirror, las constantes de kernel_cmd, ROOT_ENV de qorpa, env_path de
recover). takana-recover lleva la caída inline: es un mini-binario que se copia
a /usr/sbin y no vale arrastrarle una dep entera por dos líneas.

Scripts: 30 lecturas pasan a default, manteniendo el
nombre INTERNO de la variable para no tocar sus 190 usos.

Y donde el script EXPORTA en vez de leer, se ponen LAS DOS (mirror-env.sh y el
fragmento in-VM de bootstrap): ahí el lector puede ser un binario viejo —worker
sin recompilar, el /usr/bin/hammer pinado del baseline— que sólo conoce HAMMER_*.
La caída sirve para lectores nuevos; los viejos necesitan que la vieja siga puesta.

Verificado de punta a punta con el binario, no sólo con unit tests: HAMMER_LAB
sigue surtiendo efecto, TAKANA_LAB hace lo mismo, y con las dos gana TAKANA_LAB.
605 tests en verde y el hash de zlib sigue en b3:dc363f26… , intacto.

Cambio de comportamiento que va aparte y hay que decir: el hostname por defecto
de una instalación nueva pasa de 'hammer' a 'takana' (sólo si no se fija ninguna
de las dos variables).

NO se tocan: las rutas /var/lib/hammer de sistemas instalados, el volid
HAMMER_LIVE del ISO, ni el namespace HARKAQ_*, que es de otro subsistema.
2026-09-09 19:14:49 +00:00

74 lines
3.8 KiB
Bash
Executable File

#!/bin/sh
# saldar-deuda-static.sh — reconstruye las recetas `link = "static"` cuyo hash VIGENTE no está
# sellado en el store (la "deuda de rebuild" que destapó `hammer hash`, 2026-07-17).
#
# POR QUÉ EXISTE. El trabajo reciente (matar-gcc migró 27 recetas C a zig, el frente static, harkaq
# declarando deps) cambió muchas recetas base sin re-sellarlas. Cada cambio re-hashea la receta Y
# todo lo que la declara como dep ⇒ una cascada de recetas cuyo artefacto sellado ya no corresponde
# a la receta de hoy. `scripts/static-audit.sh` las cuenta como "sin artefacto" (deuda real, ya no
# enmascarada). Este script las salda.
#
# NO HACE FALTA ORDEN TOPOLÓGICO: `hammer build` arrastra sus deps de build recursivamente
# (resolve_build_dep_hashes), así que construir `curl` construye `openssl` y `perl` primero. Se
# puede correr en cualquier orden; las cache-hit son instantáneas.
#
# DÓNDE CORRERLO. Pensado para el WORKER de la granja (store completo, toolchain que no rompe el
# stack GUI — ver etapa-g-gui-chain-boundary): `farm-up`, copiar este script y el repo, correrlo,
# `farm-down`. Corre igual en el laptop, pero el stack GUI (cairo/pango/gtk…) fallará por zig-skew:
# usá `SKIP_GUI=1` para saltarlo (default en laptop).
#
# LA DEUDA SE CALCULA EN VIVO, no de una lista que envejece: `hammer hash --check` por receta. Eso
# es exactamente lo que el audit usa para no auditar sellados rancios.
#
# Uso: scripts/farm/saldar-deuda-static.sh # construye toda la deuda
# DRY=1 scripts/farm/saldar-deuda-static.sh # sólo LISTA la deuda, no construye
# SKIP_GUI=1 scripts/farm/saldar-deuda-static.sh # salta el stack GUI (default si no hay DISPLAY-cap)
# Env: HAMMER (def target/release/takana), STORE (def ./store), JOBS no aplica (serie, por deps).
set -u
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
HAMMER="${TAKANA:-${HAMMER:-$ROOT/target/release/takana}}"
STORE="${STORE:-$ROOT/store}"
DRY="${DRY:-0}"
# El stack GUI no construye en el laptop (zig-skew rompe cairo). Default: saltarlo salvo que se pida.
SKIP_GUI="${SKIP_GUI:-1}"
GUI_RE='^(cairo|pango|gtk|harfbuzz|glib|gdk-pixbuf|libadwaita|gtksourceview|fribidi|graphene|fontconfig|adwaita|fcft|.*-hello|mirada|appstream|gnome)'
[ -x "$HAMMER" ] || { echo "no encuentro hammer en $HAMMER (cargo build --release -p takana-cli)"; exit 1; }
deuda=""; skipped_gui=""
for f in $(grep -lE '^[[:space:]]*link[[:space:]]*=[[:space:]]*"static"' recipes/*.toml); do
n=$(basename "$f" .toml)
# ¿el sellado VIGENTE (el que corresponde a la receta de HOY) está en el store? cache-hit ⇒ al día.
if "$HAMMER" --store "$STORE" hash --check "$f" >/dev/null 2>&1; then continue; fi
if [ "$SKIP_GUI" = "1" ] && echo "$n" | grep -qE "$GUI_RE"; then
skipped_gui="$skipped_gui $n"; continue
fi
deuda="$deuda $n"
done
n_deuda=$(echo "$deuda" | wc -w); n_gui=$(echo "$skipped_gui" | wc -w)
echo "== deuda static: $n_deuda recetas a reconstruir; $n_gui de stack GUI saltadas (SKIP_GUI=$SKIP_GUI)"
[ -n "$skipped_gui" ] && echo " GUI (correr en el worker):$skipped_gui"
[ "$DRY" = "1" ] && { echo "== DRY: no construyo. Deuda:$deuda"; exit 0; }
[ -z "$deuda" ] && { echo "== nada que saldar (o todo es GUI y se saltó)"; exit 0; }
ok=""; fail=""
for n in $deuda; do
printf ' → %-20s ' "$n"
if "$HAMMER" --store "$STORE" build "recipes/$n.toml" >/dev/null 2>&1; then
# verificar que el sellado vigente quedó (build pudo salir 0 y no sellar el hash esperado)
if "$HAMMER" --store "$STORE" hash --check "recipes/$n.toml" >/dev/null 2>&1; then
echo "✓ sellado"; ok="$ok $n"
else
echo "✗ construyó pero el hash vigente no quedó sellado"; fail="$fail $n(hash)"
fi
else
echo "✗ build falló"; fail="$fail $n(build)"
fi
done
echo "== saldados:$ok"
echo "== fallaron:$fail"
[ -z "$fail" ]