Le pre-commit du gabarit refuse tout commit sur un dépôt rétrofitté (suppressions ESLint + lint partiel) #37

Closed
opened 2026-10-01 12:26:29 +00:00 by nicolas-fryder · 0 comments

Ce qui se passe

D-048 prescrit, pour un rétrofit, de figer la dette dans des suppressions ESLint natives (eslint-suppressions.json). Le pre-commit du gabarit, lui, lint les seuls fichiers indexés :

echo "$fichiers" | xargs -0 node node_modules/eslint/bin/eslint.js \
  --config eslint.config.mjs --cache --max-warnings=0 --no-warn-ignored

Les deux ensemble ne marchent pas. ESLint tient pour périmée toute suppression portant sur un fichier qu'on ne lui a pas donné à lire, et sort en erreur :

There are suppressions left that do not occur anymore.
Consider re-running the command with `--prune-suppressions`.

Sur nuage, 61 fichiers portent des suppressions. Un commit qui touche un fichier en passe un à ESLint, les 60 autres paraissent morts, et le commit est refusé. Tous. Le seul recours est --no-verify, c'est-à-dire la désactivation de la porte que le hook existe pour tenir.

Le gabarit ne le voit pas parce qu'il n'a pas de suppressions : il est neuf. Tout satellite rétrofitté le verra au premier commit.

Pourquoi ce n'est pas un contournement d'y céder

--pass-on-unpruned-suppressions est interdit par D-024, et à raison : dans la porte, une suppression qui ne couvre plus rien doit partir, sinon la dette se fige.

Mais la porte lit TOUT l'arbre. Un lint partiel, lui, n'a pas l'information pour juger : il ne sait pas si la suppression est morte ou si le fichier n'était simplement pas du lot. Lui poser la question quand même ne détecte pas de la dette, ça refuse une question sans réponse.

Ce que nuage a fait, en attendant

Le drapeau est posé dans le hook seulement, avec sa raison écrite (.lintstagedrc.mjs) ; pnpm check lint l'arbre entier sans le drapeau et reste strict. L'élagage a d'ailleurs trouvé une suppression réellement morte au passage.

Proposition

  1. Ajouter --pass-on-unpruned-suppressions au lint partiel du pre-commit du gabarit, avec un commentaire disant pourquoi il est là et pourquoi il n'est pas dans check.
  2. Amender D-024 d'une phrase : l'interdiction porte sur le lint complet, celui de la porte. Sans cette phrase, la lecture littérale de la doctrine rend le rétrofit incommittable, et quelqu'un finira par retirer les suppressions pour s'en sortir — ce qui est bien pire.
  3. Ajouter eslint-suppressions.json au .prettierignore du gabarit : voir le ticket jumeau.

Trouvé en rétrofittant nuage (profil nest), socle 0.14.0, ESLint 9.39.5.

## Ce qui se passe D-048 prescrit, pour un rétrofit, de figer la dette dans des **suppressions ESLint natives** (`eslint-suppressions.json`). Le pre-commit du gabarit, lui, lint **les seuls fichiers indexés** : ```sh echo "$fichiers" | xargs -0 node node_modules/eslint/bin/eslint.js \ --config eslint.config.mjs --cache --max-warnings=0 --no-warn-ignored ``` Les deux ensemble ne marchent pas. ESLint tient pour périmée toute suppression portant sur un fichier qu'on ne lui a pas donné à lire, et sort en erreur : ``` There are suppressions left that do not occur anymore. Consider re-running the command with `--prune-suppressions`. ``` Sur nuage, 61 fichiers portent des suppressions. Un commit qui touche un fichier en passe un à ESLint, les 60 autres paraissent morts, et **le commit est refusé**. Tous. Le seul recours est `--no-verify`, c'est-à-dire la désactivation de la porte que le hook existe pour tenir. Le gabarit ne le voit pas parce qu'il n'a pas de suppressions : il est neuf. Tout satellite **rétrofitté** le verra au premier commit. ## Pourquoi ce n'est pas un contournement d'y céder `--pass-on-unpruned-suppressions` est interdit par D-024, et à raison : dans la porte, une suppression qui ne couvre plus rien doit partir, sinon la dette se fige. Mais la porte lit TOUT l'arbre. Un lint partiel, lui, n'a **pas l'information** pour juger : il ne sait pas si la suppression est morte ou si le fichier n'était simplement pas du lot. Lui poser la question quand même ne détecte pas de la dette, ça refuse une question sans réponse. ## Ce que nuage a fait, en attendant Le drapeau est posé **dans le hook seulement**, avec sa raison écrite ([`.lintstagedrc.mjs`](https://git.equilibre-structures.fr/Infrastructure/nuage)) ; `pnpm check` lint l'arbre entier **sans** le drapeau et reste strict. L'élagage a d'ailleurs trouvé une suppression réellement morte au passage. ## Proposition 1. Ajouter `--pass-on-unpruned-suppressions` au lint partiel du pre-commit du gabarit, avec un commentaire disant pourquoi il est là et pourquoi il n'est pas dans `check`. 2. Amender D-024 d'une phrase : l'interdiction porte sur le lint **complet**, celui de la porte. Sans cette phrase, la lecture littérale de la doctrine rend le rétrofit incommittable, et quelqu'un finira par retirer les suppressions pour s'en sortir — ce qui est bien pire. 3. Ajouter `eslint-suppressions.json` au `.prettierignore` du gabarit : voir le ticket jumeau. Trouvé en rétrofittant nuage (profil `nest`), socle 0.14.0, ESLint 9.39.5.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Infrastructure/eqs-satellite-template#37
No description provided.