#!/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)