diff --git a/scripts/farm/exp-ec.sh b/scripts/farm/exp-ec.sh index 460b4829..0b75627b 100755 --- a/scripts/farm/exp-ec.sh +++ b/scripts/farm/exp-ec.sh @@ -43,14 +43,30 @@ while read -r r; do /^(compile|install|configure|check|prepare) = .{3}$/ { print; print "set -e"; inb=1; next } { print } ' "$r" > "$REC/exp-ec-$n.toml" - # `exit 77` como última línea de la última fase del fichero - last=$(grep -n "^'''$" "$REC/exp-ec-$n.toml" | tail -1 | cut -d: -f1) + # El `exit 77` va al cierre de la ÚLTIMA FASE, que NO es la última `'''` del fichero: una receta + # puede traer bloques `'''` después de las fases (un `[[service]]`, una nota larga). MEDIDO el + # 2026-09-18: en `dwarves`, `elfutils` y `elfutils-libdw` el `exit 77` cayó fuera de toda fase, el + # build corrió entero y SELLÓ — con el hash movido por el `set -e`, o sea basura en el store. Por + # eso acá se rastrea la anidación en vez de buscar la última comilla triple. + last=$(awk ' + /^(compile|install|configure|check|prepare) = .{3}$/ { dentro=1; next } + dentro && /^.{3}$/ { fin=NR; dentro=0 } + END { print fin }' "$REC/exp-ec-$n.toml") + [ -n "$last" ] || { echo "[SIN-FASES] $n"; printf '%s\t%s\t%s\n' "$n" "SIN-FASES" "" >> "$OUT"; rm -f "$REC/exp-ec-$n.toml"; continue; } [ -n "$last" ] && sed -i "${last}i exit 77" "$REC/exp-ec-$n.toml" log="$TMP/$n.log" - timeout "$TLIMITE" flock -o "$LOCK" "$TAKANA" build "$REC/exp-ec-$n.toml" > "$log" 2>&1 + timeout "$TLIMITE" flock -o "$LOCK" "$TAKANA" ${STORE:+--store "$STORE"} build "$REC/exp-ec-$n.toml" > "$log" 2>&1 rc=$? - if grep -q "exit 77" "$log"; then v="SOBREVIVE" + # ⚠ El veredicto se lee en el ESTADO DE SALIDA que reporta takana, NO buscando `exit 77` en el + # log: takana IMPRIME el script de la fase, así que esa cadena aparece SIEMPRE — la inyectamos + # nosotros. Buscarla a secas daría SOBREVIVE hasta a un build que selló. + if grep -q "build phase falló (exit 77)" "$log"; then v="SOBREVIVE" + elif grep -qE "sealed path=\S*-$n\$" "$log"; then + # No debería pasar nunca: si selló, el `exit 77` no llegó a correr y el artefacto lleva el hash + # MOVIDO por el `set -e` ⇒ es basura en el store. Se grita con el hash para poder borrarlo. + v="SELLO-INDEBIDO" + echo " ⚠⚠ $n SELLÓ — basura: $(grep -oE "sealed path=\S+" "$log" | tail -1 | sed 's|.*/||')" elif [ $rc -eq 124 ]; then v="TIMEOUT" elif grep -qE "build phase falló \(exit [0-9]+\)" "$log"; then v="SE-ROMPE" else v="OTRO"; fi