#!/usr/bin/env bash # ============================================================================ # lib.sh · OTO Enterprise OS DTP · helpers PARTAGÉS des gates ci/*.sh # ---------------------------------------------------------------------------- # Fichier SOURCÉ (jamais exécuté en propre : aucun job `run: bash ci/lib.sh`). # check_ci_integrity.sh (INV-B) le reconnaît comme lib câblée parce qu'≥1 gate # le source — il n'a donc pas à figurer dans un job CI ni dans gate.needs. # # --- Pourquoi ce helper existe (bug « vert trompeur » corrigé) -------------- # Tous les gates commençaient par `cd "$(git rev-parse --show-toplevel)"`. # HORS d'un arbre de travail git (tarball, `git archive | tar -x`, git absent # du PATH, working-dir erroné), `git rev-parse --show-toplevel` n'écrit RIEN sur # stdout → la commande devient `cd ""`, un **no-op qui RETOURNE SUCCÈS** (le # script reste dans le cwd courant au lieu d'échouer). Les gates poursuivaient # alors sur un `git ls-files` qui renvoie une liste VIDE → validate_json / # guard_constraints / check_docs affichaient « rien à valider » et sortaient # **exit 0 VERT en n'ayant RIEN vérifié**. Un gate qui passe au vert sans rien # contrôler est la pire dérive : c'est exactement le « vert trompeur » que la # série anti-dérive du buffer S8 traque. `cd_repo_root` le transforme en ROUGE # honnête (exit 3, code distinct d'un échec de contrôle 1). # # Dépendances : bash, git. Aucun réseau (CLAUDE.md #2 · runner Gitea sans pip). # ============================================================================ # cd_repo_root — se positionne à la racine du dépôt git, ou ÉCHOUE bruyamment. # À appeler tout en haut de chaque gate, à la place de `cd "$(git rev-parse …)"`. cd_repo_root() { local root root="$(git rev-parse --show-toplevel 2>/dev/null)" || true if [[ -z "$root" ]]; then printf '\033[31m❌ ERREUR gate : hors d'\''un arbre de travail git '\ '(git rev-parse --show-toplevel n'\''a rien renvoyé).\033[0m\n' >&2 printf ' Ce gate DOIT tourner dans un checkout git (actions/checkout en '\ 'CI). Un `cd ""` silencieux masquerait un VERT TROMPEUR (git ls-files vide → '\ '0 fichier contrôlé).\n' >&2 exit 3 fi cd "$root" || { printf '\033[31m❌ ERREUR gate : cd vers la racine du dépôt (%s) a échoué.'\ '\033[0m\n' "$root" >&2 exit 3 } }