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…
⎇ 84e3737e10e17927380ed3e232e50cebfdd39123
recipes/incoming-kde/syntax-highlighting-jinja-reproducible.patch
Ñawpa willay
ch'uya
syntax-highlighting: arreglado el no-determinismo — era el generador de Jinja
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)