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 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ 26c153c149c81663140768bfda7dafb19c010e4f scripts/licencias-textos.sh Shell · 74 siq'ikuna · 4.4 KB Ñawpa willay ch'uya

takana etapa 5c: comentarios de scripts, MOTD, y un BUG que introdujo la etapa 4 476168bb0 · Sergio ·

1#!/usr/bin/env bash
2# licencias-textos.sh — baja los textos CANÓNICOS de las licencias que el catálogo usa, a `licenses/`.
3#
4# ── POR QUÉ HACEN FALTA LOS TEXTOS, NO SÓLO EL IDENTIFICADOR ───────────────────────────────────
5# Saber que un paquete es GPL-2.0-or-later no cumple la GPL. La obligación al distribuir binarios es
6# **acompañarlos del texto de la licencia**. El identificador sirve para razonar (compatibilidad,
7# informes por imagen); el TEXTO es lo que hay que entregar.
8#
9# ── ⚠ DÓNDE SE ENTREGA, QUE NO ES DONDE YO CREÍA ───────────────────────────────────────────────
10# El SDD 19/20 decía «inyectar el texto en `takana pack`». **Está mal, y por una razón de fondo**:
11# `pack` produce un `.swm`, que es una RECETA DE TRANSFORMACIÓN sobre fuente pública y —por diseño
12# explícito— «NUNCA transporta binarios cocidos»; e `install` REPRODUCE construyendo, con cache-hit
13# del corpus, en vez de bajar binarios. O sea que el canal de paquetes de takana **no distribuye
14# binarios**, y la obligación de acompañar-el-binario ahí casi no aplica.
15#
16# Donde SÍ aplica, y con toda su fuerza, es en **las IMÁGENES INSTALABLES**: el rootfs se puebla con
17# `takana install` sobre un prefix y de ahí sale un USB/ISO lleno de binarios que se le da a alguien.
18# Ése es el punto de entrega, y por eso el consumidor de estos textos es el armado del rootfs.
19# (La otra obligación, el espejo de FUENTES, no la toca esto y sigue pendiente: las recetas apuntan a
20# URLs de terceros que se caen.)
21#
22# ── LA FUENTE: el repo canónico de SPDX ────────────────────────────────────────────────────────
23# `spdx/license-list-data`, `text/<ID>.txt`. Es la referencia normativa del identificador que ya
24# usamos, así que texto e identificador no pueden divergir.
25#
26# Nota sobre los identificadores OBSOLETOS (`GPL-3.0`, `LGPL-2.1`…): SPDX no publica un texto propio
27# para ellos porque **el texto es el mismo** que el de la variante moderna — lo que distingue
28# `-only` de `-or-later` es la CONCESIÓN, no el documento. Así que para esos se guarda el texto de la
29# variante base y se anota. No confundir: eso NO resuelve la ambigüedad del identificador, que sigue
30# siendo trabajo humano (`scripts/licencias.sh --revisar`).
31#
32# Uso:  scripts/licencias-textos.sh
33set -uo pipefail
34ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
35DEST="${DEST:-licenses}"
36command -v gh >/dev/null && gh auth status >/dev/null 2>&1 || { echo "!!  'gh' ausente o sin auth"; exit 1; }
37mkdir -p "$DEST"
38
39# Los identificadores realmente en uso, sacados de las recetas (no de una lista escrita a mano, que
40# se desincroniza). Se parten las expresiones compuestas: `MIT OR Apache-2.0` son dos textos.
41for f in recipes/*.toml recipes/incoming-*/*.toml; do
42  [ -f "$f" ] || continue
43  awk -F'"' '/^\[/{exit} /^[[:space:]]*license[[:space:]]*=/{print $2; exit}' "$f" 2>/dev/null
44done | tr ' ' '\n' | grep -E '^[A-Za-z0-9]' | grep -vE '^(OR|AND|WITH)$' | sort -u > /tmp/.spdx-uso
45
46# `Linux-syscall-note` es una EXCEPCIÓN (va tras `WITH`), no una licencia — pero SPDX la publica en
47# el mismo `text/` que las licencias, no en un `exceptions/` aparte (comprobado: ese directorio no
48# existe en el repo). O sea que no necesita caso especial: la suposición razonable era falsa.
49ok=0; falta=0; sinfich=""
50while IFS= read -r id; do
51  [ -z "$id" ] && continue
52  [ -s "$DEST/$id.txt" ] && { ok=$((ok+1)); continue; }
53  base="$id"
54  case "$id" in
55    GPL-2.0)  base="GPL-2.0-only" ;;      # obsoletos: mismo TEXTO que la variante base (ver cabecera)
56    GPL-3.0)  base="GPL-3.0-only" ;;
57    LGPL-2.1) base="LGPL-2.1-only" ;;
58    LGPL-3.0) base="LGPL-3.0-only" ;;
59    AGPL-3.0) base="AGPL-3.0-only" ;;
60  esac
61  ruta="text/$base.txt"
62  if gh api "repos/spdx/license-list-data/contents/$ruta" --jq '.content' 2>/dev/null \
63       | base64 -d > "$DEST/$id.txt" 2>/dev/null && [ -s "$DEST/$id.txt" ]; then
64    ok=$((ok+1))
65  else
66    rm -f "$DEST/$id.txt"; falta=$((falta+1)); sinfich="$sinfich $id"
67  fi
68done < /tmp/.spdx-uso
69
70echo "==> textos en $DEST/: $ok · sin texto canónico: $falta"
71[ -n "$sinfich" ] && {
72  echo "!!  sin texto:$sinfich"
73  echo "!!  (identificadores propios del proyecto o no publicados por SPDX — hay que ponerlos a mano)"
74}