Co to znamená
Dva úspěšné běhy mohou stát k stromu před vámi ve velmi odlišných vztazích a model je odmítá vypsat stejně.
proven znamená, že rozdíl mezi vlastním commitem provedení a pracovním stromem je prázdný: strom před vámi je bajt po bajtu strom, který běh změřil. To není totéž tvrzení jako „zaznamenáno na HEAD s čistým stromem“, které zní ekvivalentně a není.
inputs_unchanged znamená, že existuje úspěšný běh a nic z toho, co tvrzení samo jmenuje — jeho source, jeho implementation a vlastní zdroj testu — se mezi zaznamenaným commitem a pracovním stromem neliší. To je absence známého zneplatnění, ne důkaz na HEAD: něco, co tvrzení nejmenuje, mohlo chování od té doby rozbít. Všude, kde se zobrazuje, je označeno jako slabší věc a příkazový řádek vypíše vedle stavu větu, která to vysvětluje.
Povrch, který by obojí vykreslil jako jedno zatržítko, by závadu zavedl znovu, ať by podkladová data říkala cokoli, takže rozlišení je v modelu, ve všech projekcích z něj odvozených a v kontrole.
Princip
Porovnání je git diff --name-only <the execution's own commit> --, spuštěné jednou pro každý odlišný commit, který ledger jmenuje, a sdílené všemi tvrzeními zaznamenanými proti němu, což je v praxi jeden podproces. Zachytí cestu commitnutou později, přidanou do stage nebo jen upravenou v pracovním stromu. Stav důkazu rozhoduje tento diff proti commitu každého provedení, nikdy HEAD; HEAD a stav stromu se hlásí, aby čtenář věděl, proti čemu byl report odvozen.
Vlastní řádek knihy je z diffu vyloučen a je to nejméně zřejmá část návrhu. Důkaz je o stromu, ne součást toho, co testy měří, takže jeho vlastní řádek nesmí stárnout důkaz, který zaznamenává. Bez tohoto vyloučení je proven z konstrukce nedosažitelný: zaznamenání zapíše knihu, a tím zašpiní strom, a commitnutí záznamu posune HEAD za commit, který záznam jmenuje, takže nejsilnějšího stavu by nikdy nešlo dosáhnout úkonem, který pro něj vytváří důkaz. To se zjistilo při přezkumu a test/cases/124_evidence.sh nyní ověřuje obě poloviny — strom je hned po zaznamenání špinavý, každé tvrzení je stále proven a zaznamenání se nedotklo ničeho kromě knihy — takže regrese, která by proven znovu učinila závislým na čistém stromu, selže, místo aby prošla bez povšimnutí.
stale je třetí prošlý stav: běh prošel, ale něco, co tvrzení jmenuje, se od té doby změnilo, a změněné cesty jsou jmenovány, aby čtenář věděl, která ze tří věcí běh zneplatnila, místo aby ho poslali hledat. Pokrývá také dva případy, které by sám diff přehlédl. Když vlastní zdroj testu už nemá hash odpovídající zaznamenanému digestu, tvrzení je stale a test je jmenován, protože úprava provedená a vrácená kolem běhu nezanechá diff a stále to není to, co se měřilo. A když git na porovnání vůbec neumí odpovědět — žádný pracovní strom, commit, který tento checkout nemá — stav je stale, ne inputs_unchanged, protože nevědět není důkaz.
Sedm stavů je v samotném modelu seřazeno od nejsilnějšího po nejslabší, takže souhrn řazený podle stavu se čte jako žebříček, a každý stav tam nese vlastní význam v jedné větě, místo aby si výklad vymýšlel každý povrch zvlášť.
Jak to vidět
majordomus evidence show --state proven
majordomus evidence show --state inputs_unchanged
majordomus evidence claim distribution-canonical-model # state, meaning, execution, changed
bash test/run.sh 124_evidence # both sides of the distinction, in a fixture
Fixture je vlastní repozitář, protože na čem záleží, je chování nad commity: zaznamená běh, ověří proven se špinavým stromem, vytvoří jeden commit, který nemění nic, co by některé tvrzení pojmenovávalo, a ověří, že každé tvrzení je pak inputs_unchanged a žádné není proven.
Co nepokrývá
Model závislostí je záměrně mělký a netranzitivní. Jsou to tři cesty, které tvrzení uvádí, a nic z nich nevypočítaného, takže inputs_unchanged nezachytí změnu souboru, který tvrzení nepojmenovává a chování přesto rozbije, změnu runneru, harnessu, toolchainu nebo prostředí, tvrzení, jehož implementation pojmenovává jeden soubor, kde chování žije v několika, ani chování, které závisí na čemkoli úplně mimo repozitář. Každé je skutečná díra a odpověď na všechna je táž a není to chytřejší graf závislostí: zaznamenat běh proti tomuto stromu, a stav se stane proven.
Otisk hlásí majordomus evidence proves jako digest_matches a je vstupem do stavu jen v jednom výše popsaném směru — neshoda učiní tvrzení stale. Nemůže tvrzení učinit silnější, než říká diff.
Proč existuje
Obě alternativy k oddělení těchto dvou stavů jsou horší. Považovat úspěšný běh za platný, dokud se kdekoli něco nezmění, je odznak, jehož odvození nelze prověřit; prohlásit každý výsledek za zastaralý v okamžiku, kdy se cokoli kdekoli změní, je správné a k ničemu, protože v repozitáři, který přistává na master každých pár minut, by žádné tvrzení nikdy nebylo dokázáno, kromě sekund po plném běhu. Model proto říká, který ze dvou stavů nalezl, a říká to stejnými slovy na každém povrchu. Jejich splynutí je přesně to, jak zelená značka přestane cokoli znamenat, a snadno se znovu zavede omylem — proto je to tvrzení s případem za zády, ne konvence.