Zdůvodnění
Tým přijme nástroj na základě důkazů a důkazy plynou z používání. Do tohoto pravidla vývojář nemohl nástroj používat na skutečné práci, aniž by změnil soubory, které sdílí celý tým, takže se osobní zkouška stala návrhem dřív, než bylo co navrhovat. Ručně psaný exclude soubor, který zaskakoval za odpověď, nic neověřovalo, update a capture install přes něj psaly a spustitelný soubor, který vypisuje sledované soubory, jej nečetl. „Nezměnil jsem nic, co sdílíte“ je tvrzení o práci druhých a takové tvrzení kontroluje příkaz, který jej činí. ADR 0145.
Požadované chování
- Jeden kryt, vlastní gitu. Vrstva a každá cesta napsaná pro ni jsou vypsány v označeném bloku
$GIT_COMMON_DIR/info/exclude, zakotvené, jedna na řádek. Řádky mimo blok se nikdy nemění. Sledovaný.gitignorese nezapisuje. - Žádný uložený režim.
mj_personal_activečte blok. Žádný klíč manifestu, klíč politiky, proměnná prostředí ani stavový soubor neříká „personal“. - Pokrýt před zápisem. Zapisovatel mimo vrstvu volá
mj_personal_guard <path>…před zápisem. Pod osobní vrstvou ochrana pokryje cestu i přípravný název vedle ní; jinde nedělá nic, takže volání je bezpodmínečné. - Sledovaná cesta patří projektu. Odmítne se s exit kódem 15, dokud příkaz ještě plánuje, před zápisem jakékoli cesty a před jakoukoli radou, jak ji vynutit; dry run odmítne stejně.
doctortakový soubor nedrží k razítku ani k zaváděcímu řádku. - Ověřeno tam, kde se to tvrdí.
init --personalskončí s kódem 10, když se stav po liší od stavu před. Instalátor stav porovnává sám.doctorhlásíOK personalnebo jmenuje, co je sledované, nepokryté či zobrazené. - README projektu se nežádá, aby pojmenovalo bootstrap pod osobní vrstvou.
- Discovery je odvozené. Když je manifest na disku a nikde není sledován, executable prochází pracovní strom; žádná volba ho nevybírá.
- Sdílení je výslovné.
init --extend --sharedodstraní blok, zapíše dva řádky.gitignoreprostého init, vypíše cesty, které nyní patří k commitu repozitáře, a nic necommituje. Odmítne vrstvu, která není osobní. Cesta, která je podle vlastního jména něčí osobní (*.local,*.local.*), zůstává pokryta.
Chování při selhání
test/cases/2979_a_personal_layer_changes_nothing_shared.sh selže, když v repozitáři, který už drží necommitnutou práci, init --personal, update, capture install nebo --extend změní git status nebo sledované .gitignore; když cíl projekce, který politika jmenuje, není v bloku; když update zapíše jakýkoli cíl po setkání se sledovaným; když doctor nejmenuje sledovaný soubor osobní vrstvy nebo neprojde README; když je sledovaná vrstva přijata jako osobní; když linked worktree vrstvu ukazuje; když spustitelný soubor nevypíše žádné pravidlo nesledované vrstvy; když --shared opustí blok, commituje nebo přijme vrstvu, která není osobní; nebo když instalátor ohlásí úspěch bez ověření. test/cases/86_installer_platform.sh selže, když parser instalátoru přijme volbu, kterou jeho --help nedokumentuje.
Ověření
MJ_TEST_JOBS=2 bash test/run.sh 2979_a_personal_layer_changes_nothing_shared 86_installer_platform
cargo test --manifest-path apps/majordomus-cli/Cargo.toml --doc layer_is_untracked