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>
81 lines
5.0 KiB
TOML
81 lines
5.0 KiB
TOML
# cosmic-edit — el editor de texto. **Cuarta aplicación con ventana** del catálogo, y la más barata
|
|
# de las cuatro: su árbol de dependencias ya está compilado entero. Depende de `cosmic-files` como
|
|
# CRATE (el selector de ficheros y el árbol de proyecto), igual que `cosmic-term`, y con la misma
|
|
# línea: `default-features = false`. O sea que acá «ya se compiló» **sí** es cierto — al revés que
|
|
# cuando `cosmic-files` pasó de librería a programa (ver su receta).
|
|
#
|
|
# ── EL `Cargo.lock` MIENTE POR EXCESO, Y ACÁ SE VE ──────────────────────────────────────────────
|
|
# La regla de leer los crates `-sys` del lock antes de adivinar deps sigue siendo la buena, pero tiene
|
|
# un borde: el lock lista lo que es POSIBLE, no lo que está ENCENDIDO. Acá aparecen `gio-sys`,
|
|
# `glib-sys` y `gobject-sys` —que en cualquier otro paquete significarían «hay que declarar glib»—
|
|
# y sin embargo esta receta no declara ninguna: entran sólo por la feature `gvfs`, que se apaga.
|
|
# El lock dice el universo; las features dicen el recorte.
|
|
#
|
|
# ── FEATURES: `gvfs` y `wgpu` APAGADAS, por lo mismo que en cosmic-files ─────────────────────────
|
|
# `default = ["dbus-config", "gvfs", "wgpu", "wayland"]`.
|
|
# · `gvfs` → cosmic-files/gvfs → crates `gio`/`glib` por pkg-config sobre las glib **COMPARTIDAS**,
|
|
# que el corpus sólo empaqueta estáticas. Se pierden los montajes remotos del diálogo de abrir,
|
|
# no la edición local.
|
|
# · `wgpu` → el árbol wgpu+naga+ash+glow+spirv a `codegen-units=1` desbordó el filesystem dos veces
|
|
# construyendo cosmic-files. Sin él se pinta con tiny-skia, que es lo que hace el resto de los
|
|
# clientes de la imagen (mesa es llvmpipe por software: el backend wgpu se caería a software
|
|
# igual).
|
|
# Quedan `dbus-config` (cosmic-config por zbus, Rust puro) y `wayland`.
|
|
#
|
|
# ── LO QUE NO PASÓ, Y VALE ANOTARLO ─────────────────────────────────────────────────────────────
|
|
# La doble barra `pop-os//` que mordió en `cosmic-applets` y `cosmic-settings` acá está **comentada**
|
|
# en el `Cargo.toml` (bloques `[patch.…]` de la rama `theme-v2`). Se verificó con `grep 'pop-os//'`
|
|
# sobre `Cargo.toml` y `Cargo.lock` antes de construir: cuesta un segundo y evita un fetch fallido a
|
|
# los cuarenta minutos.
|
|
name = "cosmic-edit"
|
|
version = "1.5.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"
|
|
sha256 = "d567902b1e04829eedd428cd37372137908947cfafccc14ba485b1ad58832cba"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
# Dinámico como todo cliente de la suite: `wayland-client` entra con la feature `dlopen` y un musl
|
|
# estático no la honra — arranca y muere con «The wayland library could not be loaded» *teniendo*
|
|
# el `.so`.
|
|
link = "dynamic"
|
|
|
|
[build.phases]
|
|
# Fase compile CUSTOM porque hay que elegir features a mano (`--no-default-features`), que la fase
|
|
# autogenerada del lab no permite. `INSTALL_DIR` y `APPID` los exporta el justfile de upstream y los
|
|
# lee el `build.rs` (crate `xdgen`) para generar el `.desktop` y el `.metainfo.xml` en
|
|
# `target/xdgen/`; sin ellos el `.desktop` sale con rutas equivocadas, y ese fichero es justo lo que
|
|
# hace que la aplicación aparezca en la biblioteca.
|
|
compile = '''
|
|
printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec zig cc -mcpu=baseline "$@"' > "$PWD/.hammer-zig-cc"
|
|
chmod +x "$PWD/.hammer-zig-cc"
|
|
RF="-C linker=$PWD/.hammer-zig-cc -C target-feature=-crt-static"
|
|
rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
|
|
export INSTALL_DIR=/usr/share APPID=com.system76.CosmicEdit
|
|
CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo build --release --locked --offline \
|
|
--no-default-features --features dbus-config,wayland
|
|
'''
|
|
install = '''
|
|
mkdir -p /out/usr/bin /out/usr/share/applications /out/usr/share/metainfo
|
|
cp target/release/cosmic-edit /out/usr/bin/cosmic-edit
|
|
chmod 755 /out/usr/bin/cosmic-edit
|
|
cp target/xdgen/com.system76.CosmicEdit.desktop /out/usr/share/applications/ 2>/dev/null || true
|
|
cp target/xdgen/com.system76.CosmicEdit.metainfo.xml /out/usr/share/metainfo/ 2>/dev/null || true
|
|
for size in res/icons/hicolor/*; do
|
|
[ -d "$size" ] || continue
|
|
s=$(basename "$size")
|
|
if [ -f "$size/apps/com.system76.CosmicEdit.svg" ]; then
|
|
mkdir -p "/out/usr/share/icons/hicolor/$s/apps"
|
|
cp "$size/apps/com.system76.CosmicEdit.svg" "/out/usr/share/icons/hicolor/$s/apps/"
|
|
fi
|
|
done
|
|
'''
|
|
|
|
[deps]
|
|
# El juego fijo de todo cliente de la suite, y nada más. `syntect`/`two-face` (resaltado), `grep`,
|
|
# `ignore`, `notify` y `icu` son Rust puro; `dbus-config` habla por zbus. Sin `gvfs` no hay glib.
|
|
build = ["libxkbcommon", "pkgconf", "libudev-zero", "libinput"]
|