fix(git): wachtrij en werkkopie horen bij één repository #359

Merged
brenno merged 1 commit from fix/git-outbox-scope into main 2026-07-19 13:43:11 +00:00
Owner

Gevonden bij het voorbereiden van meerdere git-verbindingen (#358), maar het is een bestaande fout op main die losstaand gerepareerd kan worden.

Wat er mis is

De sleutel van de outbox en de draft-store droeg alleen de deckmap:

git_outbox::decks/kwartaalcijfers
git_draft::decks/kwartaalcijfers
<app-support>/git_mirror/decks/...

Zolang er precies één repository kon bestaan viel dat niet op. Zodra er twee zijn:

  • twee repo's met een gelijknamig deck overschrijven elkaars wachtende commit en elkaars werkkopie;
  • pending() levert de hele wachtrij op, en _flushGitQueue duwt die naar de forge die op dát moment is ingesteld — dus werk dat voor de ene opdrachtgever wachtte, belandt in de repository van de andere.

Er komt geen foutmelding uit, want elke stap op zich klopt. Dit raakt het REST-pad (web en desktop zonder native git); de native mirror was al per repo gescheiden.

De reparatie

Beide zijn gescopet op GitRepoConfig.storageSlug — dezelfde sleutel waarmee de native mirror al één clone per repo aanhield, nu gedeeld in plaats van gedupliceerd. Een deckmap kan per GitRepoLayout nooit een : bevatten, dus een gescopede sleutel is niet te verwarren met een oude.

Migratie

Wat er nog wacht is werk dat nog geen server heeft gezien; het laten liggen zou het stilletjes onbereikbaar maken. adoptLegacyEntries() neemt het daarom over naar de repo die tóén was ingesteld — er was er maar één, dus die is de enige rechthebbende. De overname is idempotent, pakt de sleutels van een andere repo niet af, en overschrijft nooit iets nieuwers. Loopt hij stuk, dan is dat een logregel en geen crash: het oude werk staat er dan nog steeds.

Controle

make check volledig groen: 3440 tests, dekking 79,2%. test/git_outbox_scope_test.dart legt de scheiding vast, inclusief het geval dat een flush de wachtrij van de andere repo zou meenemen.

🤖 Generated with Claude Code

Gevonden bij het voorbereiden van meerdere git-verbindingen (#358), maar het is een bestaande fout op `main` die losstaand gerepareerd kan worden. ## Wat er mis is De sleutel van de outbox en de draft-store droeg alleen de deckmap: ``` git_outbox::decks/kwartaalcijfers git_draft::decks/kwartaalcijfers <app-support>/git_mirror/decks/... ``` Zolang er precies één repository kon bestaan viel dat niet op. Zodra er twee zijn: - twee repo's met een gelijknamig deck overschrijven elkaars wachtende commit en elkaars werkkopie; - `pending()` levert de hele wachtrij op, en `_flushGitQueue` duwt die naar de forge die op dát moment is ingesteld — dus werk dat voor de ene opdrachtgever wachtte, belandt in de repository van de andere. Er komt geen foutmelding uit, want elke stap op zich klopt. Dit raakt het REST-pad (web en desktop zonder native git); de native mirror was al per repo gescheiden. ## De reparatie Beide zijn gescopet op `GitRepoConfig.storageSlug` — dezelfde sleutel waarmee de native mirror al één clone per repo aanhield, nu gedeeld in plaats van gedupliceerd. Een deckmap kan per `GitRepoLayout` nooit een `:` bevatten, dus een gescopede sleutel is niet te verwarren met een oude. ## Migratie Wat er nog wacht is werk dat **nog geen server heeft gezien**; het laten liggen zou het stilletjes onbereikbaar maken. `adoptLegacyEntries()` neemt het daarom over naar de repo die tóén was ingesteld — er was er maar één, dus die is de enige rechthebbende. De overname is idempotent, pakt de sleutels van een andere repo niet af, en overschrijft nooit iets nieuwers. Loopt hij stuk, dan is dat een logregel en geen crash: het oude werk staat er dan nog steeds. ## Controle `make check` volledig groen: 3440 tests, dekking 79,2%. `test/git_outbox_scope_test.dart` legt de scheiding vast, inclusief het geval dat een flush de wachtrij van de andere repo zou meenemen. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
brenno force-pushed fix/git-outbox-scope from 34ed27ab87
Some checks failed
CI / Gate (Linux) · Format · Analyze · Coverage (push) Has been cancelled
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Web hardening (push) Has been cancelled
CI / Docs links (push) Has been cancelled
CI / Supply-chain (Trivy · advisory) (push) Has been cancelled
CI / Gate (Linux) · Format · Analyze · Coverage (pull_request) Has been cancelled
CI / Test (macos-latest) (pull_request) Has been cancelled
CI / Test (windows-latest) (pull_request) Has been cancelled
CI / Web hardening (pull_request) Has been cancelled
CI / Docs links (pull_request) Has been cancelled
CI / Supply-chain (Trivy · advisory) (pull_request) Has been cancelled
to 3af6348cfc
Some checks failed
CI / Gate (Linux) · Format · Analyze · Coverage (push) Has been cancelled
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Web hardening (push) Has been cancelled
CI / Docs links (push) Has been cancelled
CI / Supply-chain (Trivy · advisory) (push) Has been cancelled
CI / Gate (Linux) · Format · Analyze · Coverage (pull_request) Has been cancelled
CI / Test (macos-latest) (pull_request) Has been cancelled
CI / Test (windows-latest) (pull_request) Has been cancelled
CI / Web hardening (pull_request) Has been cancelled
CI / Docs links (pull_request) Has been cancelled
CI / Supply-chain (Trivy · advisory) (pull_request) Has been cancelled
2026-07-19 13:43:07 +00:00
Compare
brenno merged commit fb09186f64 into main 2026-07-19 13:43:11 +00:00
brenno deleted branch fix/git-outbox-scope 2026-07-19 13:43:11 +00:00
Sign in to join this conversation.
No description provided.