refactor(git): guard-basis en merge-na-conflict uit de state-laag, met de scanners eindelijk gedraaid (#518) #679
No reviewers
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck!679
Loading…
Reference in a new issue
No description provided.
Delete branch "refactor/git-uit-state-2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Tweede hap uit #518, en de laatste die ik zinnig alleen kan doen — zie Wat overblijft.
Twee verplaatsingen die de issue met naam noemt
De issue zegt: "git orchestration still lives in the state layer: saving, merge-on-conflict, the queue and asset pooling sit in
state/tabs_provider_git.dartrather thanservices/git/." Hier gaan er twee van weg.roundBaseShahoort bijworkBranchFor(uit #674): dezelfde vraag, tweede helft. De eerste kiest de branch, de tweede bepaalt de commit waar de guard tegenaan botst — en dáár zit de verrassing. Bestaat de werkbranch van vandaag al (een tweede ronde, of een collega die eerder was), dan nemen we zijn kop juist niet over: dat zou de guard per definitie tevreden maken en we schreven weg wat daar staat. Vier tests; twee daarvan werden rood tegen een geplante mutatie.mergeIntoRemoteis de opslagkern van_mergeOnConflict: lees hun kant en de voorouder, voeg samen, commit als het schoon ging. Wat in de state-laag achterblijft is wat daar hoort — het deck in het tabblad zetten en de herkomst bijwerken.Een fout die de bestaande test ving
Bij die tweede verplaatsing liet ik de herkomst staan wanneer de merge niet schoon was. Dat is verkeerd, en
git_merge_on_conflict_testzei het meteen.De gebruiker kijkt vanaf dat moment naar een deck dat tegen húń kop is samengevoegd. Blijft de oude basis staan, dan botst zijn volgende opslag — ná het beslechten van de conflicten — tegen een voorouder die hij allang voorbij is.
headreist daarom mee in de teruggave, mét die reden erbij, zodat het niet nog eens gebeurt.Botsing met een parallelle sessie
Deze tak botste bij het rebasen met #676, die #670 oploste — het issue dat ik gisteren indiende. Drie conflicten, elk met een eigen juiste uitkomst:
tabs_provider_git.dart— zij centraliseerden de afbeeldingsbytes in_repoAssetBytes, ik verplaatste het hele blok. Mijn verplaatsing wint structureel, maar hún helper is nu wat mijn callback aanroept: geen zesde kopie van dezelfde regel.SOURCE_MAP.md— beide kanten voegden iets waars toe aan dezelfde regel. Samengevoegd, niet gekozen.check_conventions.dart— twee verschillende basislijnen voorTabsNotifier, elk gemeten op een andere boom. Geen van beide overgenomen: opnieuw gemeten ná het oplossen. 2254.Bij het samenvoegen van die SOURCE_MAP-regel at ik een regeleinde op, waardoor een andere regel aan zijn buurman vastplakte. De dekkingspoort ving dat — hij toetst of elke library een eigen regel heeft, en een samengeplakte regel is er nul. Aparte commit, want het is een leerzame fout en geen ruis.
Getoetst
make checkgroen na de rebase op de huidige main.make check-secretsenmake sastzijn voor het eerst écht gedraaid — gitleaks, trufflehog en semgrep staan nu op deze machine. Nul bevindingen.Wat van #518 overblijft
saveToGitis de grootste die er nog staat, maar dat is geen misplaatste code: die leest het huidige tabblad, zet de herkomst en roeptrefreshTabs(). Dat ís state-werk. Wat eruit kon is er inmiddels uit.Wat er dan nog ligt:
_queueGitSaveen_poolPendingDeck. Kleiner dan ze klonken, enmirrorDeckFiles(uit #673) haalde het hart er al uit.app_shellblijft groot; het per-klasse-plafond bewaakt het inmiddels.TabsNotifierstaat na deze twee PR's op 2254 regels, tegen 2395 bij het begin van de dag. Elke verlaging is een gemeten waarde ná de rebase, niet ervoor — die fout heb ik vandaag twee keer gemaakt en de tweede keer ving de poort hem.Werkt aan #518; die blijft open voor de rest.
Twee verplaatsingen die de issue met naam noemt ("saving, merge-on-conflict, the queue and asset pooling sit in state/ rather than services/git/"). **`roundBaseSha`** hoort bij `workBranchFor`: dezelfde vraag, tweede helft. `workBranchFor` kiest de branch, `roundBaseSha` bepaalt de commit waar de guard tegenaan botst — en dat is precies het stuk met een verrassing erin: bestaat de werkbranch van vandaag al (een tweede ronde, of een collega die eerder was), dan nemen we zijn kop juist NIET over. Die overnemen zou de guard per definitie tevreden maken en we schreven weg wat daar staat. Vier tests, waarvan twee rood werden tegen een geplante mutatie. **`mergeIntoRemote`** is de opslagkern van `_mergeOnConflict`: lees hun kant en de voorouder, voeg samen, en commit als het schoon ging. Wat in de state-laag achterblijft is wat daar hoort — het deck in het tabblad zetten en de herkomst bijwerken. Bij die tweede maakte ik onderweg een echte fout, en de bestaande test ving hem: ik liet de herkomst staan wanneer de merge níét schoon was. Dat is verkeerd. De gebruiker kijkt vanaf dat moment naar een deck dat tegen húń kop is samengevoegd, dus die kop moet de nieuwe basis worden — anders botst zijn volgende opslag, ná het beslechten, tegen een voorouder die hij allang voorbij is. `head` reist daarom mee in de teruggave, met de reden erbij. `TabsNotifier` zakt van 2325 naar 2264; de basislijn zakt mee. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>