gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 815Rust 56Shell 37Markdown 291229 Definitions

licencias: la cola de pendientes también se escribe — «lo que falta y por qué» es dato

Las 33 que quedan sólo existían en la salida del script, o sea que se perdían al cerrar la terminal.
Para quien tiene que decidirlas —y son decisiones legales, no mecánicas— «qué falta y POR QUÉ no se
puede afirmar» es tan dato como los veredictos. `docs/licencias-pendientes.tsv` las deja listadas con
su motivo: cuáles traen varios ficheros de licencia que dicen cosas distintas (gmp, ffmpeg, clang18,
llvm18, los `gi-*`), cuáles tienen un LICENSE que no reconozco y con qué frase empieza (fuse3, lsof),
y cuáles no traen nada en el árbol (boost, pigz, sqlite-shared).

Al revés que `licencias-evidencia.tsv`, ésta se REGENERA entera en cada corrida. No es un registro de
lo que se probó sino una foto de lo que queda, y una pendiente resuelta tiene que DESAPARECER de acá
—si se acumulara, la lista de trabajo mentiría hacia arriba para siempre.

058162c6d3bb134cc5b100d11081f213d5f811b8 · by Sergio · (1 month ago) · parent d7d9cf8fd · browse the tree at this commit

Semantic delta · 1

scripts/licencias-fuente.py

  • body changed fn main

3 files · +50 −3

diff --git a/docs/licencias-evidencia.tsv b/docs/licencias-evidencia.tsv
index 22e39a06..d32520c7 100644
--- a/docs/licencias-evidencia.tsv
+++ b/docs/licencias-evidencia.tsv
@@ -32,6 +32,7 @@ mtdev	MIT	COPYING (texto de MIT)
 nano	GPL-3.0-or-later	COPYING + concesión en NEWS: …Finally, nano is now licensed under the GNU GPL version 3 or later, and its documentat…
 nghttp2	MIT	COPYING (texto de MIT)
 pcre2-shared	BSD-3-Clause	LICENCE.md (texto de BSD-3-Clause)
+perl-xml-parser	Artistic-2.0	LICENSE es el texto íntegro de "The Artistic License 2.0" (8937 bytes, Copyright 1998-2000 Larry Wall y Clark Cooper)
 portal-probe	MIT	el repo es el propio hammer: LICENSE (MIT License) + Cargo.toml: license = "MIT"
 scdoc	MIT	COPYING (texto de MIT)
 seatd	MIT	meson.build: license: 'MIT'
@@ -40,6 +41,5 @@ sourceview-hello	LGPL-2.1-or-later	meson.build: license: 'LGPL-2.1-or-later'
 speexdsp	BSD-3-Clause	COPYING (texto de BSD-3-Clause)
 tea	MIT	LICENSE (texto de MIT)
 tllist	MIT	meson.build: license: 'MIT'
-wpa_supplicant	BSD-3-Clause	COPYING dice "the project has chosen to use only the BSD license option for future distribution" y remite al README, que trae las 3 cláusulas clásicas (incl. "Neither the name(s) ... endorse or promote")
 when	Artistic-1.0-Perl OR GPL-1.0-or-later	LICENSE: "This free software is copyleft licensed under the same terms as Perl, or, at your option, under version 2 of the GPL license" — «los mismos términos que Perl» es esa disyunción, y la opción GPL-2 ya queda cubierta por GPL-1.0-or-later
-perl-xml-parser	Artistic-2.0	LICENSE es el texto íntegro de "The Artistic License 2.0" (8937 bytes, Copyright 1998-2000 Larry Wall y Clark Cooper)
+wpa_supplicant	BSD-3-Clause	COPYING dice "the project has chosen to use only the BSD license option for future distribution" y remite al README, que trae las 3 cláusulas clásicas (incl. "Neither the name(s) ... endorse or promote")
diff --git a/docs/licencias-pendientes.tsv b/docs/licencias-pendientes.tsv
new file mode 100644
index 00000000..5a868cce
--- /dev/null
+++ b/docs/licencias-pendientes.tsv
@@ -0,0 +1,32 @@
+# licencias-pendientes.tsv — lo que NO alcanza para afirmar una licencia, y por qué.
+# Lo regenera entero scripts/licencias-fuente.py en cada corrida: es la foto de lo
+# que queda, no un registro. Los veredictos van en licencias-evidencia.tsv.
+#
+# paquete<TAB>por qué no se puede afirmar
+boost	sin COPYING ni declaración en el árbol
+cargo-audit	sin COPYING ni declaración en el árbol
+clang18	la raíz dice 3 licencias distintas (Apache-2.0 en LICENSE.TXT, BSD-3-Clause en LICENSE.TXT, MIT en LICENSE.TXT): la expresión la compone un humano
+ffmpeg	la raíz dice 4 licencias distintas (GPL-2.0 en COPYING.GPLv2, GPL-3.0 en COPYING.GPLv3, LGPL-2.1 en COPYING.LGPLv2.1, LGPL-3.0 en COPYING.LGPLv3): la expresión…
+fuse3	LICENSE existe pero no reconozco su texto — empieza: "The following files may be used under the terms of the GNU Lesser"
+gi-foreign-girs	la raíz dice 2 licencias distintas (GPL-2.0 en COPYING.GPL, LGPL-2.0 en COPYING.LGPL): la expresión la compone un humano
+gi-foreign-typelibs	la raíz dice 2 licencias distintas (GPL-2.0 en COPYING.GPL, LGPL-2.0 en COPYING.LGPL): la expresión la compone un humano
+gi-girepository-typelib	la raíz dice 2 licencias distintas (GPL-2.0 en COPYING.GPL, LGPL-2.0 en COPYING.LGPL): la expresión la compone un humano
+gsd-schemas	la raíz dice 2 licencias distintas (GPL-2.0 en COPYING, LGPL-2.1 en COPYING.LIB): la expresión la compone un humano
+hwdata	GPL-2.0 ambigua · sin concesión fuera del COPYING
+libgdm	el autor declara «GPL2+», que no es un SPDX del que tengamos texto en licenses/ (meson.build: license: 'GPL2+')
+libical	la raíz dice 2 licencias distintas (LGPL-2.1 en LICENSE.LGPL21.txt, MPL-2.0 en LICENSE.MPL2.txt): la expresión la compone un humano
+llvm18	la raíz dice 3 licencias distintas (Apache-2.0 en LICENSE.TXT, BSD-3-Clause en LICENSE.TXT, MIT en LICENSE.TXT): la expresión la compone un humano
+lsof	COPYING existe pero no reconozco su texto — empieza: "Copyright 2002 Purdue Research Foundation, West Lafayette,"
+openssh	la raíz dice 2 licencias distintas (BSD-3-Clause en LICENCE, MIT en LICENCE): la expresión la compone un humano
+pigz	sin COPYING ni declaración en el árbol
+sqlite-shared	sin COPYING ni declaración en el árbol
+vulkan-headers	REUSE con varias licencias: Apache-2.0,MIT
+xz-shared	la raíz dice 4 licencias distintas (0BSD en COPYING.0BSD, GPL-2.0 en COPYING.GPLv2, GPL-3.0 en COPYING.GPLv3, LGPL-2.1 en COPYING.LGPLv2.1): la expresión la co…
+amp	fuente git (probá --fetch)
+cargo-binstall	fuente git (probá --fetch)
+duplicacy	fuente git (probá --fetch)
+gmp	tarball no cacheado (probá --fetch)
+leptonica	tarball no cacheado (probá --fetch)
+libcanberra	tarball no cacheado (probá --fetch)
+tzdata	fuente git (probá --fetch)
+waybackurls	fuente git (probá --fetch)
diff --git a/scripts/licencias-fuente.py b/scripts/licencias-fuente.py
index 74f2376c..0018c24d 100755
--- a/scripts/licencias-fuente.py
+++ b/scripts/licencias-fuente.py
@@ -57,6 +57,7 @@ import tomllib
 RAIZ = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 CACHE = os.path.join(RAIZ, "work", "tarballs")
 SALIDA = os.path.join(RAIZ, "docs", "licencias-evidencia.tsv")
+COLA = os.path.join(RAIZ, "docs", "licencias-pendientes.tsv")
 
 # Cada licencia se reconoce por una frase que no aparece en las demás. El texto se NORMALIZA
 # (espacios colapsados) antes de buscar, porque el mismo texto viene con saltos de línea distintos
@@ -545,7 +546,21 @@ def main():
     print(f"\n==> sin tarball que mirar: {len(sin_tar)}")
     for n, c in sin_tar:
         print(f"   {n:28s} {c}")
-    print(f"\n==> escrito {os.path.relpath(SALIDA, RAIZ)} · NADA se tocó en recipes/")
+    # La cola de lo que NO se pudo afirmar también se escribe. Vivía sólo en la salida del script,
+    # o sea que se perdía al cerrar la terminal: para el humano que tiene que decidir, «lo que falta
+    # y por qué» es tan dato como los veredictos. Ésta SÍ se regenera entera en cada corrida —al
+    # revés que la de evidencia, que acumula— porque es una foto de lo que queda, no un registro de
+    # lo que se probó: una pendiente resuelta tiene que DESAPARECER de acá.
+    with open(COLA, "w") as fh:
+        fh.write("# licencias-pendientes.tsv — lo que NO alcanza para afirmar una licencia, y por qué.\n")
+        fh.write("# Lo regenera entero scripts/licencias-fuente.py en cada corrida: es la foto de lo\n")
+        fh.write("# que queda, no un registro. Los veredictos van en licencias-evidencia.tsv.\n")
+        fh.write("#\n# paquete<TAB>por qué no se puede afirmar\n")
+        for n, c in sorted(set(pendientes)) + sorted(set(sin_tar)):
+            fh.write(f"{n}\t{una_linea(c)}\n")
+
+    print(f"\n==> escrito {os.path.relpath(SALIDA, RAIZ)} y {os.path.relpath(COLA, RAIZ)}"
+          f" · NADA se tocó en recipes/")
 
 
 if __name__ == "__main__":