Okamžik
Dvě relace, dvě větve, tentýž selhávající test. Obě najdou příčinu, obě ji opraví, obě otevřou změnu. Jedna je zbytečná a sloučení té druhé s ní teď koliduje.
Proč k tomu dochází
Každý worker znal svou úlohu a nic o úloze druhého. Dát každému workeru vlastní git worktree působí jako oprava a opravdu to brání přepisování souborů navzájem. Nebrání to dělání stejné práce. V prostředí, z něhož byl tento nástroj vydestilován, čtyřicet plně izolovaných worktree stále vyprodukovalo několik tisíc souběžně změněných souborů a desítky duplicitních patchů; z osmdesáti se jich sloučilo devět. Izolace proměnila okamžitá přepsání v odložené, větší konflikty.
Proč to lepší model nevyřeší
Žádný worker neudělal chybu. Každý vyřešil zadaný problém správně s informacemi, které měl — a informace, které by plýtvání zabránily, nebyly nikdy zapsány nikam, kde by je mohl některý z nich přečíst. Schopnější model na obou stranách vyrobí dvě lepší duplicitní opravy, rychleji.
Co to stojí
Zjevnou cenou je zahozený den. Větší je konflikt: dvě nezávislé opravy jednoho subsystému se smiřují hůř než jedna, takže se plýtvání platí dvakrát, jednou při psaní a jednou při merge. Pokud duplicitní práce dojde až do review, stojí navíc pozornost recenzenta u změny, která nikdy neměla vzniknout.
Co Majordomus dělá
majordomus start vyžaduje rozsah: cesty, kterých se úloha smí dotknout, normalizované v době deklarace a uložené v záznamu úlohy. Každý jiný worktree repozitáře se čte přímo z git worktree list; pokud má některý aktivní úlohu, jejíž rozsah obsahuje váš nebo je v něm obsažen, start to řekne a pojmenuje worktree a cestu. check a finish selžou při jakémkoli dotčeném souboru mimo rozsah. Na checkout je aktivní jedna úloha, takže druhý start se odmítne, dokud není první předán nebo dokončen.
Před a po
before worker A: fix flaky auth test (branch a, no declaration)
worker B: fix flaky auth test (branch b, no declaration)
merge: two fixes, one conflict
after worker A: start --scope lib/auth,test/auth
worker B: start --scope lib/auth
OVERLAP ../checkout-a holds lib/auth (task t-0091, active)Jak to ověřit
Deklarujte rozsah v jednom worktree, pak v jiném spusťte úlohu s překryvem a přečtěte si, co říká. Překryv se hlásí s worktree a cestou a check odmítne soubor mimo deklarovaný rozsah.
Co nedělá
Překryv se hlásí, nikdy neblokuje: zda mají dva lidé pracovat na překrývajících se cestách, je rozhodnutí o koordinaci, ne pravidlo. Vidí worktree jednoho repozitáře na jednom stroji, ne jiné klony. Nic nesluče a nevydává žádné příkazy merge.