#!/bin/sh # build-repo.sh — Etapa F (dogfood): puebla un REPO DE PAQUETES takana desde el corpus # `recipes/*.toml` y firma el release. Convierte la maquinaria de paquetería en la cadena de # suministro real de la distro: cada receta se vuelve un `.swm` (mutación sobre fuente), el repo # es el catálogo firmado, y `takana install --repo ` lo reproduce localmente. # # Para cada receta intenta ANCLAR el `expected_hash` con `pack --build` (instantáneo si el # artefacto ya está sellado en el store — cache-hit; ver takana-build::build). Si construir desde # cero excede el timeout (o falla), cae a `pack` sin ancla: la entrada del catálogo igual existe y # el `source_patch` sigue siendo reproducible, sólo sin hash del autor contra el que comparar. # # Env: # REPO= destino del repo (default ./dist/repo) # STORE= store con artefactos cacheados (default ./store) # KEY= clave privada ed25519 para firmar el release (default: genera una efímera) # DISTRO= distro_version de la base de los paquetes (default dev) # BUILD_TIMEOUT segundos máx por `pack --build` antes de caer a pack sin ancla (default 90) set -eu REPO="${REPO:-$(pwd)/dist/repo}" STORE="${STORE:-./store}" DISTRO="${DISTRO:-dev}" BUILD_TIMEOUT="${BUILD_TIMEOUT:-90}" HAMMER="cargo run -q -p takana-cli --" rm -rf "$REPO" mkdir -p "$REPO" # Clave de firma del release: la pasada por KEY, o una efímera en el dir del repo. KEYDIR="$(dirname "$REPO")/keys" if [ -z "${KEY:-}" ]; then mkdir -p "$KEYDIR" if [ ! -f "$KEYDIR/release.ed25519" ]; then $HAMMER keygen release --out "$KEYDIR" >/dev/null fi KEY="$KEYDIR/release.ed25519" echo "firmando el release con clave efímera $KEY" fi anchored=0; plain=0; failed="" for r in recipes/*.toml; do name=$(basename "$r" .toml) if timeout "$BUILD_TIMEOUT" $HAMMER --store "$STORE" pack "$r" \ --repo "$REPO" --distro-version "$DISTRO" --build >/dev/null 2>&1; then anchored=$((anchored + 1)) elif $HAMMER pack "$r" --repo "$REPO" --distro-version "$DISTRO" >/dev/null 2>&1; then plain=$((plain + 1)) else failed="$failed $name" fi done $HAMMER repo sign --repo "$REPO" --key "$KEY" echo $HAMMER repo list --repo "$REPO" echo echo "poblado: $anchored con expected_hash anclado, $plain sin ancla.${failed:+ FALLARON:$failed}" echo "repo en $REPO (firmado). probá: hammer install --repo $REPO --trust $KEYDIR --require-signed"