genome_colis : la premiere reception clone depuis le colis

Un runner neuf face a une forge neuve n'avait aucun clone a avancer : recevoir() refusait.
Il clone desormais depuis le colis, puis suit le chemin ordinaire (verification, avance
rapide, poussee). Une destination existante qui n'est pas un depot reste un refus.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-10-13 23:48:41 -04:00
parent 810670cd30
commit a9428be752
2 changed files with 17 additions and 2 deletions

View file

@ -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`.

View file

@ -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