Files
takana/scripts/nix-import.sh
T
Sergio 1c3e185167 takana: las variables de entorno leen las dos formas, gana la nueva
TAKANA_X con caída a HAMMER_X (ADR 0016). No es un sed: estas variables son
contrato de usuario —knobs del instalador, el entorno del worker, mirror-env.sh—
y viven en perfiles de shell y units FUERA del repo, así que un renombre duro no
falla ruidosamente: la variable no aparece, se toma el default y el build se
comporta distinto sin que nada lo diga.

Rust: takana_core::env::{var,var_os} toma el nombre canónico y deriva el viejo
cambiando el prefijo — se le pasa TAKANA_* para que un grep del nombre nuevo
encuentre todas las lecturas. 5 tests, con DOS controles negativos: sin ninguna
de las dos no hay valor, y un nombre sin prefijo no inventa una caída.
Migrados los 17 sitios directos y los indirectos que el grep no mostraba
(bases_de_mirror, las constantes de kernel_cmd, ROOT_ENV de qorpa, env_path de
recover). takana-recover lleva la caída inline: es un mini-binario que se copia
a /usr/sbin y no vale arrastrarle una dep entera por dos líneas.

Scripts: 30 lecturas pasan a default, manteniendo el
nombre INTERNO de la variable para no tocar sus 190 usos.

Y donde el script EXPORTA en vez de leer, se ponen LAS DOS (mirror-env.sh y el
fragmento in-VM de bootstrap): ahí el lector puede ser un binario viejo —worker
sin recompilar, el /usr/bin/hammer pinado del baseline— que sólo conoce HAMMER_*.
La caída sirve para lectores nuevos; los viejos necesitan que la vieja siga puesta.

Verificado de punta a punta con el binario, no sólo con unit tests: HAMMER_LAB
sigue surtiendo efecto, TAKANA_LAB hace lo mismo, y con las dos gana TAKANA_LAB.
605 tests en verde y el hash de zlib sigue en b3:dc363f26… , intacto.

Cambio de comportamiento que va aparte y hay que decir: el hostname por defecto
de una instalación nueva pasa de 'hammer' a 'takana' (sólo si no se fija ninguna
de las dos variables).

NO se tocan: las rutas /var/lib/hammer de sistemas instalados, el volid
HAMMER_LIVE del ISO, ni el namespace HARKAQ_*, que es de otro subsistema.
2026-09-09 19:14:49 +00:00

42 lines
2.3 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 takana-cli --)
set -eu
ATTR="${1:?uso: nix-import.sh <attr-de-nixpkgs> (ej: hello, jq, ripgrep)}"
NIXPKGS="${NIXPKGS:-nixpkgs}"
HAMMER="${TAKANA:-${HAMMER:-cargo run -q -p takana-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 []));
# Rust: buildRustPackage setea cargoDeps ⇒ activa la plantilla Cargo del importador.
is_rust = builtins.hasAttr "cargoDeps" p;
# Go: buildGoModule setea vendorHash (goModules en versiones viejas) ⇒ plantilla Go.
is_go = builtins.hasAttr "vendorHash" p || builtins.hasAttr "goModules" p;
main_program = p.meta.mainProgram or p.pname or "";
}')
printf '%s' "$json" | $HAMMER import-nix -