Co to znamená
Repozitář, jehož pre-commit je dispatcher spouštějící vše v .githooks/pre-commit.d/, má stále skutečné vynucování. doctor hledá v samotném hooku i v každém souboru <hook>.d/ a hlásí soubor, který volání skutečně obsahuje — ne dispatcher, který se náhodou prohledal první.
Princip
mj_hook_candidates v lib/doctor.sh rozbalí deklarovaný hook na soubor hooku plus seřazený obsah <hook>.d/. V každém kandidátovi se hledá deklarovaný příkaz. Zjištění pojmenovává soubor, kde byl nalezen, takže zpráva ukazuje na podhook, který by člověk upravoval. Podhook, který obsahuje vyvolání, ale není spustitelný, se hlásí jako nezapojený, protože dispatcher procházející jeho adresář ho přeskočí — kontrola sleduje, co dělá dispatcher, ne co říká soubor.
Jak to vidět
mkdir -p .githooks/pre-commit.d
printf '#!/usr/bin/env bash\nmajordomus doctor\n' > .githooks/pre-commit.d/70-majordomus.sh
majordomus doctor
# FAIL wiring pre-commit — .githooks/pre-commit.d/70-majordomus.sh is not executable
chmod +x .githooks/pre-commit.d/70-majordomus.sh
majordomus doctor
# ok wiring pre-commit — invoked by .githooks/pre-commit.d/70-majordomus.shCo nepokrývá
Hledání je textové: dokazuje, že se příkaz objevuje v souboru, který dispatcher spustí, a že soubor je spustitelný. Dispatcher nesimuluje, takže subhook, který je spustitelný a obsahuje volání, ale za nějaké podmínky se předčasně vrátí, se hlásí jako zapojený. Spolknuté návratové kódy jsou samostatná kontrola.
Proč existuje
Číslované dispatchery *.d/ jsou běžný tvar repozitáře, který své hooky bere vážně. Vyžadovat po takovém repozitáři zploštění rozložení hooků kvůli kontrole by znamenalo, že se nástroj ohýbá repozitář kolem sebe.