Files
sergioandClaude Opus 5 a6a9d59e4f licencias: 936 de 1141 (82%) — detección por evidencia, con sus dos imprecisiones declaradas
Esta mañana eran 0. Tras la tabla curada (228) y este paso, 936. Ninguna receta se
re-hasheó: verificado en 30 de las 708 tocadas, 30 hashes idénticos, 0 cambiados.

DE DÓNDE SALE EL DATO, Y POR QUÉ NO ES ADIVINAR. `scripts/licencias-detectar.sh` consulta
la API /repos/{o}/{r}/license de GitHub para las 673 recetas cuya fuente vive allí. Eso
devuelve el resultado de DETECTAR el fichero LICENSE que el repo tiene de verdad
(licensee), no una etiqueta escrita a mano en una web: es la misma evidencia que veríamos
abriendo el tarball, obtenida sin bajar 673 tarballs por un enlace de 8 Mbps. 610 con SPDX
definido; las 63 que GitHub marca NOASSERTION/other se DESCARTAN — un «no sé» de la fuente
se propaga como hueco, no se redondea a una licencia plausible.

Las familias no-GitHub van curadas por la URL DE FUENTE, que es la evidencia que el nombre
no da. Y ahí cometí el error simétrico al que este mismo fichero advertía: había puesto
`knighttime` entre las «herramientas Go» POR SU NOMBRE, y su tarball sale de
download.kde.org — es un Framework de KDE, LGPL. Descartar por nombre falla igual que
aceptar por nombre. Corregido en la cabecera.

LAS DOS IMPRECISIONES, contables con `licencias.sh --revisar` en vez de escondidas:

 1. SPDX OBSOLETOS Y AMBIGUOS (71 recetas). GitHub devuelve `GPL-3.0`, `LGPL-2.1`,
    `AGPL-3.0`… identificadores que SPDX declaró obsoletos PRECISAMENTE porque no
    distinguen `-only` de `-or-later`, y esa diferencia decide con qué se puede combinar el
    paquete. NO se normalizan a ciegas: mapear GPL-3.0 → GPL-3.0-or-later sería inventar el
    dato que falta. Quedan marcadas para resolver mirando el fuente.

 2. LICENCIAS DOBLES COLAPSADAS. La API devuelve UNA sola licencia y muchos proyectos Rust
    son «MIT OR Apache-2.0» (p.ej. `fd` quedó como Apache-2.0). No es falso —cumplir una de
    las opciones concedidas basta— pero es incompleto. Lo resuelve el cierre estructural:
    leer el campo `license` del Cargo.toml en la fase de fetch.

Y un fallo que habría escrito basura en silencio: `licencias-detectadas.tsv` tiene TRES
columnas (añade el owner/repo consultado, para poder auditar) y el sembrador leía dos, así
que la licencia se habría llevado pegado el slug — `license = "MIT<TAB>owner/repo"`, sin
que nada lo validara. Arreglado antes de sembrar.

Quedan 205 sin licencia y 71 por desambiguar.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 13:26:22 -04:00

84 lines
4.7 KiB
TOML

# Importada de Alpine aports por `hammer import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Pendiente: el
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
name = "helix"
version = "25.07.1"
license = "MPL-2.0"
[source]
tarball = "https://github.com/helix-editor/helix/archive/25.07.1/helix-25.07.1.tar.gz"
# FIXME sha256: el wrapper lo calcula (Alpine publica sha512). sha512 de Alpine:
# sha512 = "a8f64782273d88cd43b1aeadf45d1fa6a913c9c0b77c1da716ffdc64ec02e89db1bfb2dde4333509c3ddb5733b8f5a450b44ca54d35f113c3c0f411c01f4ce8c"
sha256 = "27c8bc3eba46bc7bab1e3629c6b28ff94882eeff17366b3ea69cd8ceffba7541"
patches = ["fix-gotmpl-grammar-source.patch"]
# GUETO gcc: helix trae tree-house-bindings (tree-sitter en C); cc-rs hace detección de familia
# de compilador con `zig -E` y zig la rechaza. compiler="gcc" usa el musl gcc de Alpine.
[build]
compiler = "gcc"
target = "x86_64-linux-musl"
link = "static"
flags = []
[build.phases]
# Fase compile custom OBLIGATORIA (a diferencia de tuc, que la borró): helix necesita exportar dos
# env vars antes de cargo, y el path default del lab no da dónde ponerlas. Pero entonces hay que
# REPLICAR A MANO el setup estático del lab — mismo patrón que cargo-edit.
#
# POR QUÉ (2026-07-17, frente static-audit): el `cargo build --frozen --release` que traía la receta
# importada de Alpine PISABA el comando del lab entero (`resolve_phases` sólo autogenera la fase si la
# receta no la trae: `if out.compile.is_none()`). Al pisarlo se perdían las tres cosas que hacen
# honesto al `link = "static"`: `+crt-static` (musl adentro), `relocation-model=static` (ET_EXEC en vez
# de PIE) y `-C linker=.hammer-zig-cc` (el wrapper que sanea el triple `x86_64-alpine-linux-musl`, que
# zig rechaza). hx salía PIE dinámico con `NEEDED: libgcc_s.so.1, libc.so`.
#
# Ese `libgcc_s` NO lo metían las tree-house-bindings ni ningún otro C: es el UNWINDER de la std de
# rustc, que sin `+crt-static` se enlaza dinámico contra el libgcc_s de Alpine. El fix de C/C++
# (`-static-libgcc`) acá no aplica. Prueba: tuc es Rust puro, sin una línea de C, y arrastraba el
# MISMO libgcc_s por la misma causa.
#
# `crt-static` va TRAS `cargo rustc --` y NUNCA en RUSTFLAGS: en build nativo RUSTFLAGS alcanza también
# a los proc-macros (un proc-macro es un dylib PIC) y rustc aborta con "cannot produce proc-macro".
# Como `cargo rustc --` exige UN único target, se fija `--bin hx`. Y `-p helix-term` porque la raíz de
# helix es un manifiesto VIRTUAL (workspace sin paquete propio): sin `-p`, cargo rustc corta con
# "is a virtual manifest, but this command requires running against an actual package". helix-term es
# quien declara `[[bin]] name = "hx"`.
#
# CC=gcc: el GUETO declarado arriba (cc-rs compila el tree-sitter en C y rechaza zig). El linker sigue
# siendo zig-cc: los .o de gcc-musl y el Rust zig-musl son ABI-compatibles (ambos musl, mismo ELF).
compile = '''
# This path is embedded in the resulting binary so that helix can find system grammars
# https://github.com/helix-editor/helix/blob/25.01.1/helix-loader/src/lib.rs#L64
export HELIX_DEFAULT_RUNTIME=/usr/share/helix/runtime
# Sandbox hermético: helix-term/build.rs intenta `git clone` de 245 gramáticas tree-sitter
# (sin red ⇒ panic). Lo desactivamos; las gramáticas van por runtime/ (build post-install).
export HELIX_DISABLE_AUTO_GRAMMAR_BUILD=1
# de-Alpinizado: cargo-auditable no está en el lab de hammer; build plano (Etapa G)
printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec zig cc -mcpu=baseline "$@"' > "$PWD/.hammer-zig-cc"
chmod +x "$PWD/.hammer-zig-cc"
RF="-C linker=$PWD/.hammer-zig-cc"
rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
CC=gcc CXX=g++ AR=ar RUSTFLAGS="$RF" cargo rustc --release --locked --offline -p helix-term --bin hx -- -C target-feature=+crt-static -C relocation-model=static
'''
# de package() de Alpine (traducido $pkgdir→/out):
install = '''
_abuild_phase() {
install -D -m755 target/release/hx -t "/out"/usr/bin/
install -D -m644 contrib/completion/hx.bash "/out"/usr/share/bash-completion/completions/hx
install -D -m644 contrib/completion/hx.fish "/out"/usr/share/fish/vendor_completions.d/hx.fish
install -D -m644 contrib/completion/hx.zsh "/out"/usr/share/zsh/site-functions/_hx
install -D -m644 contrib/Helix.desktop -t "/out"/usr/share/applications/
install -D -m644 logo.svg "/out"/usr/share/icons/hicolor/scalable/apps/Helix.svg
install -d -m755 "/out"/usr/share/"helix"
rm runtime/grammars/.gitkeep
rm runtime/themes/README.md
rm -rf runtime/grammars/sources
cp -r runtime "/out"/usr/share/"helix"
}
_abuild_phase
'''