licencias: la declaración del autor manda — y arreglo 5 recetas que ROMPÍ y commiteé
Dos cosas: una mejora de calidad y un fallo mío que hay que contar entero.
═══ EL FALLO: escribí un error JSON dentro de 5 recetas y las commiteé rotas ═══
En `a6a9d59`, cinco recetas quedaron con
license = "{"message":"Not Found","documentation_url":"...","status":"404"}"
Causa: cuando el repo da 404 (renombrado, borrado, privado), `gh api` escribe el CUERPO DEL
ERROR en stdout y el filtro `--jq` falla, así que la variable queda valiendo el JSON. Mi
`case` sólo descartaba ""/null/NOASSERTION/other ⇒ el JSON pasó como si fuera una licencia.
Las comillas ROMPEN el TOML, y esas 5 recetas dejaron de parsear y de tener ArtifactHash.
No lo vio nadie leyendo: lo cazó la comparación de hashes, al detectar que `cargo-sort`
había cambiado. Afectadas: cargo-sort, cargo-audit, cargo-binstall, waybackurls, usbutils.
La lección no es «se me pasó un caso», es que **validé los «no sé» conocidos en vez de la
FORMA del dato**. Ahora se acepta sólo lo que tiene forma de expresión SPDX, y la barrera
está en los DOS sitios que escriben (detectar y sembrar), más un GUARDIÁN en el informe que
sale ≠0 si alguna licencia tiene forma imposible. Un fallo aguas arriba disfrazado de dato
hay que verlo sin buscarlo.
Y de paso normalizadas 11 licencias con la barra antigua de Cargo (`MIT/Apache-2.0`), que
no es SPDX válido. Traducir la barra a OR no es inferir: Cargo documentó esa equivalencia.
═══ LA MEJORA: `scripts/licencias-cargo.sh` ═══
Lee la licencia que el AUTOR declara en su Cargo.toml, pidiéndola AL TAG QUE LA RECETA
PINEA (`?ref=v<version>`, con HEAD como último recurso y anotando cuál se usó). 176
obtenidas, 167 al tag exacto. Es la fuente más autoritativa de las que usamos y corrige los
dos defectos de la detección por API de una vez:
· las licencias DOBLES dejan de colapsar: `fd` pasa de `Apache-2.0` a `MIT OR Apache-2.0`,
`ripgrep` a `Unlicense OR MIT`, `bat` a `MIT OR Apache-2.0`;
· los SPDX AMBIGUOS caen de 71 a 55, porque el autor sí escribe -only/-or-later.
66 corregidas, 7 nuevas. Y aparecieron cosas que la detección había perdido: `eza` es
EUPL-1.2, una copyleft europea que se habría empaquetado creyendo otra cosa.
Jerarquía de evidencia, escrita en la cabecera del script: nombre (prohibido) < familia/URL
de fuente < API de licencias de GitHub < Cargo.toml del autor.
997 de 1141 (87%). Verificación COMPLETA sobre las 77 recetas tocadas —no una muestra—:
0 hashes cambiados, y 5 que ahora parsean y en HEAD no.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
81 archivos · +389 −73
- docs/licencias-cargo.tsv +185 −0
- recipes/aichat.toml +1 −1
- recipes/bat.toml +1 −1
- recipes/cargo-audit.toml +0 −1
- recipes/cargo-binstall.toml +0 −1
- recipes/cargo-bundle-licenses.toml +1 −1
- recipes/cargo-cache.toml +1 −0
- recipes/cargo-careful.toml +1 −1
- recipes/cargo-criterion.toml +1 −1
- recipes/cargo-deny.toml +1 −1
- recipes/cargo-edit.toml +1 −1
- recipes/cargo-expand.toml +1 −1
- recipes/cargo-flamegraph.toml +1 −1
- recipes/cargo-fuzz.toml +1 −1
- recipes/cargo-generate.toml +1 −1
- recipes/cargo-hack.toml +1 −1
- recipes/cargo-llvm-cov.toml +1 −1
- recipes/cargo-llvm-lines.toml +1 −1
- recipes/cargo-msrv.toml +1 −1
- recipes/cargo-ndk.toml +1 −1
- recipes/cargo-readme.toml +1 −1
- recipes/cargo-semver-checks.toml +1 −1
- recipes/cargo-sort.toml +1 −1
- recipes/cargo-supply-chain.toml +1 −1
- recipes/cargo-temp.toml +1 −1
- recipes/cargo-udeps.toml +1 −0
- recipes/choose.toml +1 −1
- recipes/cobalt.toml +1 −1
- recipes/comrak.toml +1 −0
- recipes/cpc.toml +1 −1
- recipes/csview.toml +1 −1
- recipes/ddh.toml +1 −0
- recipes/diffutils.toml +1 −1
- recipes/diskus.toml +1 −1
- recipes/dufs.toml +1 −1
- recipes/fd.toml +1 −1
- recipes/findutils.toml +1 −1
- recipes/fselect.toml +1 −1
- recipes/gitoxide.toml +1 −1
- recipes/gptman.toml +1 −1
- recipes/hexyl.toml +1 −1
- recipes/hyperfine.toml +1 −1
- recipes/incoming-cosmic/cosmic-comp.toml +1 −1
- recipes/incoming-cosmic/cosmic-edit.toml +1 −1
- recipes/incoming-cosmic/cosmic-files.toml +1 −1
- recipes/incoming-cosmic/cosmic-osd.toml +1 −1
- recipes/incoming-cosmic/cosmic-session.toml +1 −1
- recipes/incoming-cosmic/cosmic-settings-daemon.toml +1 −1
- recipes/incoming-cosmic/cosmic-term.toml +1 −1
- recipes/incoming-cosmic/xdg-desktop-portal-cosmic.toml +1 −1
- recipes/maturin.toml +1 −1
- recipes/nomino.toml +1 −1
- recipes/ouch.toml +1 −0
- recipes/pastel.toml +1 −1
- recipes/pls.toml +1 −1
- recipes/repgrep.toml +1 −1
- recipes/rip2.toml +1 −1
- recipes/ripgrep-all.toml +1 −0
- recipes/ripgrep.toml +1 −1
- recipes/russ.toml +1 −1
- recipes/rust-script.toml +1 −1
- recipes/rustic.toml +1 −1
- recipes/rustscan.toml +1 −1
- recipes/sendme.toml +1 −1
- recipes/tealdeer.toml +1 −1
- recipes/tenere.toml +1 −1
- recipes/tokei.toml +1 −0
- recipes/topgrade.toml +1 −1
- recipes/trunk.toml +1 −1
- recipes/tuc.toml +1 −1
- recipes/tuckr.toml +1 −1
- recipes/usbutils.toml +0 −1
- recipes/vivid.toml +1 −1
- recipes/wasm-pack.toml +1 −1
- recipes/waybackurls.toml +0 −1
- recipes/xan.toml +1 −1
- recipes/xsv.toml +1 −1
- recipes/xwin.toml +1 −1
- scripts/licencias-cargo.sh +81 −0
- scripts/licencias-detectar.sh +9 −0
- scripts/licencias.sh +41 −3
diff --git a/docs/licencias-cargo.tsv b/docs/licencias-cargo.tsv
new file mode 100644
index 00000000..62660d17
--- /dev/null
+++ b/docs/licencias-cargo.tsv
@@ -0,0 +1,185 @@
+# licencias-cargo.tsv — GENERADO por scripts/licencias-cargo.sh. No editar a mano.
+#
+# La licencia que el AUTOR declara en su Cargo.toml: expresión SPDX escrita por quien tiene
+# la potestad de licenciar. Sin ambigüedad -only/-or-later y SIN colapsar las dobles ⇒ manda
+# sobre la detección por API de GitHub, que pierde ambas cosas. Sembrar con FORZAR=1.
+#
+# Tercera columna = el ref con el que se resolvió. Un tag concreto significa que el dato es
+# de la VERSIÓN QUE EMPAQUETAMOS; 'HEAD(aprox)' que no se halló el tag y puede diferir.
+# Total 176 · al tag exacto 167 · aproximadas 9
+aichat MIT OR Apache-2.0 v0.30.0
+angle-grinder MIT v0.19.6
+atac MIT v0.23.0
+bacon AGPL-3.0 v3.23.0
+bandwhich MIT v0.23.1
+bat MIT OR Apache-2.0 v0.26.1
+bingrep MIT v0.12.1
+bob-nvim MIT v4.1.7
+bottom MIT 0.12.3
+broot MIT v1.57.0
+caligula GPL-3.0 v0.5.0
+cargo-bloat MIT v0.12.1
+cargo-bundle-licenses MIT/Apache-2.0 v4.2.0
+cargo-cache MIT/Apache-2.0 0.8.3
+cargo-careful MIT OR Apache-2.0 v0.4.10
+cargo-criterion Apache-2.0/MIT 1.1.0
+cargo-deb MIT v3.7.0
+cargo-deny MIT OR Apache-2.0 0.19.9
+cargo-edit Apache-2.0 OR MIT v0.13.11
+cargo-expand MIT OR Apache-2.0 1.0.122
+cargo-feature MIT v0.7.0
+cargo-features-manager MIT v0.11.0
+cargo-flamegraph MIT OR Apache-2.0 v0.6.13
+cargo-fuzz MIT OR Apache-2.0 0.13.2
+cargo-generate MIT OR Apache-2.0 v0.23.9
+cargo-hack Apache-2.0 OR MIT v0.6.45
+cargo-llvm-cov Apache-2.0 OR MIT v0.8.5
+cargo-llvm-lines MIT OR Apache-2.0 0.4.46
+cargo-machete MIT v0.9.2
+cargo-make Apache-2.0 0.37.24
+cargo-modules MPL-2.0 v0.26.0
+cargo-msrv Apache-2.0 OR MIT v0.19.3
+cargo-mutants MIT v27.1.0
+cargo-ndk Apache-2.0 OR MIT v4.1.2
+cargo-outdated MIT v0.19.0
+cargo-readme MIT OR Apache-2.0 v3.3.2
+cargo-semver-checks Apache-2.0 OR MIT v0.48.0
+cargo-sort MIT/Apache-2.0 v2.1.3
+cargo-supply-chain Apache-2.0 OR MIT OR Zlib v0.3.4
+cargo-sweep MIT v0.8.0
+cargo-temp MIT OR Apache-2.0 v0.4.1
+cargo-udeps MIT OR Apache-2.0 v0.1.61
+cargo-watch CC0-1.0 v8.5.3
+cargo-wipe MIT v0.4.0
+cargo-wizard MIT v0.2.3
+cargo-zigbuild MIT v0.22.3
+cbindgen MPL-2.0 v0.27.0
+choose GPL-3.0-or-later v1.3.7
+cobalt MIT v0.20.4
+comrak BSD-2-Clause v0.52.0
+cosmic-comp GPL-3.0-only HEAD(aprox)
+cosmic-edit GPL-3.0-only HEAD(aprox)
+cosmic-files GPL-3.0-only HEAD(aprox)
+cosmic-osd GPL-3.0-or-later HEAD(aprox)
+cosmic-session GPL-3.0-only HEAD(aprox)
+cosmic-settings-daemon GPL-3.0-or-later HEAD(aprox)
+cosmic-term GPL-3.0-only HEAD(aprox)
+cpc MIT v3.0.0
+csview MIT OR Apache-2.0 v1.3.4
+csvlens MIT v0.13.0
+dalfox MIT v3.1.2
+ddh LGPL-3.0 0.13.0
+delta MIT 0.19.2
+difftastic MIT 0.69.0
+diffutils MIT OR Apache-2.0 v0.5.0
+diskus MIT/Apache-2.0 v0.9.0
+dotter Unlicense v0.13.4
+dua MIT v2.34.0
+dufs MIT OR Apache-2.0 v0.46.0
+dust Apache-2.0 v1.2.4
+erdtree MIT v3.1.2
+eza EUPL-1.2 v0.23.4
+fastmod Apache-2.0 v0.4.4
+fblog WTFPL v4.17.0
+fd MIT OR Apache-2.0 v10.4.2
+feroxbuster MIT v2.13.1
+findutils MIT 0.9.1
+findutils-xargs MIT 0.9.1
+fnm GPL-3.0 v1.39.0
+fselect MIT OR Apache-2.0 0.10.1
+genact MIT v1.5.1
+git-absorb BSD-3-Clause 0.9.0
+git-graph MIT v0.7.0
+git-igitt MIT v0.1.21
+gitoxide MIT OR Apache-2.0 v0.54.0
+gitui MIT v0.28.1
+gitu MIT v0.42.0
+gptman MIT OR Apache-2.0 v1.1.0
+grcov MPL-2.0 v0.9.1
+grex Apache-2.0 v1.4.6
+heh MIT v0.6.3
+hexyl MIT/Apache-2.0 v0.17.0
+hgrep MIT v0.3.9
+htmlq MIT v0.4.0
+hwatch MIT 0.4.2
+hyperfine MIT OR Apache-2.0 v1.20.0
+igrep MIT v1.3.0
+jnv MIT v0.7.1
+joshuto LGPL-3.0 v0.9.9
+just CC0-1.0 1.51.0
+kbs2 MIT v0.7.3
+kmon GPL-3.0 v1.7.1
+kubie Zlib v0.26.1
+lsd Apache-2.0 v1.2.0
+macchina MIT v6.4.0
+maturin MIT OR Apache-2.0 v1.12.6
+mcfly MIT v0.9.3
+mdbook-mermaid MPL-2.0 v0.17.0
+mdbook-toc MPL-2.0 0.15.4
+miniserve MIT v0.35.0
+mise MIT v2026.7.0
+monolith CC0-1.0 v2.10.1
+natls MIT v2.1.14
+navi Apache-2.0 v2.24.0
+netscanner MIT v0.6.41
+nomino MIT OR Apache-2.0 v1.6.4
+nu MIT 0.104.1
+oha MIT v1.14.0
+otree MIT v0.6.5
+ouch MIT 0.8.0
+ox GPL-2.0 0.7.7
+parallel-disk-usage Apache-2.0 0.21.1
+pastel MIT/Apache-2.0 v0.12.0
+pls GPL-3.0-or-later v0.0.1-beta.10
+pop-launcher MPL-2.0 1.2.7
+presenterm BSD-2-Clause v0.16.1
+procs MIT v0.14.11
+rep-grep MIT 0.0.8
+repgrep Unlicense OR MIT OR Apache-2.0 0.16.1
+rip2 GPL-3.0+ v0.9.6
+ripgrep-all AGPL-3.0-or-later v0.10.10
+ripgrep Unlicense OR MIT 14.1.1
+ripsecrets MIT v0.1.11
+rnr MIT v0.5.1
+ruplacer BSD-3-Clause v0.10.0
+russ AGPL-3.0-or-later HEAD(aprox)
+rustcat GPL-3.0 v3.0.0
+rustic Apache-2.0 OR MIT v0.11.3
+rustscan GPL-3.0-only 2.4.1
+rust-script MIT/Apache-2.0 0.36.0
+sccache Apache-2.0 v0.15.0
+sendme Apache-2.0 OR MIT v0.33.0
+serie MIT v0.8.0
+shellharden MPL-2.0 v4.3.1
+simple-http-server MIT v0.8.0
+skim MIT v4.7.0
+sshs MIT 4.7.2
+ssh-vault BSD-3-Clause 1.2.10
+starship ISC v1.25.1
+stylua MPL-2.0 v2.5.2
+systemctl-tui MIT v0.5.2
+taskwarrior-tui MIT v0.27.0
+tealdeer MIT OR Apache-2.0 v1.8.1
+television MIT 0.15.9
+tenere GPL-3.0-or-later v0.11.3
+tere EUPL-1.2 v1.6.0
+the-way MIT v0.20.3
+tokei MIT OR Apache-2.0 v14.0.0
+tomlq MIT 0.2.2
+topgrade GPL-3.0-or-later v17.6.1
+trunk MIT/Apache-2.0 v0.21.14
+ttyper MIT v1.6.0
+tuc GPL-3.0-or-later v1.3.0
+tuckr GPL-3.0-or-later 0.13.1
+viddy MIT v1.3.1
+viu MIT v1.6.1
+vivid MIT/Apache-2.0 v0.11.1
+wasm-pack MIT OR Apache-2.0 v0.15.0
+xan Unlicense OR MIT 0.59.0
+xdg-desktop-portal-cosmic GPL-3.0-or-later HEAD(aprox)
+xh MIT v0.25.3
+xsv Unlicense/MIT 0.13.0
+xwin Apache-2.0 OR MIT 0.7.0
+zenith MIT 0.15.0
+zola EUPL-1.2 v0.22.1
+zoxide MIT v0.9.9
diff --git a/recipes/aichat.toml b/recipes/aichat.toml
index 0d2e48e3..00017165 100644
--- a/recipes/aichat.toml
+++ b/recipes/aichat.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "aichat"
version = "0.30.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sigoden/aichat"
diff --git a/recipes/bat.toml b/recipes/bat.toml
index 15aa1041..050c70f3 100644
--- a/recipes/bat.toml
+++ b/recipes/bat.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "bat"
version = "0.26.1"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sharkdp/bat"
diff --git a/recipes/cargo-audit.toml b/recipes/cargo-audit.toml
index c6752e98..28167e59 100644
--- a/recipes/cargo-audit.toml
+++ b/recipes/cargo-audit.toml
@@ -6,7 +6,6 @@
# - deps.build=["zlib"]: git2/openssl-sys enlazan -lz.
name = "cargo-audit"
version = "0.22.1"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
[source]
tarball = "https://github.com/RustSec/cargo-audit/archive/cargo-audit/v0.22.1.tar.gz"
diff --git a/recipes/cargo-binstall.toml b/recipes/cargo-binstall.toml
index a091f873..54b11947 100644
--- a/recipes/cargo-binstall.toml
+++ b/recipes/cargo-binstall.toml
@@ -4,7 +4,6 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-binstall"
version = "1.20.0"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
[source]
repo = "https://github.com/cargo-bins/cargo-binstall"
diff --git a/recipes/cargo-bundle-licenses.toml b/recipes/cargo-bundle-licenses.toml
index d4593ea5..0af854d7 100644
--- a/recipes/cargo-bundle-licenses.toml
+++ b/recipes/cargo-bundle-licenses.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-bundle-licenses"
version = "4.2.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sstadick/cargo-bundle-licenses"
diff --git a/recipes/cargo-cache.toml b/recipes/cargo-cache.toml
index 051d1880..1dbc4b71 100644
--- a/recipes/cargo-cache.toml
+++ b/recipes/cargo-cache.toml
@@ -4,6 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-cache"
version = "0.8.3"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/matthiaskrgr/cargo-cache"
diff --git a/recipes/cargo-careful.toml b/recipes/cargo-careful.toml
index c83d8995..7f7f2f1e 100644
--- a/recipes/cargo-careful.toml
+++ b/recipes/cargo-careful.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-careful"
version = "0.4.10"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/RalfJung/cargo-careful"
diff --git a/recipes/cargo-criterion.toml b/recipes/cargo-criterion.toml
index f92f0102..ce431334 100644
--- a/recipes/cargo-criterion.toml
+++ b/recipes/cargo-criterion.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-criterion"
version = "1.1.0"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
[source]
repo = "https://github.com/bheisler/cargo-criterion"
diff --git a/recipes/cargo-deny.toml b/recipes/cargo-deny.toml
index 70ec36b2..0eec4fd9 100644
--- a/recipes/cargo-deny.toml
+++ b/recipes/cargo-deny.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-deny"
version = "0.19.9"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/EmbarkStudios/cargo-deny"
diff --git a/recipes/cargo-edit.toml b/recipes/cargo-edit.toml
index 54214947..9bc92734 100644
--- a/recipes/cargo-edit.toml
+++ b/recipes/cargo-edit.toml
@@ -8,7 +8,7 @@
# `cargo rustc --` exige un único target, itero los 4 bins. El install lo auto-genera el lab.
name = "cargo-edit"
version = "0.13.11"
-license = "MIT"
+license = "Apache-2.0 OR MIT"
[source]
repo = "https://github.com/killercup/cargo-edit"
diff --git a/recipes/cargo-expand.toml b/recipes/cargo-expand.toml
index adc4e0a1..dad5ed0f 100644
--- a/recipes/cargo-expand.toml
+++ b/recipes/cargo-expand.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-expand"
version = "1.0.122"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/dtolnay/cargo-expand"
diff --git a/recipes/cargo-flamegraph.toml b/recipes/cargo-flamegraph.toml
index 9118bbe2..8de0a35f 100644
--- a/recipes/cargo-flamegraph.toml
+++ b/recipes/cargo-flamegraph.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-flamegraph"
version = "0.6.13"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/flamegraph-rs/flamegraph"
diff --git a/recipes/cargo-fuzz.toml b/recipes/cargo-fuzz.toml
index 72101432..a72ee8d9 100644
--- a/recipes/cargo-fuzz.toml
+++ b/recipes/cargo-fuzz.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-fuzz"
version = "0.13.2"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/rust-fuzz/cargo-fuzz"
diff --git a/recipes/cargo-generate.toml b/recipes/cargo-generate.toml
index 70ba9b3e..5665327b 100644
--- a/recipes/cargo-generate.toml
+++ b/recipes/cargo-generate.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-generate"
version = "0.23.9"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/cargo-generate/cargo-generate"
diff --git a/recipes/cargo-hack.toml b/recipes/cargo-hack.toml
index b48bffed..9ce09224 100644
--- a/recipes/cargo-hack.toml
+++ b/recipes/cargo-hack.toml
@@ -4,7 +4,7 @@
# El `cargo auditable` del abuild de Alpine no existe en el lab ⇒ se elimina.
name = "cargo-hack"
version = "0.6.45"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
[source]
tarball = "https://github.com/taiki-e/cargo-hack/archive/refs/tags/v0.6.45.tar.gz"
diff --git a/recipes/cargo-llvm-cov.toml b/recipes/cargo-llvm-cov.toml
index 90ef1b02..3a5f9b92 100644
--- a/recipes/cargo-llvm-cov.toml
+++ b/recipes/cargo-llvm-cov.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-llvm-cov"
version = "0.8.5"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
[source]
repo = "https://github.com/taiki-e/cargo-llvm-cov"
diff --git a/recipes/cargo-llvm-lines.toml b/recipes/cargo-llvm-lines.toml
index 6b5bee55..ad05fd6a 100644
--- a/recipes/cargo-llvm-lines.toml
+++ b/recipes/cargo-llvm-lines.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-llvm-lines"
version = "0.4.46"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/dtolnay/cargo-llvm-lines"
diff --git a/recipes/cargo-msrv.toml b/recipes/cargo-msrv.toml
index 24a67de6..c70c2263 100644
--- a/recipes/cargo-msrv.toml
+++ b/recipes/cargo-msrv.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-msrv"
version = "0.19.3"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
[source]
repo = "https://github.com/foresterre/cargo-msrv"
diff --git a/recipes/cargo-ndk.toml b/recipes/cargo-ndk.toml
index 27c0d1d8..affbe1a5 100644
--- a/recipes/cargo-ndk.toml
+++ b/recipes/cargo-ndk.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-ndk"
version = "4.1.2"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
[source]
repo = "https://github.com/bbqsrc/cargo-ndk"
diff --git a/recipes/cargo-readme.toml b/recipes/cargo-readme.toml
index 20318893..d14e7b95 100644
--- a/recipes/cargo-readme.toml
+++ b/recipes/cargo-readme.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-readme"
version = "3.3.2"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/webern/cargo-readme"
diff --git a/recipes/cargo-semver-checks.toml b/recipes/cargo-semver-checks.toml
index 7186c678..f31c6701 100644
--- a/recipes/cargo-semver-checks.toml
+++ b/recipes/cargo-semver-checks.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-semver-checks"
version = "0.48.0"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
[source]
repo = "https://github.com/obi1kenobi/cargo-semver-checks"
diff --git a/recipes/cargo-sort.toml b/recipes/cargo-sort.toml
index c7f6943e..feb6fb74 100644
--- a/recipes/cargo-sort.toml
+++ b/recipes/cargo-sort.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-sort"
version = "2.1.3"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/devinr528/cargo-sort"
diff --git a/recipes/cargo-supply-chain.toml b/recipes/cargo-supply-chain.toml
index 20bbcbba..9406b1d5 100644
--- a/recipes/cargo-supply-chain.toml
+++ b/recipes/cargo-supply-chain.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-supply-chain"
version = "0.3.4"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT OR Zlib"
[source]
repo = "https://github.com/rust-secure-code/cargo-supply-chain"
diff --git a/recipes/cargo-temp.toml b/recipes/cargo-temp.toml
index d59e619b..0abc4e94 100644
--- a/recipes/cargo-temp.toml
+++ b/recipes/cargo-temp.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-temp"
version = "0.4.1"
-license = "MIT"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/yozhgoor/cargo-temp"
diff --git a/recipes/cargo-udeps.toml b/recipes/cargo-udeps.toml
index eb8b769d..cd8fff5b 100644
--- a/recipes/cargo-udeps.toml
+++ b/recipes/cargo-udeps.toml
@@ -4,6 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cargo-udeps"
version = "0.1.61"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/est31/cargo-udeps"
diff --git a/recipes/choose.toml b/recipes/choose.toml
index b02b80da..b7912438 100644
--- a/recipes/choose.toml
+++ b/recipes/choose.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "choose"
version = "1.3.7"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
[source]
repo = "https://github.com/theryangeary/choose"
diff --git a/recipes/cobalt.toml b/recipes/cobalt.toml
index 8487c333..a1dd7c91 100644
--- a/recipes/cobalt.toml
+++ b/recipes/cobalt.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cobalt"
version = "0.20.4"
-license = "Apache-2.0"
+license = "MIT"
[source]
repo = "https://github.com/cobalt-org/cobalt.rs"
diff --git a/recipes/comrak.toml b/recipes/comrak.toml
index d415d309..f00af5fe 100644
--- a/recipes/comrak.toml
+++ b/recipes/comrak.toml
@@ -4,6 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "comrak"
version = "0.52.0"
+license = "BSD-2-Clause"
[source]
repo = "https://github.com/kivikakk/comrak"
diff --git a/recipes/cpc.toml b/recipes/cpc.toml
index 273aa08a..667e06dc 100644
--- a/recipes/cpc.toml
+++ b/recipes/cpc.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "cpc"
version = "3.0.0"
-license = "AGPL-3.0"
+license = "MIT"
[source]
repo = "https://github.com/probablykasper/cpc"
diff --git a/recipes/csview.toml b/recipes/csview.toml
index 46d79fb7..6296a49f 100644
--- a/recipes/csview.toml
+++ b/recipes/csview.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "csview"
version = "1.3.4"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/wfxr/csview"
diff --git a/recipes/ddh.toml b/recipes/ddh.toml
index e5810351..86097684 100644
--- a/recipes/ddh.toml
+++ b/recipes/ddh.toml
@@ -4,6 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "ddh"
version = "0.13.0"
+license = "LGPL-3.0"
[source]
repo = "https://github.com/darakian/ddh"
diff --git a/recipes/diffutils.toml b/recipes/diffutils.toml
index abef90b4..13bc295a 100644
--- a/recipes/diffutils.toml
+++ b/recipes/diffutils.toml
@@ -10,7 +10,7 @@
name = "diffutils"
version = "0.5.0"
-license = "GPL-3.0-or-later"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/uutils/diffutils"
diff --git a/recipes/diskus.toml b/recipes/diskus.toml
index 2a99cfdd..10c769af 100644
--- a/recipes/diskus.toml
+++ b/recipes/diskus.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "diskus"
version = "0.9.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sharkdp/diskus"
diff --git a/recipes/dufs.toml b/recipes/dufs.toml
index bfe6641d..0ceac9ad 100644
--- a/recipes/dufs.toml
+++ b/recipes/dufs.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "dufs"
version = "0.46.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sigoden/dufs"
diff --git a/recipes/fd.toml b/recipes/fd.toml
index 1e1d95f5..2b1f53ca 100644
--- a/recipes/fd.toml
+++ b/recipes/fd.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "fd"
version = "10.4.2"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sharkdp/fd"
diff --git a/recipes/findutils.toml b/recipes/findutils.toml
index 7fa2bcff..3201c1a1 100644
--- a/recipes/findutils.toml
+++ b/recipes/findutils.toml
@@ -16,7 +16,7 @@
name = "findutils"
version = "0.9.1"
-license = "GPL-3.0-or-later"
+license = "MIT"
[source]
repo = "https://github.com/uutils/findutils"
diff --git a/recipes/fselect.toml b/recipes/fselect.toml
index 0d99f88c..f8f21ced 100644
--- a/recipes/fselect.toml
+++ b/recipes/fselect.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "fselect"
version = "0.10.1"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/jhspetersson/fselect"
diff --git a/recipes/gitoxide.toml b/recipes/gitoxide.toml
index 6bc717bf..89533f4d 100644
--- a/recipes/gitoxide.toml
+++ b/recipes/gitoxide.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "gitoxide"
version = "0.54.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/GitoxideLabs/gitoxide"
diff --git a/recipes/gptman.toml b/recipes/gptman.toml
index dd8b1aa4..76fbde11 100644
--- a/recipes/gptman.toml
+++ b/recipes/gptman.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "gptman"
version = "1.1.0"
-license = "MIT"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/rust-disk-partition-management/gptman"
diff --git a/recipes/hexyl.toml b/recipes/hexyl.toml
index aeb71914..5dc8b331 100644
--- a/recipes/hexyl.toml
+++ b/recipes/hexyl.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "hexyl"
version = "0.17.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sharkdp/hexyl"
diff --git a/recipes/hyperfine.toml b/recipes/hyperfine.toml
index 0bc3a948..2fce7189 100644
--- a/recipes/hyperfine.toml
+++ b/recipes/hyperfine.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "hyperfine"
version = "1.20.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sharkdp/hyperfine"
diff --git a/recipes/incoming-cosmic/cosmic-comp.toml b/recipes/incoming-cosmic/cosmic-comp.toml
index 3336f0ca..a7cda718 100644
--- a/recipes/incoming-cosmic/cosmic-comp.toml
+++ b/recipes/incoming-cosmic/cosmic-comp.toml
@@ -29,7 +29,7 @@
# de EGL/wayland/xkbcommon; un estático acá no es una postura, es una mentira.
name = "cosmic-comp"
version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
[source]
tarball = "https://github.com/pop-os/cosmic-comp/archive/epoch-1.5.0/cosmic-comp-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-edit.toml b/recipes/incoming-cosmic/cosmic-edit.toml
index f7a12b0d..943547aa 100644
--- a/recipes/incoming-cosmic/cosmic-edit.toml
+++ b/recipes/incoming-cosmic/cosmic-edit.toml
@@ -29,7 +29,7 @@
# los cuarenta minutos.
name = "cosmic-edit"
version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
[source]
tarball = "https://github.com/pop-os/cosmic-edit/archive/epoch-1.5.0/cosmic-edit-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-files.toml b/recipes/incoming-cosmic/cosmic-files.toml
index f4d6114c..504b9a8a 100644
--- a/recipes/incoming-cosmic/cosmic-files.toml
+++ b/recipes/incoming-cosmic/cosmic-files.toml
@@ -26,7 +26,7 @@
# (`bzip2-sys` no aparece) antes de agregar una dep que no hacía falta.
name = "cosmic-files"
version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
[source]
tarball = "https://github.com/pop-os/cosmic-files/archive/epoch-1.5.0/cosmic-files-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-osd.toml b/recipes/incoming-cosmic/cosmic-osd.toml
index bec0969b..e601efb5 100644
--- a/recipes/incoming-cosmic/cosmic-osd.toml
+++ b/recipes/incoming-cosmic/cosmic-osd.toml
@@ -13,7 +13,7 @@
# `libxkbcommon` + `pkgconf` por el gotcha 7 del runbook: winit/sctk ENLAZAN xkbcommon.
name = "cosmic-osd"
version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
[source]
tarball = "https://github.com/pop-os/cosmic-osd/archive/epoch-1.5.0/cosmic-osd-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-session.toml b/recipes/incoming-cosmic/cosmic-session.toml
index 9d9794e7..0005c164 100644
--- a/recipes/incoming-cosmic/cosmic-session.toml
+++ b/recipes/incoming-cosmic/cosmic-session.toml
@@ -23,7 +23,7 @@
# arriba y no lo implica: es el nombre del protocolo, no del programa que lo contesta.
name = "cosmic-session"
version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
[source]
tarball = "https://github.com/pop-os/cosmic-session/archive/epoch-1.5.0/cosmic-session-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-settings-daemon.toml b/recipes/incoming-cosmic/cosmic-settings-daemon.toml
index d0707d95..a95bfbb0 100644
--- a/recipes/incoming-cosmic/cosmic-settings-daemon.toml
+++ b/recipes/incoming-cosmic/cosmic-settings-daemon.toml
@@ -21,7 +21,7 @@
# `ddc-hi` (brillo por DDC/CI sobre i2c) es Rust puro: habla el ioctl directo, no libddcutil.
name = "cosmic-settings-daemon"
version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
[source]
tarball = "https://github.com/pop-os/cosmic-settings-daemon/archive/epoch-1.5.0/cosmic-settings-daemon-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/cosmic-term.toml b/recipes/incoming-cosmic/cosmic-term.toml
index 45c4a400..c4354e3d 100644
--- a/recipes/incoming-cosmic/cosmic-term.toml
+++ b/recipes/incoming-cosmic/cosmic-term.toml
@@ -16,7 +16,7 @@
# tocar las features por defecto es apartarse de la única combinación que upstream prueba.
name = "cosmic-term"
version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
[source]
tarball = "https://github.com/pop-os/cosmic-term/archive/epoch-1.5.0/cosmic-term-epoch-1.5.0.tar.gz"
diff --git a/recipes/incoming-cosmic/xdg-desktop-portal-cosmic.toml b/recipes/incoming-cosmic/xdg-desktop-portal-cosmic.toml
index 4bf2486b..47aa5c5c 100644
--- a/recipes/incoming-cosmic/xdg-desktop-portal-cosmic.toml
+++ b/recipes/incoming-cosmic/xdg-desktop-portal-cosmic.toml
@@ -31,7 +31,7 @@
# recorte.
name = "xdg-desktop-portal-cosmic"
version = "1.5.0"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
[source]
tarball = "https://github.com/pop-os/xdg-desktop-portal-cosmic/archive/epoch-1.5.0/xdg-desktop-portal-cosmic-epoch-1.5.0.tar.gz"
diff --git a/recipes/maturin.toml b/recipes/maturin.toml
index e5378179..a709bb07 100644
--- a/recipes/maturin.toml
+++ b/recipes/maturin.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "maturin"
version = "1.12.6"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/PyO3/maturin"
diff --git a/recipes/nomino.toml b/recipes/nomino.toml
index f76ee697..e4d15dc2 100644
--- a/recipes/nomino.toml
+++ b/recipes/nomino.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "nomino"
version = "1.6.4"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/yaa110/nomino"
diff --git a/recipes/ouch.toml b/recipes/ouch.toml
index 5dddcda6..e5bea126 100644
--- a/recipes/ouch.toml
+++ b/recipes/ouch.toml
@@ -4,6 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "ouch"
version = "0.8.0"
+license = "MIT"
[source]
repo = "https://github.com/ouch-org/ouch"
diff --git a/recipes/pastel.toml b/recipes/pastel.toml
index ce2eac6c..7b53be0c 100644
--- a/recipes/pastel.toml
+++ b/recipes/pastel.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "pastel"
version = "0.12.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sharkdp/pastel"
diff --git a/recipes/pls.toml b/recipes/pls.toml
index 89476aa0..d0fe4c8d 100644
--- a/recipes/pls.toml
+++ b/recipes/pls.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "pls"
version = "0.0.1-beta.10"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
[source]
repo = "https://github.com/pls-rs/pls"
diff --git a/recipes/repgrep.toml b/recipes/repgrep.toml
index 4d3e93c7..63e1b58e 100644
--- a/recipes/repgrep.toml
+++ b/recipes/repgrep.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "repgrep"
version = "0.16.1"
-license = "Apache-2.0"
+license = "Unlicense OR MIT OR Apache-2.0"
[source]
repo = "https://github.com/acheronfail/repgrep"
diff --git a/recipes/rip2.toml b/recipes/rip2.toml
index e05f6d63..192fc194 100644
--- a/recipes/rip2.toml
+++ b/recipes/rip2.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "rip2"
version = "0.9.6"
-license = "GPL-3.0"
+license = "GPL-3.0+"
[source]
repo = "https://github.com/MilesCranmer/rip2"
diff --git a/recipes/ripgrep-all.toml b/recipes/ripgrep-all.toml
index 51e022ed..2cf7d498 100644
--- a/recipes/ripgrep-all.toml
+++ b/recipes/ripgrep-all.toml
@@ -4,6 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "ripgrep-all"
version = "0.10.10"
+license = "AGPL-3.0-or-later"
[source]
repo = "https://github.com/phiresky/ripgrep-all"
diff --git a/recipes/ripgrep.toml b/recipes/ripgrep.toml
index a5f535cd..077a9dfc 100644
--- a/recipes/ripgrep.toml
+++ b/recipes/ripgrep.toml
@@ -15,7 +15,7 @@
name = "ripgrep"
version = "14.1.1"
-license = "Unlicense"
+license = "Unlicense OR MIT"
[source]
repo = "https://github.com/BurntSushi/ripgrep"
diff --git a/recipes/russ.toml b/recipes/russ.toml
index 0e2382a8..5d447bce 100644
--- a/recipes/russ.toml
+++ b/recipes/russ.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "russ"
version = "0.5.0"
-license = "AGPL-3.0"
+license = "AGPL-3.0-or-later"
[source]
repo = "https://github.com/ckampfe/russ"
diff --git a/recipes/rust-script.toml b/recipes/rust-script.toml
index b062d825..5004130f 100644
--- a/recipes/rust-script.toml
+++ b/recipes/rust-script.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "rust-script"
version = "0.36.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/fornwall/rust-script"
diff --git a/recipes/rustic.toml b/recipes/rustic.toml
index e106270f..c8ca8bc3 100644
--- a/recipes/rustic.toml
+++ b/recipes/rustic.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "rustic"
version = "0.11.3"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
[source]
repo = "https://github.com/rustic-rs/rustic"
diff --git a/recipes/rustscan.toml b/recipes/rustscan.toml
index d823034a..07d023d6 100644
--- a/recipes/rustscan.toml
+++ b/recipes/rustscan.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "rustscan"
version = "2.4.1"
-license = "GPL-3.0"
+license = "GPL-3.0-only"
[source]
repo = "https://github.com/RustScan/RustScan"
diff --git a/recipes/sendme.toml b/recipes/sendme.toml
index c070adb3..d6c4b5d8 100644
--- a/recipes/sendme.toml
+++ b/recipes/sendme.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "sendme"
version = "0.33.0"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
[source]
repo = "https://github.com/n0-computer/sendme"
diff --git a/recipes/tealdeer.toml b/recipes/tealdeer.toml
index 1142bff8..eea0cc2a 100644
--- a/recipes/tealdeer.toml
+++ b/recipes/tealdeer.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "tealdeer"
version = "1.8.1"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/tealdeer-rs/tealdeer"
diff --git a/recipes/tenere.toml b/recipes/tenere.toml
index 0da26c8a..c7ab2b85 100644
--- a/recipes/tenere.toml
+++ b/recipes/tenere.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "tenere"
version = "0.11.3"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
[source]
repo = "https://github.com/pythops/tenere"
diff --git a/recipes/tokei.toml b/recipes/tokei.toml
index 8924c300..49a1e590 100644
--- a/recipes/tokei.toml
+++ b/recipes/tokei.toml
@@ -4,6 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "tokei"
version = "14.0.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/XAMPPRocky/tokei"
diff --git a/recipes/topgrade.toml b/recipes/topgrade.toml
index abe91d64..ec220776 100644
--- a/recipes/topgrade.toml
+++ b/recipes/topgrade.toml
@@ -4,7 +4,7 @@
# crt-static + linker zig-cc ⇒ binario ESTÁTICO). Pure-Rust ⇒ zig-cc baseline.
name = "topgrade"
version = "17.6.1"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
[source]
tarball = "https://github.com/topgrade-rs/topgrade/archive/refs/tags/v17.6.1.tar.gz"
diff --git a/recipes/trunk.toml b/recipes/trunk.toml
index c7f467e0..46a4cfe2 100644
--- a/recipes/trunk.toml
+++ b/recipes/trunk.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "trunk"
version = "0.21.14"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/trunk-rs/trunk"
diff --git a/recipes/tuc.toml b/recipes/tuc.toml
index 0ccdb9da..e9f6464d 100644
--- a/recipes/tuc.toml
+++ b/recipes/tuc.toml
@@ -3,7 +3,7 @@
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
name = "tuc"
version = "1.3.0"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
[source]
tarball = "https://github.com/riquito/tuc/archive/v1.3.0/tuc-1.3.0.tar.gz"
diff --git a/recipes/tuckr.toml b/recipes/tuckr.toml
index 4f9dc1c0..05b18af2 100644
--- a/recipes/tuckr.toml
+++ b/recipes/tuckr.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "tuckr"
version = "0.13.1"
-license = "GPL-3.0"
+license = "GPL-3.0-or-later"
[source]
repo = "https://github.com/RaphGL/Tuckr"
diff --git a/recipes/usbutils.toml b/recipes/usbutils.toml
index 70519f17..7f27a49d 100644
--- a/recipes/usbutils.toml
+++ b/recipes/usbutils.toml
@@ -3,7 +3,6 @@
# sha256 del tarball (el wrapper lo calcula), y adaptar build/install del shell de abuild.
name = "usbutils"
version = "019"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
[source]
tarball = "https://github.com/gregkh/usbutils/archive/refs/tags/v019.tar.gz"
diff --git a/recipes/vivid.toml b/recipes/vivid.toml
index cf90a334..dffb0d6a 100644
--- a/recipes/vivid.toml
+++ b/recipes/vivid.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "vivid"
version = "0.11.1"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/sharkdp/vivid"
diff --git a/recipes/wasm-pack.toml b/recipes/wasm-pack.toml
index 79f4e777..5769f1a9 100644
--- a/recipes/wasm-pack.toml
+++ b/recipes/wasm-pack.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "wasm-pack"
version = "0.15.0"
-license = "Apache-2.0"
+license = "MIT OR Apache-2.0"
[source]
repo = "https://github.com/wasm-bindgen/wasm-pack"
diff --git a/recipes/waybackurls.toml b/recipes/waybackurls.toml
index 8b93f561..d08cb33a 100644
--- a/recipes/waybackurls.toml
+++ b/recipes/waybackurls.toml
@@ -4,7 +4,6 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "waybackurls"
version = "0.1.0"
-license = "{"message":"Not Found","documentation_url":"https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository","status":"404"}"
[source]
repo = "https://github.com/tomnomnom/waybackurls"
diff --git a/recipes/xan.toml b/recipes/xan.toml
index 70fcaaf4..3600eedf 100644
--- a/recipes/xan.toml
+++ b/recipes/xan.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "xan"
version = "0.59.0"
-license = "Unlicense"
+license = "Unlicense OR MIT"
[source]
repo = "https://github.com/medialab/xan"
diff --git a/recipes/xsv.toml b/recipes/xsv.toml
index 8f7feb0e..de8b19af 100644
--- a/recipes/xsv.toml
+++ b/recipes/xsv.toml
@@ -7,7 +7,7 @@
name = "xsv"
version = "0.13.0"
-license = "Unlicense"
+license = "Unlicense OR MIT"
[source]
tarball = "https://github.com/BurntSushi/xsv/archive/0.13.0/xsv-0.13.0.tar.gz"
diff --git a/recipes/xwin.toml b/recipes/xwin.toml
index aa55c230..63e9be01 100644
--- a/recipes/xwin.toml
+++ b/recipes/xwin.toml
@@ -4,7 +4,7 @@
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
name = "xwin"
version = "0.7.0"
-license = "Apache-2.0"
+license = "Apache-2.0 OR MIT"
[source]
repo = "https://github.com/Jake-Shadle/xwin"
diff --git a/scripts/licencias-cargo.sh b/scripts/licencias-cargo.sh
new file mode 100755
index 00000000..e445499c
--- /dev/null
+++ b/scripts/licencias-cargo.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+# licencias-cargo.sh — lee la licencia que el AUTOR declara en su `Cargo.toml`, al tag exacto que la
+# receta pinea. Es la fuente más autoritativa de las tres que usamos, y corrige a las otras dos.
+#
+# ── LA JERARQUÍA DE EVIDENCIA, DE PEOR A MEJOR ──────────────────────────────────────────────────
+# 1. El nombre de la receta ......... NO es evidencia. Prohibido (ver docs/licencias-conocidas.tsv).
+# 2. La familia / URL de fuente ..... buena para agrupar (X.Org=MIT, KDE Frameworks=LGPL doble).
+# 3. La API de licencias de GitHub .. detecta el fichero LICENSE real, pero con DOS pérdidas:
+# devuelve identificadores obsoletos y ambiguos (`GPL-3.0` sin decir -only/-or-later) y
+# **colapsa las licencias dobles a una sola**.
+# 4. El `Cargo.toml` del autor ...... ← ESTO. Una expresión SPDX escrita por quien tiene la potestad
+# de licenciar, sin ambigüedad y sin colapsar. Corrige los dos defectos de (3) de una vez.
+#
+# Ejemplo medido: la API dejó `fd` como `Apache-2.0`; su Cargo.toml dice `MIT OR Apache-2.0`. No era
+# falso —cumplir Apache-2.0 basta— pero perdía una opción que el autor concedió. Con esto se recupera.
+#
+# ── SE PIDE AL TAG QUE LA RECETA PINEA, NO A HEAD ───────────────────────────────────────────────
+# Ésa era la limitación registrada de la detección por API (mira la rama por defecto, no la versión
+# que empaquetamos). Acá se prueba `?ref=v<version>` y `?ref=<version>` antes de caer a HEAD, y se
+# ANOTA con qué ref se resolvió cada una, para que la tercera columna diga si el dato es exacto o
+# aproximado. Un dato con su procedencia se puede auditar; uno sin ella hay que creerlo.
+#
+# ── LO QUE NO HACE ──────────────────────────────────────────────────────────────────────────────
+# `license.workspace = true` (la licencia vive en el workspace padre) y `license-file` (licencia a
+# medida, sin SPDX) se DESCARTAN en vez de adivinarse. Y no toca las recetas que no son Cargo: los
+# módulos Go no tienen un campo equivalente en `go.mod`, así que ésos siguen dependiendo de (2) y (3).
+#
+# Uso: scripts/licencias-cargo.sh (escribe docs/licencias-cargo.tsv)
+# FORZAR=1 TABLA=docs/licencias-cargo.tsv scripts/licencias.sh --sembrar
+set -uo pipefail
+ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
+SALIDA="${SALIDA:-docs/licencias-cargo.tsv}"
+JOBS="${JOBS:-12}"
+
+command -v gh >/dev/null && gh auth status >/dev/null 2>&1 || { echo "!! 'gh' ausente o sin auth"; exit 1; }
+TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT
+
+# Todas las recetas con fuente en GitHub (tengan licencia o no: éste CORRIGE, no sólo rellena).
+for f in recipes/*.toml recipes/incoming-*/*.toml; do
+ [ -f "$f" ] || continue
+ u=$(grep -m1 -E '^[[:space:]]*(tarball|repo)[[:space:]]*=' "$f" 2>/dev/null)
+ case "$u" in *github.com*) ;; *) continue ;; esac
+ n=$(basename "$f" .toml)
+ v=$(awk -F'"' '/^\[/{exit} /^[[:space:]]*version[[:space:]]*=/{print $2; exit}' "$f")
+ slug=$(printf '%s\n' "$u" | sed -E 's#.*github\.com[:/]+([^/"]+)/([^/"]+).*#\1/\2#; s/\.git$//')
+ case "$slug" in */*) printf '%s\t%s\t%s\n' "$n" "$slug" "${v:-}" ;; esac
+done | sort -u > "$TMP/obj.tsv"
+
+echo "==> recetas con fuente en GitHub: $(wc -l < "$TMP/obj.tsv")"
+
+export TMP
+xargs -P "$JOBS" -I{} sh -c '
+ n=$(printf "%s" "{}" | cut -f1); slug=$(printf "%s" "{}" | cut -f2); v=$(printf "%s" "{}" | cut -f3)
+ for ref in "v$v" "$v" ""; do
+ [ -z "$v" ] && [ -n "$ref" ] && continue
+ if [ -n "$ref" ]; then q="?ref=$ref"; etiq="$ref"; else q=""; etiq="HEAD(aprox)"; fi
+ c=$(gh api "repos/$slug/contents/Cargo.toml$q" --jq ".content" 2>/dev/null) || continue
+ [ -z "$c" ] && continue
+ lic=$(printf "%s" "$c" | base64 -d 2>/dev/null | awk -F\" "/^\[/{if(t)exit; if(\$0 ~ /^\[package\]/)t=1; next} t&&/^[[:space:]]*license[[:space:]]*=/{print \$2; exit}")
+ case "$lic" in
+ ""|*workspace*|*true*) break ;;
+ *) printf "%s\t%s\t%s\n" "$n" "$lic" "$etiq" >> "$TMP/ok.tsv"; break ;;
+ esac
+ done
+' < "$TMP/obj.tsv"
+
+N=$(wc -l < "$TMP/ok.tsv" 2>/dev/null || echo 0)
+EXACT=$(grep -vc 'HEAD(aprox)' "$TMP/ok.tsv" 2>/dev/null || echo 0)
+{
+ echo "# licencias-cargo.tsv — GENERADO por scripts/licencias-cargo.sh. No editar a mano."
+ echo "#"
+ echo "# La licencia que el AUTOR declara en su Cargo.toml: expresión SPDX escrita por quien tiene"
+ echo "# la potestad de licenciar. Sin ambigüedad -only/-or-later y SIN colapsar las dobles ⇒ manda"
+ echo "# sobre la detección por API de GitHub, que pierde ambas cosas. Sembrar con FORZAR=1."
+ echo "#"
+ echo "# Tercera columna = el ref con el que se resolvió. Un tag concreto significa que el dato es"
+ echo "# de la VERSIÓN QUE EMPAQUETAMOS; 'HEAD(aprox)' que no se halló el tag y puede diferir."
+ echo "# Total $N · al tag exacto $EXACT · aproximadas $((N-EXACT))"
+ sort "$TMP/ok.tsv" 2>/dev/null
+} > "$SALIDA"
+echo "==> $N licencias de Cargo.toml ($EXACT al tag exacto) → $SALIDA"
diff --git a/scripts/licencias-detectar.sh b/scripts/licencias-detectar.sh
index 470c0f1d..16d96d42 100755
--- a/scripts/licencias-detectar.sh
+++ b/scripts/licencias-detectar.sh
@@ -53,8 +53,17 @@ export TMP
xargs -P "$JOBS" -I{} sh -c '
n=$(printf "%s" "{}" | cut -f1); slug=$(printf "%s" "{}" | cut -f2)
lic=$(gh api "repos/$slug/license" --jq ".license.spdx_id" 2>/dev/null)
+ # ⚠ VALIDAR LA FORMA, NO SÓLO LOS «NO SÉ» CONOCIDOS. Cuando el repo da 404 (renombrado, borrado,
+ # privado), `gh api` escribe el CUERPO DEL ERROR JSON en stdout y el filtro --jq falla ⇒ `lic`
+ # queda valiendo `{"message":"Not Found",...}`. Filtrando sólo ""/null/NOASSERTION/other, ese JSON
+ # pasaba como si fuera una licencia y se escribía en la receta: comillas incluidas, lo que además
+ # ROMPE el TOML y hace que el ArtifactHash deje de calcularse. Pasó de verdad en 5 recetas el
+ # 2026-08-07 y lo cazó la verificación de hashes, no la vista.
+ # ⇒ Regla: aceptar sólo lo que TIENE FORMA de expresión SPDX (letras, dígitos, . - + y los
+ # operadores OR/AND/WITH). Todo lo demás es un fallo disfrazado de dato.
case "$lic" in
""|null|NOASSERTION|other) printf "%s\t%s\n" "$n" "$slug" >> "$TMP/sin.tsv" ;;
+ *[!A-Za-z0-9.+\ -]*) printf "%s\t%s\n" "$n" "$slug" >> "$TMP/sin.tsv" ;;
*) printf "%s\t%s\t%s\n" "$n" "$lic" "$slug" >> "$TMP/con.tsv" ;;
esac
' < "$TMP/objetivos.tsv"
diff --git a/scripts/licencias.sh b/scripts/licencias.sh
index 5a27fa18..2a84d528 100755
--- a/scripts/licencias.sh
+++ b/scripts/licencias.sh
@@ -63,7 +63,7 @@ case "$MODO" in
# ── sembrar: escribir las licencias de la tabla curada ──────────────────────────────────────────
--sembrar)
[ -s "$TABLA" ] || { echo "!! falta la tabla curada: $TABLA"; exit 1; }
- puestas=0; ya=0; sin_receta=0
+ puestas=0; ya=0; sin_receta=0; corregidas=0
# TRES campos, no dos: `licencias-detectadas.tsv` añade una tercera columna con el `owner/repo`
# consultado (la procedencia, para poder auditar). Leyendo sólo dos variables, `lic` se tragaría
# también el slug y se escribiría `license = "MIT<TAB>owner/repo"` en la receta — basura silenciosa,
@@ -71,11 +71,32 @@ case "$MODO" in
while IFS=$'\t' read -r pkg lic _resto; do
case "$pkg" in ''|'#'*) continue ;; esac
[ -n "${lic:-}" ] || continue
+ # ÚLTIMA BARRERA antes de tocar una receta: la licencia tiene que TENER FORMA de expresión SPDX.
+ # Sin esto, cualquier fallo de una fuente aguas arriba se escribe como si fuera un dato — y el
+ # 2026-08-07 pasó: un cuerpo de error JSON de la API de GitHub acabó dentro de 5 recetas, con
+ # comillas, rompiendo el TOML y dejando de calcularse su ArtifactHash. Validar en el sitio que
+ # ESCRIBE es lo que corta la clase entera de fallo, no sólo el caso conocido.
+ case "$lic" in
+ *[!A-Za-z0-9.+\ -]*) echo " ?? $pkg: descarto licencia con forma inválida: $(printf '%.40s' "$lic")"; continue ;;
+ esac
hallada=0
for f in recipes/"$pkg".toml recipes/incoming-*/"$pkg".toml; do
[ -f "$f" ] || continue
hallada=1
- if tiene_licencia "$f"; then ya=$((ya+1)); continue; fi
+ if tiene_licencia "$f"; then
+ # FORZAR=1: reemplazar lo ya declarado. Sólo tiene sentido con una fuente MÁS autoritativa
+ # que la que puso el valor actual — el caso real es `licencias-cargo.tsv`, la declaración
+ # del propio autor, que corrige los dos defectos de la detección por API (SPDX ambiguo y
+ # licencias dobles colapsadas). Con la tabla curada NO se usa: pisaría a mano lo verificado.
+ if [ "${FORZAR:-0}" = 1 ] && [ "$(licencia_de "$f")" != "$lic" ]; then
+ esc=$(printf '%s' "$lic" | sed 's/[&/\]/\\&/g')
+ sed -i "0,/^[[:space:]]*license[[:space:]]*=.*/s//license = \"$esc\"/" "$f"
+ corregidas=$((corregidas+1))
+ else
+ ya=$((ya+1))
+ fi
+ continue
+ fi
# Insertar DESPUÉS de la línea `version = ...`, que está en la raíz del TOML y antes de
# cualquier `[table]`. Es el único sitio seguro (ver la trampa de TOML en la cabecera).
if grep -qE '^version[[:space:]]*=' "$f"; then
@@ -90,7 +111,7 @@ case "$MODO" in
done
[ "$hallada" = 0 ] && sin_receta=$((sin_receta+1))
done < "$TABLA"
- echo "==> sembradas $puestas · ya tenían $ya · en la tabla pero sin receta $sin_receta"
+ echo "==> sembradas $puestas · corregidas $corregidas · ya tenían $ya · sin receta $sin_receta"
echo "==> verificá que el hash NO se movió: ./scripts/store-gc.sh (debe dar los mismos vigentes)"
;;
@@ -139,6 +160,23 @@ case "$MODO" in
done
pct=0; [ "$tot" -gt 0 ] && pct=$((con*100/tot))
echo "==> licencias declaradas: $con de $tot recetas (${pct}%)"
+
+ # ── GUARDIÁN: licencias con FORMA INVÁLIDA ───────────────────────────────────────────────────
+ # El 2026-08-07 se escribió el cuerpo de un error JSON de la API de GitHub dentro de 5 recetas
+ # (`license = "{"message":"Not Found",...}"`). Las comillas rompen el TOML ⇒ esas recetas dejaron
+ # de parsear y de tener ArtifactHash, y así se COMMITEARON. No lo vio nadie leyendo: lo cazó la
+ # comparación de hashes. Por eso el informe lo comprueba SIEMPRE y sale distinto de cero: un dato
+ # con forma imposible es un fallo aguas arriba disfrazado de dato, y hay que verlo sin buscarlo.
+ malas=0
+ for f in $(recetas); do
+ l=$(licencia_de "$f")
+ [ -z "$l" ] && continue
+ case "$l" in *[!A-Za-z0-9.+\ -]*) echo "!! FORMA INVÁLIDA en $f: $(printf '%.50s' "$l")"; malas=$((malas+1));; esac
+ done
+ if [ "$malas" -gt 0 ]; then
+ echo "!! $malas recetas con licencia de forma imposible — probablemente TOML roto. Arreglar YA."
+ exit 1
+ fi
if [ "$con" -gt 0 ]; then
echo "==> reparto:"
sort /tmp/.lic-cuenta.$$ | uniq -c | sort -rn | head -25 | sed 's/^/ /'