[DTP-Worker] Sprint 8 · buffer L75 · Fix "vert trompeur" : les 6 gates ci/*.sh passaient exit 0 VERT hors d'un arbre git (cd "$(git rev-parse …)" → cd "" no-op succès → git ls-files vide → 0 fichier contrôlé). Helper partagé ci/lib.sh::cd_repo_root échoue bruyamment (exit 3). INV-B (check_ci_integrity) durci : un ci/*.sh est câblé s'il est lancé par un job OU sourcé par un gate (prouve que lib.sh n'est pas mort).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
#!/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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user