Files
hammer/scripts/product-userland-from-repo.sh
T
sergioandClaude Opus 4.8 d41f1705e6 imagen↔repo: install hidrata userland del repo firmado + 2 fixes de path
Cierra el lazo Etapa F+G: el userland del producto se arma vía `hammer install
--repo --prefix --require-signed` desde el repo firmado, no del bootstrap
hardcodeado. scripts/product-userland-from-repo.sh hidrata un set curado (13+
tools validados estáticos del repo).

Dos bugs reales del path install/pack encontrados+arreglados:
1. pack derivaba target_bin=/usr/bin/{name}; para paquetes con binario≠nombre
   (ripgrep→rg, repgrep→rgr) quedaba mal y el sanity-check de install fallaba.
   Ahora pack lo deriva del flag `--bin <X>` de la receta Cargo.
2. La reproducción del source_patch derivaba el NOMBRE de la receta del
   target_bin ⇒ "rg" ≠ "ripgrep" del corpus ⇒ no cache-hit ⇒ rebuild + dup en
   el store (find_by_hash ambiguo). build_source_patch/run_apply ahora reciben
   el nombre del paquete (install/bootstrap lo pasan; apply=None) ⇒ cache-hit
   del artefacto del corpus, sin duplicar.

(El "EACCES" inicial era sólo --store ausente: DEFAULT_STORE=/store root-only.)
hammer-build 49/49 tests ok; ripgrep install validado e2e (rg hidratado).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 16:54:39 -04:00

53 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# product-userland-from-repo.sh — arma el USERLAND del producto HIDRATÁNDOLO desde el REPO FIRMADO
# (Etapa F+G, cierre del lazo): por cada paquete corre `hammer install --repo <repo> --prefix <rfs>
# --require-signed`, que verifica la firma del release, reproduce desde el `.swm` (cache-hit si ya
# está en el store) e hidrata el FHS bajo el prefix. El resultado es un árbol de userland cuya cadena
# de suministro entera viene del repo firmado, no del bootstrap hardcodeado.
#
# Uso: ./scripts/product-userland-from-repo.sh [pkg...] # default: set curado
# PKGS="bat fd jq" ./scripts/product-userland-from-repo.sh
# OVER=work/product-image/rootfs ./scripts/product-userland-from-repo.sh # hidratar SOBRE un rootfs base
# Env: REPO (def dist/repo) TRUST (def dist/keys) RFS (def work/product-userland) STORE (def ./store)
# OVER (si está, hidrata SOBRE ese dir en vez de uno limpio — p.ej. el product-rootfs base)
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
REPO="${REPO:-dist/repo}"; TRUST="${TRUST:-dist/keys}"; STORE="${STORE:-./store}"
RFS="${OVER:-${RFS:-work/product-userland}}"
DB="$RFS/var/lib/hammer/installed.json"
# Set curado por defecto: el userland CLI "real" que hace usable a la distro. Todos deben estar en el
# índice del repo firmado. Editá/pasá args para cambiarlo.
DEFAULT_PKGS="bat fd ripgrep jq zoxide dust procs htop less tree hyperfine delta eza sd tokei fzf skim git-cliff gitui starship"
PKGS_LIST="${PKGS:-${*:-$DEFAULT_PKGS}}"
[ -n "${OVER:-}" ] || { rm -rf "$RFS"; mkdir -p "$RFS"; }
mkdir -p "$(dirname "$DB")"
echo "==> hidratando userland desde el repo firmado ($REPO) → $RFS"
ok=0; skip=0; fail=0; got=""
for pkg in $PKGS_LIST; do
# ¿está en el índice del repo? (evita abortar por un nombre ausente)
if ! grep -q "\"$pkg\"" "$REPO/index.json" 2>/dev/null; then
printf " - %-16s (no está en el repo, salteado)\n" "$pkg"; skip=$((skip+1)); continue
fi
if NO_PROXY=localhost NIX_STORE="${NIX_STORE:-$HOME/.nixstore}" \
"$ROOT/target/release/hammer" --store "$STORE" install "$pkg" \
--repo "$REPO" --prefix "$RFS" --trust "$TRUST" --require-signed --db "$DB" \
>/dev/null 2>"$RFS/.install-$pkg.log"; then
printf " ✓ %-16s\n" "$pkg"; ok=$((ok+1)); got="$got $pkg"
else
printf " ✗ %-16s (ver %s)\n" "$pkg" "$RFS/.install-$pkg.log"; fail=$((fail+1))
fi
done
echo "==> userland: $ok hidratados, $skip ausentes, $fail fallaron"
# verificación: cada binario presente + estático
echo "==> verificación (estático + presente):"
for pkg in $got; do
b=$(find "$RFS/usr/bin" -maxdepth 1 -type f \( -name "$pkg" -o -name "*$pkg*" \) 2>/dev/null | head -1)
[ -n "$b" ] && printf " %-16s %s\n" "$pkg" "$(file -b "$b" 2>/dev/null | grep -oE 'statically linked|dynamically linked' || echo '?')"
done
rm -f "$RFS"/.install-*.log 2>/dev/null || true
echo "==> binarios en $RFS/usr/bin: $(ls "$RFS/usr/bin" 2>/dev/null | wc -l)"