Files
takana/recipes/incoming-gnome/gnome-shell-extension-dash-to-panel.toml
SergioandClaude Opus 5 4e4a2c8d2a gnome: dash-to-panel, appindicator y gnome-tweaks — y la lista de activas sale de las recetas
GNOME deja de ser la cáscara: tres extensiones y la app que el proyecto no instala y todo el mundo
termina instalando. El perfil queda 190/190 con 28 raíces, deuda 0.

  dash-to-panel v73   junta dash, ventanas y bandeja en una sola barra (lo que más cambia el uso)
  appindicator v64    devuelve los ICONOS DE BANDEJA que GNOME quitó; sin ella las apps que usan
                      StatusNotifierItem corren y no tienen dónde mostrarse
  blur-my-shell v72   (ya estaba; se le saca el override, ver abajo)
  gnome-tweaks 46.1   tema, iconos, cursor, tipografías, los botones de minimizar/maximizar que
                      GNOME esconde, y el interruptor de las extensiones

⚠ LA LISTA DE ACTIVAS SE MUEVE A UN SOLO SITIO, y esto era una bomba de relojería. `enabled-extensions`
es un ARRAY: un override de GSettings lo escribe ENTERO. Con la primera extensión el override vivía
en su receta y funcionaba; con la segunda NO se habrían sumado — ganaría la que compile última
(orden alfabético) y las otras quedarían instaladas y MUERTAS, sin un solo error. Ahora la arma
`scripts/gnome/gnome-start-qemu.sh`, que ya compilaba los esquemas al arrancar, enumerando los uuid
presentes en /usr/share/gnome-shell/extensions. La política es «lo que la imagen instala, se
activa»; el dconf del usuario gana sobre el default.
Una receta NO puede ser ese sitio: hammer exige `[source]` en toda receta («missing field `source`»),
así que no hay forma de escribir una receta de pura política. Se probó el bloque contra un árbol de
juguete: lista las dos extensiones, salta un directorio sin metadata.json, el override compila con
stderr vacío y `gsettings get` devuelve las dos. Y si la lista cambia borra `gschemas.compiled` para
forzar recompilación — sin eso, una imagen ya arrancada ignoraría la extensión nueva en silencio.

⚠ EL HALLAZGO CARO: `msgfmt` de gettext-tiny REVIENTA con las formas plurales del árabe. SIGILL,
exit 132, «index 6 out of bounds for type 'size_t[6]'», y deja un .mo de 0 bytes. Reproducido FUERA
de la receta con el binario sellado. No es el idioma sino el mensaje: blur-my-shell compila su
ar.po sin problema porque no tiene NINGÚN plural (msgstr[5] = 0); el de tweaks tiene exactamente
uno. Acá se saca `ar` del LINGUAS y se pierde la traducción de UNA app, con el diagnóstico escrito
en la receta. ARREGLARLO ES OTRA UNIDAD DE TRABAJO: gettext-tiny la usan 108 recetas.

Cada receta usa el mecanismo de SU upstream, que no es el mismo en las tres:
  blur-my-shell   `make build` llama a `gnome-extensions pack` —el CLI que nuestro shell apaga— así
                  que se copia el árbol a mano, con el layout LEÍDO del zip de EGO y comparado
                  contra él (idéntico, sin sobras ni faltantes)
  dash-to-panel   su Makefile tiene un `install` que honra DESTDIR y hace lo de un paquete de
                  distro: gschema y locale a los directorios GLOBALES. ⚠ `VERSION=73` se pasa a
                  mano porque sin ella el Makefile hace `git describe` y el árbol viene por
                  `git archive`, sin `.git` ⇒ metadata quedaría con el marcador "version": 9999
  appindicator    meson. ⚠ `-Dlocal_install=disabled` explícito: en `auto` decide mirando si el uid
                  es 0, o sea que hoy acierta POR ACCIDENTE — y si el lab dejara de correr como
                  root instalaría en $HOME/.local y el artefacto sellaría vacío. Y `jq` va en deps
                  aunque sea JavaScript puro: su meson saca el uuid del metadata.json con jq

⚠ gnome-tweaks NO costó ninguna receta nueva, y eso hubo que medirlo: su meson declara siete deps
mínimas de runtime y las siete ya estaban selladas. La que parecía traer una cadena de Python
entera —`pygobject-3.0`— la provee `py3-gobject`, que YA ESTABA en el corpus con otro nombre y
publica `pygobject-3.0.pc`. El nombre no es el hecho, otra vez.
Sí costó dos deps que el configure reclamó y que son el patrón `.pc Requires` → `[deps].build`:
`appstream` (la pide `libadwaita-1.pc` y el error culpa a libadwaita, que está bien instalada) y
`desktop-file-utils` (meson la busca como PROGRAMA para `update-desktop-database`).
Sus deps de RUNTIME —python3 y py3-gobject— van declaradas: es una app de Python, si no están en la
imagen se instala y no arranca, y ningún build lo delata.

Las cuatro licencias, verificadas en la fuente pineada y NINGUNA leída del COPYING —cuyo apéndice
«How to Apply» trae siempre la frase «or any later version»—: blur-my-shell del README del commit,
dash-to-panel y appindicator de la cabecera de sus fuentes, gnome-tweaks de su etiqueta SPDX.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LCt3ettR4Z7b6wPCBmbvEV
2026-09-09 19:41:52 +00:00

70 lines
4.0 KiB
TOML

# dash-to-panel 73 — la barra de tareas: mueve el dash al panel superior y junta lanzadores,
# ventanas abiertas y bandeja en una sola barra, al estilo Plasma/Windows 7+. Es, con diferencia, la
# extensión que más cambia el uso diario de GNOME.
#
# Segunda extensión del catálogo; el patrón lo fijó `gnome-shell-extension-blur-my-shell` y su
# cabecera explica por qué la fuente es el REPO y no el zip de extensions.gnome.org.
# El tag `v73` es el que EGO sirve para shell 48 (preguntado a su API, no supuesto) y el
# `metadata.json` del repo declara shell-version ["46","47","48","49","50"].
#
# ══ ACÁ SÍ SE USA EL `make install` DE UPSTREAM ════════════════════════════════════════════════
# A diferencia de blur-my-shell —cuyo `make build` llama a `gnome-extensions pack`, el CLI que
# nuestra receta del shell apaga— el Makefile de dash-to-panel tiene un `install` que HONRA
# `DESTDIR` y hace exactamente lo que hace un paquete de distro:
# · el árbol de la extensión va a $DESTDIR/usr/share/gnome-shell/extensions/<uuid>/
# · y en modo «system» SACA de ahí `schemas/` y `locale/` para ponerlos en los directorios
# GLOBALES: /usr/share/glib-2.0/schemas y /usr/share/locale.
# Se usa su install en vez de copiar a mano: es upstream quien decide qué entra y qué no.
#
# ⚠ Que el gschema termine en el directorio GLOBAL no es un detalle: lo compila el mismo
# `glib-compile-schemas` que corre el lanzador al arrancar, junto con los del shell. Por eso esta
# receta NO necesita compilarlo ella (y el Makefile igual lo compila para el `_build`).
#
# ⚠ `VERSION=73` SE PASA A MANO, y no es cosmético. Sin ella el Makefile hace
# `git describe --tags HEAD` para deducirla, y el árbol se materializa con `git archive`, SIN `.git`
# ⇒ la orden falla y `metadata.json` queda con el `"version": 9999` de marcador que trae el repo.
# Es la misma razón por la que la receta de `tzdata` pasa `VERSION=2026b`.
name = "gnome-shell-extension-dash-to-panel"
version = "73"
# licencia: el fichero COPYING del commit pineado es el texto del GPL v2, y el `metadata.json` de
# EGO no declara licencia. ⚠ La concesión está en la CABECERA de los fuentes (src/extension.js y
# compañía): «either version 2 of the License, or (at your option) any later version» ⇒ -or-later.
# No se dedujo del COPYING: su apéndice «How to Apply» contiene esa frase SIEMPRE, así que buscarla
# ahí da positivo aunque el proyecto sea -only (la trampa que ya está documentada en el repo).
license = "GPL-2.0-or-later"
[source]
repo = "https://github.com/home-sweet-gnome/dash-to-panel"
commit = "b31cbe1f3c9fa997b954b71199563fbedc2f3446" # tag v73 (ADR 0006: commit fijo, nunca HEAD)
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
[build.phases]
# Nada que compilar en el sentido de C: `make all` sólo compila el gschema y los catálogos .po.
configure = "true"
compile = 'make VERSION=73'
install = '''
set -e
UUID="dash-to-panel@jderose9.github.com"
make install DESTDIR=/out VERSION=73
D="/out/usr/share/gnome-shell/extensions/$UUID"
# Guardián: el `install` de upstream mueve cosas de sitio según DESTDIR, así que se comprueba el
# resultado y no la intención. Un artefacto a medias sella igual y el fallo sale recién al arrancar
# el escritorio (regla 3 de CLAUDE.md).
test -s "$D/metadata.json"
test -s "$D/extension.js"
grep -q '"version": 73' "$D/metadata.json" # falla si el sed de VERSION no corrió (quedaría 9999)
grep -q '"48"' "$D/metadata.json" # falla si un bump deja de soportar shell 48
# El gschema tiene que haber ido al directorio GLOBAL, que es lo que compila el lanzador.
test -s /out/usr/share/glib-2.0/schemas/org.gnome.shell.extensions.dash-to-panel.gschema.xml
'''
[deps]
# `make` para el Makefile, `glib` por glib-compile-schemas y `gettext-tiny` por msgfmt. Ninguna es
# una librería que la extensión enlace: no enlaza nada, es JavaScript.
build = ["make", "glib", "pcre2", "libffi", "zlib", "gettext-tiny"]