Zdůvodnění
Tři relace na to narazily za jeden večer, ve třech jazycích, a ta třetí je důvod, proč je pravidlo blokující a ne poradní.
grep '^FAIL', které nic nenajde, skončí nenulově a nevypíše nic, takže krok buildu, který zemřel dřív, než zapsal řádek, nechal nadpis s tichem pod sebou. Hodina šla na hledání příčiny, kterou byl plný disk.
kill následované wait na zabitém procesu vrací stav signálu, takže testovací případ pod bash -eu skončil bez chybové zprávy, bez diagnostiky a s holým FAIL — neselhal případ, selhal úklid.
A výraz find -newermt, který bfs tohoto stroje rovnou odmítl, vypsal své odmítnutí na stderr a nic na stdout, a volající četl prázdný stdout jako odpověď: „žádný worktree nebyl šest hodin upraven.“ To není skrytý důvod. To je sebejistá chybná odpověď a jednalo se podle ní.
Tvar je pokaždé stejný: jeden program se zeptal druhého, druhý neuměl odpovědět a první to nerozlišil od odpovědi „žádné“. Kontrola, která projde nad prázdnou množinou, je tatáž chyba o vrstvu výš — tento repozitář vydal kontrolu schématu, která zkoumala 0 ze 40 souborů a hlásila OK, a test, který ji vlastnil, zapsal svou fixture v jediné hloubce, kterou rozbitý glob dosáhl.
Požadované chování
- Kontrolujte stav, ne výstup. Roura, jejímž posledním příkazem je
grep,find,jq -enebo jakýkoli matcher, musí rozlišit exit 1 (nic nenašel) od exit 2 a výše (nemohl se podívat). Podset -easet -o pipefailsi dejte záměrný pozor pomocí|| truea pak čtěte uložený stav, místo aby rozhodoval shell. - Řekněte, o který případ šlo. Krok, který nemohl proběhnout, jmenuje příkaz, exit kód a to, co vypsal na stderr. „Nic nenalezeno“ a „nešlo hledat“ jsou různé věty a čtenář nesmí nikdy hádat, na kterou se dívá.
- Nulový počet je tvrzení a potřebuje stejné důkazy jako jakékoli jiné. Kontrola, která hlásí úspěch nad prázdným korpusem, tvrdí, že korpus je prázdný; tvrďte to proti něčemu změřenému z disku, ne proti absenci výstupu.
- Úklid nezpůsobí selhání případu.
kill,waita teardown běží mimo tvrzení, která následují, a jejich stavy nejsou verdiktem případu.
Chování při selhání
Rozhoduje revize a kontroly, které už navzájem čtou své výstupy. Kde lze kontrolu přimět, aby dokázala, že její vlastní korpus není prázdný, měla by to udělat, protože právě tato aserce by zachytila případ se schématem a jen ona by ho zachytila.
Ověření
scripts/generate-site-data je instance s nápravou: oba bloky, které čtou výstup jiného programu, nyní uvádějí návratový kód a při prázdném výstupu filtru se vrátí k zachycenému stderr, takže krok, který zemřel před zapsáním řádku FAIL, už nemůže nechat nadpis nad tichem. Další dvě instance jsou zaznamenány v Rationale jako důkaz, že jde o třídu, nikoli o incident; ani jedna nemá kontrolu a toto pravidlo existuje proto, aby se příští poznala, a nediagnostikovala od nuly.