250 líneas de comentario en 151 scripts. Control verificado: el diff no toca NI UNA línea que no empiece por #, y la sintaxis de los 151 pasa. El barrido saltea heredocs y cadenas triples, y el guardián DISPARÓ 3 veces: las tres eran el MOTD que el script escribe DENTRO de la imagen construida — texto del producto, no comentario del script. Se cambiaron aparte y a propósito, que es rebranding, no limpieza. Y el hallazgo caro: casaba contra , que es el TARGET de tracing — o sea el module_path!, o sea el nombre del crate. La etapa 4 lo movió a y el script quedó casando NADA. No fallaba: imprimía cero atribuciones, indistinguible de un log sin problemas. Comprobado con el binario (RUST_LOG=info sobre zlib), no deducido. Ahora acepta las dos, y tiene que seguir aceptándolas porque los logs viejos en disco dicen la vieja. Además 14 rutas de módulo en docs, que el barrido anterior no tocó porque no es frontera de palabra.
75 lines
4.4 KiB
Bash
Executable File
75 lines
4.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# licencias-textos.sh — baja los textos CANÓNICOS de las licencias que el catálogo usa, a `licenses/`.
|
|
#
|
|
# ── POR QUÉ HACEN FALTA LOS TEXTOS, NO SÓLO EL IDENTIFICADOR ───────────────────────────────────
|
|
# Saber que un paquete es GPL-2.0-or-later no cumple la GPL. La obligación al distribuir binarios es
|
|
# **acompañarlos del texto de la licencia**. El identificador sirve para razonar (compatibilidad,
|
|
# informes por imagen); el TEXTO es lo que hay que entregar.
|
|
#
|
|
# ── ⚠ DÓNDE SE ENTREGA, QUE NO ES DONDE YO CREÍA ───────────────────────────────────────────────
|
|
# El SDD 19/20 decía «inyectar el texto en `takana pack`». **Está mal, y por una razón de fondo**:
|
|
# `pack` produce un `.swm`, que es una RECETA DE TRANSFORMACIÓN sobre fuente pública y —por diseño
|
|
# explícito— «NUNCA transporta binarios cocidos»; e `install` REPRODUCE construyendo, con cache-hit
|
|
# del corpus, en vez de bajar binarios. O sea que el canal de paquetes de takana **no distribuye
|
|
# binarios**, y la obligación de acompañar-el-binario ahí casi no aplica.
|
|
#
|
|
# Donde SÍ aplica, y con toda su fuerza, es en **las IMÁGENES INSTALABLES**: el rootfs se puebla con
|
|
# `takana install` sobre un prefix y de ahí sale un USB/ISO lleno de binarios que se le da a alguien.
|
|
# Ése es el punto de entrega, y por eso el consumidor de estos textos es el armado del rootfs.
|
|
# (La otra obligación, el espejo de FUENTES, no la toca esto y sigue pendiente: las recetas apuntan a
|
|
# URLs de terceros que se caen.)
|
|
#
|
|
# ── LA FUENTE: el repo canónico de SPDX ────────────────────────────────────────────────────────
|
|
# `spdx/license-list-data`, `text/<ID>.txt`. Es la referencia normativa del identificador que ya
|
|
# usamos, así que texto e identificador no pueden divergir.
|
|
#
|
|
# Nota sobre los identificadores OBSOLETOS (`GPL-3.0`, `LGPL-2.1`…): SPDX no publica un texto propio
|
|
# para ellos porque **el texto es el mismo** que el de la variante moderna — lo que distingue
|
|
# `-only` de `-or-later` es la CONCESIÓN, no el documento. Así que para esos se guarda el texto de la
|
|
# variante base y se anota. No confundir: eso NO resuelve la ambigüedad del identificador, que sigue
|
|
# siendo trabajo humano (`scripts/licencias.sh --revisar`).
|
|
#
|
|
# Uso: scripts/licencias-textos.sh
|
|
set -uo pipefail
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
|
|
DEST="${DEST:-licenses}"
|
|
command -v gh >/dev/null && gh auth status >/dev/null 2>&1 || { echo "!! 'gh' ausente o sin auth"; exit 1; }
|
|
mkdir -p "$DEST"
|
|
|
|
# Los identificadores realmente en uso, sacados de las recetas (no de una lista escrita a mano, que
|
|
# se desincroniza). Se parten las expresiones compuestas: `MIT OR Apache-2.0` son dos textos.
|
|
for f in recipes/*.toml recipes/incoming-*/*.toml; do
|
|
[ -f "$f" ] || continue
|
|
awk -F'"' '/^\[/{exit} /^[[:space:]]*license[[:space:]]*=/{print $2; exit}' "$f" 2>/dev/null
|
|
done | tr ' ' '\n' | grep -E '^[A-Za-z0-9]' | grep -vE '^(OR|AND|WITH)$' | sort -u > /tmp/.spdx-uso
|
|
|
|
# `Linux-syscall-note` es una EXCEPCIÓN (va tras `WITH`), no una licencia — pero SPDX la publica en
|
|
# el mismo `text/` que las licencias, no en un `exceptions/` aparte (comprobado: ese directorio no
|
|
# existe en el repo). O sea que no necesita caso especial: la suposición razonable era falsa.
|
|
ok=0; falta=0; sinfich=""
|
|
while IFS= read -r id; do
|
|
[ -z "$id" ] && continue
|
|
[ -s "$DEST/$id.txt" ] && { ok=$((ok+1)); continue; }
|
|
base="$id"
|
|
case "$id" in
|
|
GPL-2.0) base="GPL-2.0-only" ;; # obsoletos: mismo TEXTO que la variante base (ver cabecera)
|
|
GPL-3.0) base="GPL-3.0-only" ;;
|
|
LGPL-2.1) base="LGPL-2.1-only" ;;
|
|
LGPL-3.0) base="LGPL-3.0-only" ;;
|
|
AGPL-3.0) base="AGPL-3.0-only" ;;
|
|
esac
|
|
ruta="text/$base.txt"
|
|
if gh api "repos/spdx/license-list-data/contents/$ruta" --jq '.content' 2>/dev/null \
|
|
| base64 -d > "$DEST/$id.txt" 2>/dev/null && [ -s "$DEST/$id.txt" ]; then
|
|
ok=$((ok+1))
|
|
else
|
|
rm -f "$DEST/$id.txt"; falta=$((falta+1)); sinfich="$sinfich $id"
|
|
fi
|
|
done < /tmp/.spdx-uso
|
|
|
|
echo "==> textos en $DEST/: $ok · sin texto canónico: $falta"
|
|
[ -n "$sinfich" ] && {
|
|
echo "!! sin texto:$sinfich"
|
|
echo "!! (identificadores propios del proyecto o no publicados por SPDX — hay que ponerlos a mano)"
|
|
}
|