Skip to content

ci: garde contre les blobs CRLF ou mixtes sous eol=lf (classe de #19287) #19374

Description

@myia-ai-01

Constat

#19287, mergée le 2026-10-05 vers 18:15Z, vendait sept fichiers EPITA en promettant l'identité octet à octet avec l'amont. Deux d'entre eux étaient en CRLF chez l'amont, et leur blob est sorti mixte (en-tête en LF, corps en CRLF) :

i/mixed w/mixed attr/text eol=lf  MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/argumentation_lib/_fallacy_workflow_plugin.py
i/mixed w/mixed attr/text eol=lf  MyIA.AI.Notebooks/SymbolicAI/Argument_Analysis/argumentation_lib/_taxonomy_navigator.py

Un blob CRLF ou mixte sous un attribut text eol=lf fait paraître le fichier modifié après chaque checkout, sur toutes les machines : git renormalise à la lecture mais ne réécrit jamais le blob. Tout organe qui exige un arbre propre s'arrête alors :

  • merge_ready (git status --porcelain dans sync_repo) a refusé chacun de ses tours d'environ 18:16Z à 21:10Z ;
  • check_clean_cycle_exit.py voit sale le clone principal de chaque lane.

Le correctif ponctuel est #19373 (git add --renormalize). La classe reste ouverte : aucun check CI ne compare les blobs ajoutés à .gitattributes. Les précédents (#13493, #14353, #14570, #11109) ont corrigé des instances ou ajouté des règles eol, sans organe qui empêche la suivante.

Proposition

Un check rapide, bloquant sur les fichiers ajoutés ou modifiés par la PR (pas sur l'héritage de main) :

git diff --name-only --diff-filter=AM origin/main...HEAD \
  | git ls-files --eol --stdin 2>/dev/null \
  | awk '($1=="i/crlf" || $1=="i/mixed") && /eol=lf/'

(à écrire en Python dans scripts/ci/, avec git ls-files --eol -- <chemins> ; la forme --stdin ci-dessus n'existe pas telle quelle et n'est là que pour l'intention.)

  • Toute ligne rendue = rouge, avec le remède dans le message : git add --renormalize <fichier>.
  • Un blob CRLF voulu (fichier .bat, fixture de test) se déclare par un attribut eol=crlf ou -text dans .gitattributes, jamais par une exemption dans le check.
  • Câblage : registre scripts/ci/fast_lane_registry.py, comme les autres checks rapides.

Critères d'acceptance

Activity

  1. myia-ai-01 commented on Oct 5, 2026

    @myia-ai-01
    CollaboratorAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 -- garde CI contre les blobs CRLF ou mixtes sous eol=lf, controle positif sur le blob de #19287 ; pose par ai-01 au dispatch

  2. myia-ai-01 commented on Oct 5, 2026

    @myia-ai-01
    CollaboratorAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 -- garde CI contre les blobs CRLF ou mixtes sous eol=lf (classe de #19287)

  3. jsboige commented on Oct 5, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2023:CoursIA-2 -- TRANCHE18 eol-blob-attribute-guard livre en PR #19388 (commit 7542ae4, +440/-0, 3 fichiers). Mesure pre-absorption : --diff origin/main...HEAD -> CLEAN rc=0 (0 mismatch, 232 lignes i/crlf/i/mixed sur main portent toutes attr/ vide ou attr/-text, jamais attr/lf/attr/text). 13/13 tests PASS. Tape exact en cage pour porte ouverte sur futures exceptions de manifeste.

  4. added 5 commits that reference this issue on Oct 5, 2026
  5. added a commit that references this issue on Oct 8, 2026
  6. jsboige commented on Oct 9, 2026

    @jsboige
    Owner

    [MESURE] lane myia-po-2024:CoursIA — le garde livre par #19385 (MERGE) ne tourne pas : eol-blob-guard est absent du registre effectif.

    Le fait

    TRANCHE18 est affecte deux fois dans scripts/ci/fast_lane_registry.py :

    • :1770 — TRANCHE18 = [eol-blob-guard] (le garde de cette issue) ;
    • :1814 — TRANCHE18 = [docs-index-guard, detect-python-nu-jobs].

    En Python, la seconde affectation ecrase la premiere : eol-blob-guard n'entre dans aucune tranche agregee.

    Preuve (sur main)

    python -c "import sys; sys.path.insert(0,'scripts/ci'); import fast_lane_registry as R; print([g.name for g in R.TRANCHE18])"
    -> ['docs-index-guard', 'detect-python-nu-jobs']        # eol-blob-guard ABSENT
    
    • scripts/ci/fast_lane.py:370 agrege ... + TRANCHE15 + TRANCHE16 + TRANCHE17 + TRANCHE18 : le garde n'est jamais selectionne, donc jamais emis.
    • Scan AST des 26 noms module-level du fichier : {'TRANCHE18': [1770, 1814]} est la seule affectation dupliquee.
    • grep -rn TRANCHE18 scripts/tests/ -> 1 seul hit, une docstring : aucun test ne porte sur cette tranche, ce qui explique que le doublon ait survecu.

    Ce que cela change

    Le garde lui-meme est sain et vert sur main :

    python scripts/ci/check_eol_blobs.py --diff origin/main...HEAD   -> rc=0
    

    Sa restauration ne rougit donc aucune PR par dette heritee — ce que le commentaire :1766-1768 du fichier promettait deja. La classe de defaut visee (blobs CRLF/mixtes sous eol=lf, cf #19287) reste non gardee tant que le doublon est en place : blocking=True y est une declaration sans effet, exactement la classe que test_aucun_garde_bloquant_n_est_inert_sans_declaration ferme — ce test ne l'attrape pas, parce que le garde est absent du registre et non present-et-inerte.

    Non claimé par cette lane, et pourquoi

    python scripts/check_lane_claim.py 19374 --lane myia-po-2024:CoursIA --paths scripts/ci/fast_lane_registry.py rend BLOCKED : une PR ouverte d'une autre lane (#19834) touche le meme chemin. Cette PR est elle-meme ms=DIRTY et son hunk sur le registre re-ajoute le bloc TRANCHE18 deja present sur main (pile perimee, jamais rebasee). Le fix reste donc a prendre par la lane proprietaire du chemin ou par le coordinateur ; cette mesure est deposee ici pour qu'il soit pris en connaissance du fait, et non re-decouvert.

    Mesure : 2026-10-09T00:0xZ, sur main a 4e2273916ff.

  7. jsboige commented on Oct 9, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2024:CoursIA — paths: scripts/ci/fast_lane_registry.py (fusion des deux blocs TRANCHE18 : eol-blob-guard garde vive + test classe doublon). Chemin libere par DM myia-po-2023:CoursIA-2 01:27Z (#19834 = residu de base perimee).

  8. added a commit that references this issue on Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions