Zdůvodnění
scripts/github-sync vypíše milníky a úkoly repozitáře dřív, než je porovná s plánem. Oba výpisy skončily v 2>/dev/null || true.
Výpis, který GitHub odmítl, zkrátil nebo omezil rychlostí, tak zanechal prázdný soubor a vše za ním ho četlo jako remote: neexistuje žádný milník, neexistuje žádný úkol. --check hlásil každý kanonický záznam jako missing a skončil kódem 11, kódem běžného driftu; kontrola nad ním přijímá 11 jako „remote byl přečten“ a hlásila by rozbitou západku tam, kde pravdou bylo, že se nic nepřečetlo. --apply spuštěné v té minutě by vytvořilo každý úkol podruhé. Řádek, který vypisuje štítky, o deset řádků níž, to už dělal správně a v komentáři říkal proč. Dva výpisy vedle něj ne.
Selhání je opakem toho, které jmenuje project.github-projection-gated. Toto pravidlo říká, že kontrola, která nedosáhne remote, nesmí projít. Toto říká, že nesmí ani selhat jako by dosáhla: odpověď, kterou nikdo nedostal, není shodou ani driftem.
Kontrola, která hlásí nález, když není co nalézt, je tentýž omyl viděný z druhé strany — prázdná množina čtená jako selhání místo selhání čteného jako prázdná množina — a stojí za to číst je spolu.
Požadované chování
- Skript, který čte remote a ponechá si odpověď, kontroluje, že čtení uspělo. Když ne, řekne, které čtení selhalo, s příkazem, který jej reprodukuje, nic dalšího nezapíše a skončí s 12.
- Odpověď
ghnebocurlse nezapisuje do souboru tak, že by se selhání příkazu zahodilo (> file 2>/dev/null || true,|| :). - Odpověď držená v proměnné se testuje tam, kde se nastavuje, a její prázdnota se nese jako „neznámé“, jménem, až k tomu, co tiskne nebo rozhoduje — nikdy jako nula, žádné nebo čisté.
- Běh, který nemohl číst, nic nezapisuje: žádný úkol se nevytvoří, neupraví, neuzavře ani znovu neotevře ze seznamu, který nebyl získán, a zámek vzatý pro běh se uvolní.
Chování při selhání
scripts/ci/shell-lint přečte každý sledovaný shellový skript pomocí scripts/lib/swallowed-listings.awk a selže s uvedením souboru a řádku na příkaz, který se ptá gh nebo curl, zapíše odpověď do souboru a končí v || true nebo || :. Skener se nejdřív spustí nad scripts/lib/swallowed-listings.fixture, v němž je odpověď zapsána, takže skener, který tvar přestal nacházet, nemůže vydávat za čistý strom. Baseline neexistuje: strom žádnou nemá.
test/cases/894_github_sync_applies_only_the_trunk.sh pohání adaptér s gh, který postupně odmítne každý výpis, pro --check a pro --apply: návratový kód je 12, zpráva jmenuje výpis, nevytiskne se žádný řádek DRIFT, žádný zápis nedosáhne gh a zámek je pryč. Tentýž případ vloží zahozená selhání zpět do kopie adaptéru a vyžaduje, aby je skener pojmenoval.
Co nezachytí, řečeno místo naznačeno: sonda, jejíž odpověď jde do proměnné (x="$(gh ... || true)"), není hlášena, protože z řádku nelze poznat, zda je prázdná hodnota pak čtena jako „neznámé“; takových sond je devět a každou má číst přezkum. Výpis, který uspěje a je jen neúplný — stránka, kterou GitHub vynechal bez chyby — zde nezjistí nic.
Příbuzný tvar se také nehlásí: nástroj, který se nemohl spustit, a jeho návratový kód vrácený jako verdikt o vstupu — čtečka JSON za shimem verze bez nastavené verze, čtená jako „tento soubor se nedá parsovat“. Skener hledá odpověď vzdáleného systému uloženou v souboru, ne návratový kód použitý jako úsudek, a oprava tohoto tvaru spočívá v rozlišení „nemohlo se spustit“ od „spustilo se a odmítlo“ tam, kde se nástroj volá.
Ověření
scripts/ci/shell-lint
bash test/run.sh 894_github_sync_applies_only_the_trunk