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 188Rust 55Shell 30Markdown 281211 Definiciones

⎇ a6a9d59e4f0d354cf2c9066538c6fa7016fc6721 scripts/licencias-detectar.sh Shell · 83 líneas · 4.8 KB Historia crudo

licencias: 936 de 1141 (82%) — detección por evidencia, con sus dos imprecisiones declaradas a6a9d59e4 · sergio ·

1#!/usr/bin/env bash
2# licencias-detectar.sh — deriva la licencia de las recetas cuya fuente vive en GitHub,
3# preguntándole a GitHub por el fichero LICENSE REAL del repo. Complemento de `licencias.sh`.
4#
5# ── POR QUÉ ESTO NO VIOLA LA REGLA DE «NO SE ADIVINA» ───────────────────────────────────────────
6# `licencias.sh` prohíbe rellenar a ojo, y con razón: declarar mal una licencia convierte un hueco
7# visible en una afirmación falsa. Esto NO es adivinar. La API `/repos/{o}/{r}/license` devuelve el
8# resultado de **detectar el fichero LICENSE que el repo tiene de verdad** (GitHub usa licensee), no
9# una etiqueta que alguien escribió a mano en una web. Es la misma evidencia que miraríamos nosotros
10# abriendo el tarball, obtenida sin descargar 686 tarballs por un enlace de 8 Mbps.
11#
12# ── ⚠ LA LIMITACIÓN, QUE SE REGISTRA EN VEZ DE ESCONDERSE ───────────────────────────────────────
13# GitHub detecta sobre la **rama por defecto**, no sobre el tag/commit que la receta pinea. En la
14# enorme mayoría de proyectos es lo mismo, pero NO es una garantía: un proyecto pudo relicenciarse
15# después de la versión que empaquetamos. Por eso:
16#   · la salida va a un fichero APARTE (`docs/licencias-detectadas.tsv`) con procedencia y fecha,
17#     no directo a las recetas — se puede auditar y rehacer;
18#   · sólo se aceptan SPDX **definidos**: se descartan `NOASSERTION`, `null` y `other`, que es
19#     justamente GitHub diciendo «no estoy seguro». Un «no sé» de la fuente se propaga como hueco,
20#     no se redondea a una licencia plausible.
21# Si algún día hace falta exactitud a nivel de tag, el cierre correcto es el estructural: capturar
22# el COPYING/LICENSE en la fase de fetch, que ya descarga y extrae el tarball pineado.
23#
24# Uso:  scripts/licencias-detectar.sh            (escribe docs/licencias-detectadas.tsv)
25#       luego:  TABLA=docs/licencias-detectadas.tsv scripts/licencias.sh --sembrar
26set -uo pipefail
27ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
28SALIDA="${SALIDA:-docs/licencias-detectadas.tsv}"
29JOBS="${JOBS:-8}"
30
31command -v gh >/dev/null || { echo "!!  falta el CLI 'gh'"; exit 1; }
32gh auth status >/dev/null 2>&1 || { echo "!!  'gh' no está autenticado"; exit 1; }
33
34TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT
35
36# 1. Las que NO tienen licencia y cuya fuente es github.com → «nombre<TAB>owner/repo»
37./scripts/licencias.sh --faltan 2>/dev/null | while IFS= read -r n; do
38  f=$(ls "recipes/$n.toml" 2>/dev/null | head -1)
39  [ -z "$f" ] && f=$(ls recipes/incoming-*/"$n.toml" 2>/dev/null | head -1)
40  [ -z "$f" ] && continue
41  u=$(grep -m1 -E '^[[:space:]]*(tarball|repo)[[:space:]]*=' "$f" 2>/dev/null)
42  case "$u" in *github.com*) ;; *) continue ;; esac
43  # Sirve para https://github.com/o/r/... y para git@github.com:o/r.git
44  slug=$(printf '%s\n' "$u" | sed -E 's#.*github\.com[:/]+([^/"]+)/([^/"]+).*#\1/\2#; s/\.git$//')
45  case "$slug" in */*) printf '%s\t%s\n' "$n" "$slug" ;; esac
46done | sort -u > "$TMP/objetivos.tsv"
47
48TOT=$(wc -l < "$TMP/objetivos.tsv")
49echo "==> a consultar: $TOT recetas con fuente en GitHub"
50
51# 2. Preguntar a GitHub. Sólo SPDX definidos.
52export TMP
53xargs -P "$JOBS" -I{} sh -c '
54  n=$(printf "%s" "{}" | cut -f1); slug=$(printf "%s" "{}" | cut -f2)
55  lic=$(gh api "repos/$slug/license" --jq ".license.spdx_id" 2>/dev/null)
56  case "$lic" in
57    ""|null|NOASSERTION|other) printf "%s\t%s\n" "$n" "$slug" >> "$TMP/sin.tsv" ;;
58    *) printf "%s\t%s\t%s\n" "$n" "$lic" "$slug" >> "$TMP/con.tsv" ;;
59  esac
60' < "$TMP/objetivos.tsv"
61
62CON=$(wc -l < "$TMP/con.tsv" 2>/dev/null || echo 0)
63SIN=$(wc -l < "$TMP/sin.tsv" 2>/dev/null || echo 0)
64
65{
66  echo "# licencias-detectadas.tsv — GENERADO por scripts/licencias-detectar.sh. No editar a mano."
67  echo "#"
68  echo "# Procedencia: API de GitHub /repos/{owner}/{repo}/license, que detecta el fichero LICENSE"
69  echo "# REAL del repositorio (licensee). Es evidencia, no una etiqueta escrita a mano."
70  echo "#"
71  echo "# ⚠ LIMITACIÓN REGISTRADA: la detección es sobre la RAMA POR DEFECTO, no sobre el tag que la"
72  echo "# receta pinea. Casi siempre coinciden, pero un proyecto pudo relicenciarse después de la"
73  echo "# versión que empaquetamos. Los SPDX indefinidos (NOASSERTION/other/vacío) se DESCARTAN: un"
74  echo "# «no sé» de la fuente se propaga como hueco, no se redondea a una licencia plausible."
75  echo "#"
76  echo "# Formato: <receta><TAB><SPDX><TAB><owner/repo consultado>"
77  echo "# Consultadas $TOT · con SPDX definido $CON · sin SPDX utilizable $SIN"
78  sort "$TMP/con.tsv" 2>/dev/null
79} > "$SALIDA"
80
81echo "==> con SPDX definido: $CON · descartadas por indefinido: $SIN"
82echo "==> escrito: $SALIDA"
83echo "==> sembrar con:  TABLA=$SALIDA ./scripts/licencias.sh --sembrar"