#!/usr/bin/env python3
"""Empaqueta las extensiones de atuq en `.xpi` SIN construir el navegador.
Uso: atuq-xpi.py [--out
] (por defecto: work/atuq-xpi)
POR QUÉ NO REPITE EL EMPAQUETADOR
---------------------------------
El zip determinista vive en `recipes/atuq/tools/rebrand.py` (`empaquetar_extensiones`) y es el que
entra en el artefacto sellado. Copiarlo acá daría dos empaquetadores que derivan: el día que uno
cambie el `date_time` o el orden de las entradas, el `.xpi` que te instalás a mano deja de ser el
mismo que trae la imagen, y eso NO se nota — se instala igual. Así que este script IMPORTA ese
módulo y llama a su función; lo único que aporta es el andamio de directorios que `rebrand.py`
espera (que normalmente es el árbol de firefox a medio construir) y que acá es un temporal.
⚠ `rebrand.py` no tiene `if __name__`: lee `sys.argv` y **llama a `main()`** al importarse, y
`main()` exige el árbol de firefox entero (se muere en `application.ini`). Así que no se importa —
se ejecuta su fuente con esa última llamada quitada, y se comprueba que estaba antes de quitarla:
si alguien le pone un `if __name__` algún día, este script falla RUIDOSAMENTE en vez de empaquetar
con un módulo que ya no es el que creía.
Y no se le agrega el `if __name__` a `rebrand.py` a propósito: ese fichero está DENTRO del overlay
cuya huella es el `BuildID` (`huella_overlay`), así que tocarlo invalida el hash de atuq y obliga a
reconstruir firefox con PGO. Un `if __name__` no vale ese precio.
"""
import os
import shutil
import sys
import tempfile
RAIZ = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
OVERLAY = os.path.join(RAIZ, "recipes", "atuq")
destino = os.path.join(RAIZ, "work", "atuq-xpi")
if len(sys.argv) > 2 and sys.argv[1] == "--out":
destino = os.path.abspath(sys.argv[2])
elif len(sys.argv) > 1:
print(__doc__, file=sys.stderr)
raise SystemExit(2)
tmp = tempfile.mkdtemp(prefix="atuq-xpi.")
try:
appdir = os.path.join(tmp, "usr", "lib", "atuq")
os.makedirs(appdir)
sys.argv = ["rebrand.py", appdir, OVERLAY, tmp]
fuente = os.path.join(OVERLAY, "tools", "rebrand.py")
with open(fuente, encoding="utf-8") as fh:
codigo = fh.read()
if not codigo.rstrip().endswith("main()"):
print(f"atuq-xpi: {fuente} ya no termina en main() — revisá este script antes de confiar en él",
file=sys.stderr)
raise SystemExit(1)
codigo = codigo.rstrip()[: -len("main()")]
mod = {"__name__": "rebrand", "__file__": fuente}
exec(compile(codigo, fuente, "exec"), mod)
resultados = mod["empaquetar_extensiones"]()
os.makedirs(destino, exist_ok=True)
for nombre, ext_id, n_ficheros, tamano, _url in resultados:
origen = os.path.join(appdir, "distribution", "extensions", f"{ext_id}.xpi")
shutil.copy2(origen, os.path.join(destino, f"{ext_id}.xpi"))
print(f"{ext_id}.xpi {tamano:>7} B {n_ficheros} ficheros ({nombre})")
print(f"\n{len(resultados)} extensiones en {destino}")
finally:
shutil.rmtree(tmp, ignore_errors=True)