Aller au contenu

Le portail regarde les deux zones, et le code mort compte

StatutEn vigueur, 2026-08-27
ArticleA9 · La dette se tient par un cliquet, pas par un nettoyage
Chantier#4617 (sas des suites #4562)
Vérification probablescripts/adr/4617-code-mort-et-zone-de-test.py

Contexte

Une méthode privée jamais appelée a vécu dans SonsValidationArchiveViewTest, à soixante-quinze lignes de la version correcte du même helper, et rien ne l'a vue (#4554). Deux trous l'expliquent, et les confondre conduit à un correctif qui ne corrige rien.

Le jeu de règles. pmd-ruleset.xml ne portait que sept règles, toutes de conception. Aucune Unused*. Le job analyser-ecj compile pourtant les tests, mais ne configure aucun avertissement de ce genre : il ne cherche que les divergences entre javac et ecj. Le code mort n'était donc couvert nulle part, production comprise.

L'assiette. <includeTests>false</includeTests> laissait dehors 143 052 lignes contre 127 814, soit 52 % du Java du dépôt.

Le défaut observé relève du premier. Corriger le second seul aurait donné le sentiment d'avoir fermé le trou sans rien fermer, et c'est l'erreur que l'issue d'origine commettait.

Décision

Le portail voit les deux zones, et le code mort compte comme le reste.

UnusedPrivateMethod entre dans le jeu, et includeTests passe à true.

Les méthodes du FXMLLoader sont écartées, pas les fichiers qui les portent. @FXML et initialize() sont appelées par réflexion, donc invisibles pour PMD : elles font 135 des 158 signalements. La suppression vise ces méthodes par leur forme, ce qui laisse les 42 contrôleurs couverts pour tout leur autre code. Les exclure en entier aurait rendu la règle inoffensive là où elle est la plus utile.

Les littéraux dupliqués ne comptent pas dans la zone de test, et le filtre vit dans le cliquet, pas dans le ruleset. Répéter un littéral est ce qu'un test doit faire, et AvoidDuplicateLiterals rend 1 366 des 1 428 signalements du dépôt, tous en zone de test, zéro en production.

PMD ne sait pas exprimer ce filtre. Quatre formes ont été essayées avant de le déplacer, et le détail de chacune vit dans l'en-tête du script : aucune ne distingue les deux zones sans couper trop ou n'être jamais appliquée.

Le cliquet est à 40, et il ne porte plus que la zone de test : celui de la production est détaché par l'ADR 4682. Plus aucune méthode morte n'y figure : les 23 qu'avait révélées cette ADR ont été retirées par le chantier #4656. Restent 32 NcssCount, 5 GodClass, 2 ExcessiveParameterList et 1 CyclomaticComplexity.

Une méthode retirée n'est pas une violation retirée. Trois surcharges sont parties pour deux violations : MultisiteVueIntegrationTest portait un escalier ligne(...) à 6, 7 puis 9 arguments, et PMD ne signalait que la première, la deuxième lui paraissant vivante puisqu'appelée par la morte. Les retirer d'un coup n'a coûté qu'une violation. Le cliquet ne descend donc pas du nombre de méthodes supprimées, et seule la re-mesure tranche.

Posé à 62, il est monté à 63 puis descendu à 57, 55, 46 et 40 au fil du chantier #4656.

Il a été posé à 62 et relevé d'un cran le lendemain, ce qui mérite d'être dit plutôt que lissé. SynchronisationParticipationTest a franchi le seuil NcssCount en gagnant les cas qui ferment un défaut d'écriture concurrente (#4632), fusionné entre la mesure et la mise en place. Allonger une classe de test pour couvrir un cas de plus est le geste juste : refuser cette montée pousserait à ne pas couvrir, ce qu'aucun seuil de longueur ne vaut.

Ce que cet incident apprend sur le cliquet lui-même. Sa valeur porte sur l'arbre ENTIER, donc elle vieillit dès qu'une autre demande est fusionnée. Une branche mesurée puis rebasée doit être re-mesurée avant d'être poussée : le premier passage a laissé main rouge parce que le rebase avait nettoyé target/, que le garde a refusé de conclure faute de rapport, et que ce refus a été lu comme une vérification. Un garde qui refuse dit qu'il n'a rien mesuré, pas que tout va bien.

Conséquences

Ce qu'on gagne. La moitié du dépôt qui n'était jugée par rien l'est désormais, et le code mort a un garde, dans les deux zones.

Ce qu'on perd. Le portail passe de 29 à 53 secondes, parce qu'il faut compiler les tests. C'est mesuré, et faible au regard du reste de la chaîne.

Ce qui n'est pas fait. Les 23 méthodes mortes ne sont pas corrigées : leur tri demande une lecture par site, PMD y visant des surcharges précises qu'aucun comptage par nom ne distingue. Elles feront leur propre issue. Mêler un dispositif et un nettoyage dans la même demande aurait rendu les deux illisibles.

Ce que le garde refuse de faire. Conclure sans avoir lu. Si target/pmd.xml manque, il sort en erreur au lieu de rendre zéro : un garde qui tombe en marche passante est vert au moment précis où il sert, et c'est le défaut de #4544 sous une autre forme.