Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Slovník rozsahů, proti kterému se commit posuzuje, se učí z vlastní historie tohoto repozitáře, ne z tabulky, takže subsystém commitnutý dnes je ve slovníku dnes a rozsah mimo něj je varování, ne odmítnutí

Obvyklou odpovědí na otázku *"do jakého rozsahu tato změna patří?"* je tabulka cest

deklarovaný stavdeklarovaný stav: zaručeno Deklarováno jako deterministické a blokující, implementováno a s uvedeným behaviorálním testem, který to má dokázat. Zda to zaznamenaný běh podporuje, říká verdikt důkazů zobrazený vedle.

zaznamenané důkazyzaznamenané důkazy: zastaralé Deklarováno jako zaručené, ale nepodložené zaznamenaným během: test je pojmenován, ale žádný úspěšný běh nad současnými vstupy zaznamenán není. jak se zaznamenávají důkazy

commit.scopes čte nejvýše 1500 commitů z git log a počítá souvislost každého scope s prefixy adresářů do hloubky čtyř segmentů; suggest() remízu hlásí jako nejednoznačnou, místo aby ji rozhodl, a neodpoví vůbec nic, pokud žádný dřívější commit nespojuje žádný scope s danými cestami - což je poctivá odpověď pro první commit subsystému a lepší než nejoblíbenější scope repozitáře. Případ dokazuje, že slovník sleduje historii: scope, který byl před commitem o něm neznámý, je po něm známý.

Co to znamená

Obvyklý způsob, jak odpovědět na „k jakému rozsahu tato změna patří?“, je tabulka vzorů cest mapovaných na názvy rozsahů. V den napsání je správná. Pak se přidá nebo přejmenuje adresář nebo se podsystém rozdělí na dva a tabulka jmenuje rozsah, který historie přestala používat před měsíci — a nic si toho nevšimne, protože tabulka nemá jak se mýlit.

Tvrzení je, že tento repozitář žádnou takovou tabulku nevede. Slovník, proti kterému se commit posuzuje, se pozoruje z vlastního logu repozitáře, takže subsystém commitnutý dnes je ve slovníku dnes a ten, kterého se rok nikdo nedotkl, sám klesne.

Princip

commit.scopes přečte nejvýše 1500 commitů jedním git log --no-merges --name-only, parsuje každý předmět toutéž gramatikou, jakou používá changelog, a počítá dvě věci: jak často se každý rozsah používá a jak často se každý rozsah používá pro každý prefix adresáře do hloubky čtyř segmentů. Každý commit v historii je vypracovaný příklad toho, do kterého rozsahu patří sada cest, rozhodnutý tím, kdo změnu udělal, a zachovaný tím, kdo ji revidoval.

Čtyři segmenty jsou změřené, ne zvolené. Zdroj tohoto repozitáře leží v apps/majordomus-cli/src/<subsystem>/; tři segmenty končí o úroveň nad subsystémem, kde mají commity tucet rozsahů a žádná cesta se od jiné nedá odlišit. První verze používala tři a hlásila každou změnu zdroje jako patřící do žádného rozsahu.

suggest(paths) hlasuje o každé cestě na nejhlubším prefixu, s nímž je něco spojeno — takže změna uvnitř jednoho subsystému není přehlasována nejrušnějším adresářem repozitáře o dvě úrovně výš — a hlásí tři věci: rozsah, počet předchozích commitů, které tento rozsah s tímto adresářem spojují, a zda byl stejně spojen jiný rozsah. Remíza je nahlášena jako ambiguous, ne tiše rozhodnuta. Cesty, které historie nespojuje s žádným rozsahem, dají None, což je poctivá odpověď pro první commit nového subsystému a lepší než nejoblíbenější rozsah v repozitáři, což by dalo rozhodnutí remízy podle četnosti.

Rozsah mimo slovník je varování, nikdy zamítnutí. Odvozování nesmí odmítnout první commit podsystému, který ještě nikdy neviděl — první commit právě tohoto podsystému nesl commit.unknown_scope, což je návrh, který funguje, a ne selhává.

Jak to vidět

majordomus commit scopes                     # every scope, how often, about which directories
majordomus commit scopes --format json       # the same, with the sample size
echo "feat(nonesuch): a thing" | majordomus commit validate
                                             # exit 0, warning commit.unknown_scope
bash test/run.sh 274_commit_policy           # the case proves the vocabulary follows the history

Zajímavější je tento případ: sestaví repozitář, commitne asi alpha a beta, ověří, že gamma je neznámé a je na to upozorněno, commitne asi gamma a ověří, že gamma je pak známé. Mezi oběma ověřeními nebylo nic konfigurováno.

Co nepokrývá

Není to zadarmo. Čtení jmen z logu stojí na této historii asi sekundu a záměrně není na žádné horké cestě: nic při vstupu do repozitáře, doplňování slova ani odpovídání na --help jej nečte. Čte se, když se commit plánuje nebo posuzuje, což je okamžik, který už zahrnuje čekání na git.

Neříká nic o tom, co rozsah znamená. Pozoruje, které slovo bylo použito o kterém adresáři, ne zda to slovo bylo dobrou volbou — repozitář, který důsledně používal špatný název rozsahu, bude důsledně slyšet, že špatný název je ten, který používá.

Proč existuje

Referenční postup, který tento subsystém nahradil, nesl doslovnou Markdown tabulku vzorů cest na rozsahy, udržovanou ručně. Každý její řádek byl fakt zapsaný na dvou místech, z nichž jedno se mění — tvar, který DYNAMICITY.md jmenuje, a ten, který tento repozitář odstraňuje nejčastěji. Repozitář odpověď už znal; byla v logu.

Detail vykreslený z docs/claims/commit-scopes-are-learned.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    Slovník rozsahů, proti kterému se commit posuzuje, se učí z vlastní historie tohoto repozitáře, ne z tabulky, takže subsystém commitnutý dnes je ve slovníku dnes a rozsah mimo něj je varování, ne odmítnutí

    Vzniklo na Commits, Policy.

  2. 2 · kanonické tvrzení

    commit-scopes-are-learneddeklarovaný stav: zaručeno v docs/CLAIMS.yaml

    Definováno v přečtěte si na tomto webu · docs/COMMIT.md

  3. 3 · implementace

    apps/majordomus-cli/src/commit/scopes.rs

  4. 4 · test a scénáře

    Test: test/cases/274_commit_policy.sh

    Provedeno v Rozdělit pracovní strom do commitů a podřídit každou zprávu politice.

  5. 5 · zaznamenané běhy

    zaznamenané důkazy: zastaralé jak se zaznamenávají důkazy

Ověřte si to sami

Test běží v jednorázovém dočasném repozitáři a ověřuje chování, ne řetězec ve zdrojovém kódu.

z klonu repozitáře
bash test/run.sh 274_commit_policy

Kde se toto tvrzení používá

pokryté odpovědnosti

Prohledává názvy a popisy všech stránek, které tento web publikuje.