Los imports github salen con commit=tag flotante (v1.1.0); el pin lo resuelve al SHA inmutable
⇒ el laboratorio se vuelve determinista al estilo Nix (origen anclado a un punto fijo).
- hammer-cli: `hammer pin <recipe>` (in-place o --out). Usa `git ls-remote` (host-agnóstico, sin
API ni tokens ni rate-limits), prefiere el commit dereferenciado `^{}` para tags anotados.
Reescritura DIRIGIDA de la línea `commit = "<tag>"` (preserva comentarios/formato; no toca
version u otras que casen). No-op si ya es SHA (idempotente) o tarball (ya anclado por sha256).
is_git_sha (40 hex sha1 / 64 hex sha256). +1 test.
- scripts/pin-recipes.sh: ancla en lote (recipes/*.toml).
- Validado real: sd v1.1.0 → 4a7b216552d6… (git ls-remote), idempotente. 31 suites verde.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
1020 B
Bash
Executable File
23 lines
1020 B
Bash
Executable File
#!/bin/sh
|
|
# pin-recipes.sh <recipe.toml...> — Etapa G Fase 2 (sello inmutable): ancla en LOTE el `commit`
|
|
# de cada receta git, resolviendo tags flotantes → SHA vía `git ls-remote` (ADR 0006). Los tarball
|
|
# (ya anclados por sha256) y las que ya tienen SHA se saltean. El laboratorio se vuelve determinista
|
|
# al estilo Nix: cada origen queda fijado a un punto inmutable de la historia.
|
|
#
|
|
# Ej: scripts/pin-recipes.sh recipes/*.toml | find recipes -name '*.toml' | xargs scripts/pin-recipes.sh
|
|
set -eu
|
|
HAMMER="${HAMMER:-cargo run -q -p hammer-cli --}"
|
|
[ "$#" -gt 0 ] || { echo "uso: pin-recipes.sh <recipe.toml...>" >&2; exit 1; }
|
|
|
|
pinned=0; skipped=0; failed=""
|
|
for r in "$@"; do
|
|
if $HAMMER pin "$r" 2>&1 | grep -q '→'; then
|
|
pinned=$((pinned + 1))
|
|
elif $HAMMER pin "$r" >/dev/null 2>&1; then
|
|
skipped=$((skipped + 1)) # ya anclado / tarball
|
|
else
|
|
failed="$failed $(basename "$r")"
|
|
fi
|
|
done
|
|
echo "pin: $pinned anclados, $skipped salteados (ya-SHA/tarball).${failed:+ FALLARON:$failed}"
|