tawasuyu

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 939Rust 57Shell 37Markdown 331282 Definiciones

⎇ 84e3737e10e17927380ed3e232e50cebfdd39123 recipes/incoming-kde/syntax-highlighting-jinja-reproducible.patch 50 líneas · 2.3 KB Historia crudo

syntax-highlighting: arreglado el no-determinismo — era el generador de Jinja 981709d24 · Sergio ·

1Hacer determinista generate_jinja.py (reproducibilidad — SDD 23)
2
3El generador de las definiciones Jinja tenía TRES dependencias del azar, y entre
4ellas hacían que `libKF6SyntaxHighlighting.so` saliera distinto en cada build
5(8.800.310 bytes distintos y hasta el tamaño cambiaba):
6
71. `to_do.pop()` sobre un `set` saca un elemento ARBITRARIO. En `--dry-run` el
8   orden de los `print(out_file)` es lo que CMake usa para `out_xmls`, que acaba
9   siendo el ORDEN DE LAS ENTRADAS DEL .qrc ⇒ el recurso compilado cambiaba de
10   disposición entera. Se toma el menor: mismo conjunto, orden fijo.
11
122. `version = str(round(time.time()))` hornea la HORA DEL BUILD en el XML
13   generado. Se honra `SOURCE_DATE_EPOCH` (que el sandbox de takana ya fija),
14   que es la convención de reproducible-builds; fuera del sandbox se comporta
15   igual que antes.
16
173. `os.listdir()` devuelve el orden del sistema de ficheros. Sólo importa si dos
18   ficheros declaran el mismo lenguaje (gana el último), pero ordenarlo cuesta
19   nada y quita la última dependencia del orden de readdir.
20
21--- a/data/generators/generate_jinja.py
22+++ b/data/generators/generate_jinja.py
23@@ -113,7 +113,7 @@
24     to_visit = set()
25 
26     for grammar_dir in grammar_dirs:
27-        for file_name in os.listdir(grammar_dir):
28+        for file_name in sorted(os.listdir(grammar_dir)):
29             if not file_name.lower().endswith('.xml'):
30                 continue
31             file_path = os.path.join(grammar_dir, file_name)
32@@ -151,7 +151,7 @@
33     lang_tag = grammar.getroot()
34     lang_tag.set('name', jinja_tag.get('name') + '/' + lang_tag.get('name'))
35     lang_tag.set('section', jinja_tag.get('section'))
36-    lang_tag.set('version', str(round(time.time())))
37+    lang_tag.set('version', os.environ.get('SOURCE_DATE_EPOCH') or str(round(time.time())))
38     lang_tag.set('license', jinja_tag.get('license'))
39     lang_tag.set('priority', lang_tag.get('priority', '0'))
40     lang_tag.set('kateversion', max(lang_tag.get('kateversion'),
41@@ -265,7 +265,8 @@
42         sys.exit(2)
43 
44     while to_do:
45-        lang = to_do.pop()
46+        lang = min(to_do)
47+        to_do.remove(lang)
48         out_file = os.path.join(args.output_dir,
49                                 args.prefix + os.path.basename(xmls[lang]))
50         infuse_header(grammars[lang], jinja.getroot(), args.xtra_ext)