Etapa G (granja): promote más seguro — patches viajan con la receta + guarda de colisión
Dos bugs del promote de build-farm.sh, hallados al cosechar incoming-clib:
1. mv movía el .toml pero NO sus .patch (quedaban en la cola) ⇒ toda receta
parcheada fallaba el pack ("leyendo patch ...: No such file or directory").
Ahora mueve los patches referenciados junto al .toml.
2. mv sobrescribía a ciegas una receta canónica de recipes/ con una variante
homónima de la cola (p.ej. curl 8.11 mínimo-para-appstream pisando el
curl 8.20 full). Se agrega guarda: si ya existe recipes/<n>.toml, NO se
promueve la variante (queda staged para triage) ni se re-publica.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +16 −1
- scripts/build-farm.sh +16 −1
diff --git a/scripts/build-farm.sh b/scripts/build-farm.sh
index 8a98983e..6819cb48 100755
--- a/scripts/build-farm.sh
+++ b/scripts/build-farm.sh
@@ -58,7 +58,22 @@ if [ "$PROMOTE" = 1 ] && [ "$ok" -gt 0 ]; then
echo "==> promoviendo + publicando $ok al repo firmado…"
for s in "$FARM"/status/*.ok; do
n=$(basename "$s" .ok)
- [ -f "$QUEUE/$n.toml" ] && mv "$QUEUE/$n.toml" recipes/
+ # GUARDA DE COLISIÓN: si ya existe una receta canónica en recipes/ y la cola trae
+ # OTRA variante con el mismo nombre, NO la promovemos (mv sobrescribiría lo canónico:
+ # p.ej. un `curl` mínimo-para-appstream pisando el curl 8.20 full de la que dependen tools).
+ # Queda staged en la cola para triage manual; tampoco re-publicamos sobre lo canónico.
+ if [ -f "$QUEUE/$n.toml" ] && [ -f "recipes/$n.toml" ]; then
+ printf " = %s (ya existe recipes/%s.toml canónica — NO promovido, queda en %s)\n" "$n" "$n" "$QUEUE"
+ continue
+ fi
+ if [ -f "$QUEUE/$n.toml" ]; then
+ # mover la receta Y sus patches referenciados (viven junto al .toml en la cola);
+ # si no, `pack` no los encuentra en recipes/ y falla toda receta parcheada.
+ for p in $(grep -oE '"[^"]+\.patch"' "$QUEUE/$n.toml" | tr -d '"'); do
+ [ -f "$QUEUE/$p" ] && mv -f "$QUEUE/$p" recipes/
+ done
+ mv "$QUEUE/$n.toml" recipes/
+ fi
"$HAMMER" --store "$STORE" pack "recipes/$n.toml" --repo "$REPO" --distro-version "$DISTRO" --build >/dev/null 2>&1 \
&& printf " + %s\n" "$n" || printf " ! %s (pack falló)\n" "$n"
done