#!/usr/bin/env python3 """repo-selfcontain.py — vuelve el repo KDE AUTO-CONTENIDO para hidratar por `install`. `install` lee los `depends` del recipe embebido en cada `.swm` y resuelve cada nombre como CLAVE del índice. El repo KDE cosechado (work/repo-kde) no cierra: 1. deps a nombres de receta-archivo qt-cortos (`qtbase`) cuando el paquete es `qt6-qtbase`. 2. faltan libs base del cierre (libffi/libpng/gperf/mako/markupsafe/packaging y su cierre). Este script, SIN re-buildear nada: - trae de dist/repo (repo base firmado, cierre completo) todo paquete cuyo nombre no esté ya en el repo KDE (colisión → gana la versión KDE), copiando su `.swm`. - agrega entradas ALIAS qt-corto→qt6-* (mismo `.swm`, otra clave de índice). El índice resultante se re-firma aparte con `hammer repo sign`. """ import json, shutil, sys from pathlib import Path ROOT = Path(__file__).resolve().parents[2] KDE = ROOT / "work/repo-kde" BASE = ROOT / "dist/repo" kde_idx = json.loads((KDE / "index.json").read_text()) base_idx = json.loads((BASE / "index.json").read_text()) kde_pkgs = kde_idx["packages"] kde_names = {p["name"] for p in kde_pkgs} base_by_name = {p["name"]: p for p in base_idx["packages"]} added_base, copied, aliases = [], 0, [] # 1) traer del repo base todo lo que el KDE no tenga (colisión → gana KDE) for name, entry in base_by_name.items(): if name in kde_names: continue src = BASE / entry["file"] if not src.exists(): continue dst = KDE / entry["file"] if not dst.exists(): shutil.copy2(src, dst); copied += 1 kde_pkgs.append(entry) kde_names.add(name) added_base.append(name) # 2) aliases qt-corto → qt6-* (misma .swm, clave de índice distinta) by_name = {p["name"]: p for p in kde_pkgs} for p in list(kde_pkgs): n = p["name"] if n.startswith("qt6-qt"): short = n[len("qt6-"):] # qt6-qtbase -> qtbase if short not in kde_names: alias = dict(p); alias["name"] = short kde_pkgs.append(alias); kde_names.add(short); aliases.append(short) kde_idx["packages"] = kde_pkgs (KDE / "index.json").write_text(json.dumps(kde_idx, indent=None)) print(f"base traídos: {len(added_base)} ({copied} .swm copiados)") print(f"aliases qt: {len(aliases)} -> {' '.join(sorted(aliases))}") print(f"total índice: {len(kde_pkgs)} entradas") # 3) chequeo de cierre: cada dep declarado en el índice ahora resuelve missing = set() for p in kde_pkgs: for d in p.get("deps", []): if d not in kde_names: missing.add(d) print(f"deps del índice sin resolver: {len(missing)} {sorted(missing) if missing else ''}")