desplegar-strip: ordenar por IMPACTO EN EL GRAFO, no alfabéticamente
Medido sobre el corpus: **686 de 779 recetas son HOJAS** (cero dependientes transitivos) ⇒ el 88% se puede desplegar sin provocar UNA SOLA reconstrucción extra. Las caras son pocas y conocidas: make 416 · pkgconf 360 · go 359 · binutils 343 · zlib 315 · python3 287 · samurai 272 · meson 257. El orden alfabético anterior era activamente malo: la primera tanda de la etapa 4 tocó expat, zstd y ncurses —tres bibliotecas base— y dejó 54 recetas sin artefacto vigente, incluida la cadena wlroots/sway sellada la noche anterior. Sin este orden, cada tanda pequeña provoca una cascada grande y la campaña avanza hacia atrás. Hojas primero; las ~93 con dependientes, en una ola coordinada y con la granja arriba. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -35,8 +35,45 @@ done
|
|||||||
|
|
||||||
EXCLUIDAS="binutils make"
|
EXCLUIDAS="binutils make"
|
||||||
|
|
||||||
|
# ── ORDEN POR IMPACTO EN EL GRAFO, NO ALFABÉTICO ───────────────────────────────────────────────
|
||||||
|
# Activar `strip_debug` re-hashea la receta Y, en cascada, todo lo que dependa de ella. La primera
|
||||||
|
# tanda de la etapa 4 lo aprendió caro: tocar `expat`, `zstd` y `ncurses` —tres bibliotecas BASE—
|
||||||
|
# dejó 54 recetas sin artefacto vigente, incluida la cadena wlroots/sway sellada la noche anterior.
|
||||||
|
#
|
||||||
|
# Medido sobre el corpus: **686 de 779 recetas son HOJAS** (cero dependientes transitivos) ⇒ el 88%
|
||||||
|
# se puede desplegar sin provocar UNA SOLA reconstrucción extra. Las caras son pocas y conocidas:
|
||||||
|
# make 416 · pkgconf 360 · go 359 · binutils 343 · zlib 315 · python3 287 · samurai 272 · meson 257
|
||||||
|
# ⇒ Hojas primero; las que tienen dependientes, en una ola coordinada y con la granja arriba.
|
||||||
|
# Sin este orden, cada tanda pequeña provoca una cascada grande y la campaña avanza hacia atrás.
|
||||||
|
CANDIDATAS_ORDENADAS=$(python3 - <<'PYEOF'
|
||||||
|
import glob, re, collections, sys
|
||||||
|
sys.setrecursionlimit(10000)
|
||||||
|
deps, name_of = {}, {}
|
||||||
|
for p in glob.glob('recipes/*.toml') + glob.glob('recipes/incoming-*/*.toml'):
|
||||||
|
s = open(p, encoding='utf-8', errors='replace').read()
|
||||||
|
m = re.search(r'^name\s*=\s*"([^"]+)"', s, re.M)
|
||||||
|
n = m.group(1) if m else p.split('/')[-1][:-5]
|
||||||
|
name_of[p] = n
|
||||||
|
d = set()
|
||||||
|
mb = re.search(r'^\[deps\](.*?)(?=^\[|\Z)', s, re.M | re.S)
|
||||||
|
if mb: d.update(re.findall(r'"([a-z0-9._+-]+)"', mb.group(1)))
|
||||||
|
deps.setdefault(n, set()).update(d)
|
||||||
|
rev = collections.defaultdict(set)
|
||||||
|
for n, ds in deps.items():
|
||||||
|
for d in ds: rev[d].add(n)
|
||||||
|
def trans(n, visto=None):
|
||||||
|
if visto is None: visto = set()
|
||||||
|
for x in rev.get(n, ()):
|
||||||
|
if x not in visto: visto.add(x); trans(x, visto)
|
||||||
|
return visto
|
||||||
|
filas = [(len(trans(n)), p) for p, n in name_of.items() if p.startswith('recipes/') and '/incoming-' not in p]
|
||||||
|
filas.sort()
|
||||||
|
print('\n'.join(p for _, p in filas))
|
||||||
|
PYEOF
|
||||||
|
)
|
||||||
|
|
||||||
candidatas=""
|
candidatas=""
|
||||||
for f in recipes/*.toml; do
|
for f in $CANDIDATAS_ORDENADAS; do
|
||||||
[ -f "$f" ] || continue
|
[ -f "$f" ] || continue
|
||||||
n=$(basename "$f" .toml)
|
n=$(basename "$f" .toml)
|
||||||
case " $EXCLUIDAS " in *" $n "*) continue ;; esac
|
case " $EXCLUIDAS " in *" $n "*) continue ;; esac
|
||||||
|
|||||||
Reference in New Issue
Block a user