Files
hammer/scripts/nix-import.sh
T
sergioandClaude Opus 4.8 b979d9e550 Etapa G: importador nix→receta (hammer import-nix + scripts/nix-import.sh)
Poblar el catálogo no es opcional: 34 recetas a mano = userland desierto. nixpkgs es el mayor set
de recetas DESDE FUENTE ⇒ semilla natural. Importamos la RECETA (source+hash+deps), nunca el
binario del cache de nix — hammer reconstruye desde fuente ("verificar, no confiar").

- crates/hammer-cli/nix_import.rs: consume el JSON normalizado de nix y emite una receta hammer.
  Clasifica el origen: fetchurl flat → tarball+sha256 (convierte el hash nix SRI/base32/hex → hex);
  fetchFromGitHub → repo+commit (hammer pinea por commit, no necesita el hash NAR). Filtra el ruido
  de stdenv (setup-hooks, wrappers). nix_base32 decode portado. 11 tests.
- `hammer import-nix [FILE|-]` (stdin) → receta .toml; valida que parsee como Recipe.
- scripts/nix-import.sh <attr>: `nix eval --apply` produce el JSON normalizado y lo pipea al
  importador. NIX_STORE= para store local si /nix/store no es escribible.
- VALIDADO contra nixpkgs REAL (nix 2.34): import hello (tarball, sha256→hex) + ripgrep (github→
  repo+commit); pipeline completo nix→import→pack→.swm probado con hello. 31 suites verde.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 07:41:50 -04:00

37 lines
2.0 KiB
Bash
Executable File

#!/bin/sh
# nix-import.sh <attr> — Etapa G: extrae de nixpkgs la "receta" de <attr> (source+hash+deps+flags,
# NO el binario) y la imprime como receta hammer vía `hammer import-nix`. Es la semilla del catálogo:
# nixpkgs es el mayor set de recetas desde fuente; importamos la receta y hammer reconstruye.
#
# Requiere `nix` (con nix-command). Ej: scripts/nix-import.sh hello > recipes/hello.toml
# Env: NIXPKGS=<flakeref> (default nixpkgs), HAMMER=<cmd> (default cargo run -q -p hammer-cli --)
set -eu
ATTR="${1:?uso: nix-import.sh <attr-de-nixpkgs> (ej: hello, jq, ripgrep)}"
NIXPKGS="${NIXPKGS:-nixpkgs}"
HAMMER="${HAMMER:-cargo run -q -p hammer-cli --}"
# NIX_STORE: si el /nix/store del sistema no es escribible (install single-user incompleta), apuntá
# a un store local, p.ej. NIX_STORE="local?root=$HOME/.nixstore".
STORE_OPT=""
[ -n "${NIX_STORE:-}" ] && STORE_OPT="--store ${NIX_STORE}"
NIXFLAGS="--extra-experimental-features nix-command --extra-experimental-features flakes ${STORE_OPT}"
# `nix eval --apply`: aplica una función al paquete y devuelve el JSON NORMALIZADO que el
# importador consume. Toma la URL+outputHash del `p.src` (la derivación fija del fetch) y los
# nombres de las deps; el importador clasifica (github→git, flat→tarball) y emite la receta.
json=$(nix eval $NIXFLAGS --json "${NIXPKGS}#${ATTR}" --apply '
p: {
pname = p.pname or (builtins.parseDrvName p.name).name;
version = p.version or (builtins.parseDrvName p.name).version;
source = {
url = p.src.url or (if (p.src.urls or []) == [] then "" else builtins.head p.src.urls);
output_hash = p.src.outputHash or "";
output_hash_mode = p.src.outputHashMode or "flat";
};
configure_flags = p.configureFlags or [];
build_inputs = builtins.filter (s: s != "") (map (x: x.pname or x.name or "") (p.buildInputs or []));
native_build_inputs = builtins.filter (s: s != "") (map (x: x.pname or x.name or "") (p.nativeBuildInputs or []));
}')
printf '%s' "$json" | $HAMMER import-nix -