diff --git a/CHANGELOG.md b/CHANGELOG.md index eb7903f..9337002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,9 @@ chose que le moteur supposait **déjà en place** : qu'après avoir cloné. `genome_pousser` crée la clé si elle manque (à l'identique du rôle), l'organisation `genome` (publique) et les dépôts manquants (moteur et modèles publics, carte du site et plans privés) — la forme de la forge de Chezlepro, faite à la main. +- **Le runner ne savait recevoir un colis que dans un clone existant** : `genome_colis.py + recevoir` clone désormais depuis le colis à la première réception (une destination qui + existe sans être un dépôt reste un refus). Éprouvé contre une forge vide, témoin compris. - **La simulation échouait sur une lecture** (`systemctl is-active` sautée en `--check`, donc sans `rc`) : `check_mode: false`. diff --git a/scripts/genome_colis.py b/scripts/genome_colis.py index 1e1ecd2..fbc40bf 100644 --- a/scripts/genome_colis.py +++ b/scripts/genome_colis.py @@ -98,10 +98,22 @@ def etat(depot: Path, branche: str) -> int: def recevoir(depot: Path, colis: Path, pushurl: str, cle: str | None, branche: str) -> int: - if not (depot / ".git").exists(): - raise SystemExit(f"{depot} n'est pas un depot git — rien a recevoir.") if not colis.is_file(): raise SystemExit(f"{colis} est introuvable : le colis n'est pas arrive.") + # LA PREMIERE RECEPTION (2026-10-13). Un runner NEUF, face a une forge NEUVE, n'a aucun + # clone a avancer : il ne peut cloner que ce que la forge porte, et la forge ne porte que + # ce que ce colis va lui donner. On clone donc DEPUIS LE COLIS — puis le chemin ordinaire + # s'applique (verification, avance rapide, poussee). Une destination qui existe sans etre + # un depot reste un refus : on n'ecrase jamais un dossier qu'on ne connait pas. + if not (depot / ".git").exists(): + if depot.exists() and any(depot.iterdir()): + raise SystemExit(f"{depot} existe et n'est pas un depot git — rien a recevoir.") + r = subprocess.run(["git", "clone", "-q", "--branch", branche, str(colis), str(depot)], + capture_output=True, text=True) + if r.returncode != 0: + raise SystemExit(f"premiere reception impossible depuis le colis :\n " + f"{((r.stdout or '') + (r.stderr or '')).strip()}") + _git(depot, "remote", "set-url", "origin", pushurl) # UN COLIS DOIT ETRE VERIFIABLE AVANT D'ETRE CRU. `git bundle verify` exige d'etre # lance DEPUIS un depot — il verifie que les prerequis du colis sont deja dans cette