Co to znamená
Pravidla, která Majordomus dodává, se za běhu nečtou ze spustitelného souboru. init zkopíruje balíček z share/standard/majordomus/ do .ai/repo/rules/vendor/majordomus/, včetně manifestu, a od té chvíle platí kopie repozitáře. Manifest jmenuje každý soubor pravidla s jeho identitou a hashem obsahu, takže úprava pod vendor/, chybějící uvedený soubor nebo zbloudilý soubor vedle manifestu se odhalí jménem. Novější spustitelný soubor ohlásí, že dodává jiný balíček, a nikdy jej neuplatní; baseline se změní, jen když se o to požádá majordomus rules vendor update.
Princip
mj_rules_manifest_check v lib/rules.sh porovnává hash a identitu každého uvedeného souboru s manifestem a vypisuje, co je přítomno, ale neuvedeno. rules vendor status vypíše vendorované a dodávané revize, integritu vendorované kopie (exit 10 při jakémkoli problému) a zda jsou oba balíky stejné (exit 11, když spustitelný soubor dodává jiný). rules vendor update odmítne (15) vendorovanou kopii, která selže proti manifestu, ledaže --force, připraví nový balík vedle cíle a atomicky jej vymění, zapíše událost knihy rules.vendored a nikdy se nedotkne rules/project/. update, doctor a check nezapisují pod vendor/ vůbec.
Jak to vidět
echo "a sentence added by hand" >> .ai/repo/rules/vendor/majordomus/rules/scope-integrity.v1.md
majordomus rules vendor status # integrity: rules/scope-integrity.v1.md differs from its manifest hash (hand-edited?) exit 10
majordomus rules vendor update # refused: the vendored package was hand-edited …; review with: majordomus rules vendor diff, then --force exit 15
majordomus rules vendor update --force
majordomus rules vendor status # state: currentCo nepokrývá
Manifest dokazuje, že vendorované soubory jsou ty, které balíček dodal; neříká nic o tom, zda je balíček pro repozitář správná verze, což je rozhodnutí, které rules vendor diff informuje a které činí člověk. Projektové pravidlo pod rules/project/ je vlastní repozitáři a nepatří pod žádný manifest.
Proč existuje
Baseline, který žije ve spustitelném souboru, se mění vždy, když se mění on, potichu, na každém stroji v jiný čas. Vendorování dělá ze sady pravidel fakt repozitáře, prověřitelný v diffu a měněný záměrně. test/cases/67_rule_dag.sh upravuje, odstraňuje a přidává soubory pod vendor/, předává repozitář novější distribuci a dokazuje, že se nic nezmění, dokud se nepožádá o update, a že rules/project/ to přežije bajt po bajtu.