refactor(git): haal de werkbranch-keuze uit de state-laag, met de tests die ze nooit had (#518) #674
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!674
Loading…
Reference in a new issue
No description provided.
Delete branch "refactor/git-uit-state"
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?
Een eerste, afgeronde hap uit #518. Bewust klein: die issue zegt zelf dat dit de duurste tak is om te rebasen, en deze repo werd vandaag door meerdere sessies tegelijk bewerkt — main verschoof zes keer terwijl ik eraan werkte. Eén verplaatsing per PR is hier goedkoper dan één grote.
Wat er verandert
_workBranchForverhuist vanTabsNotifiernaarlib/services/git/work_branch.dart.Het is ontwerpbesluit D3 — bewerken gebeurt op een werkbranch, nooit rechtstreeks op de standaardbranch — en dat is een opslagbesluit. De functie is bovendien zuiver: geen state, geen forge, geen netwerk, alleen een keuze uit haar argumenten.
Dat het in de state-laag zat had één zichtbaar gevolg: er stond geen enkele test op, want hij was alleen te bereiken via een volledige opslag met een forge eromheen. Nu acht tests, en drie daarvan gaan over de beslissing die het makkelijkst over het hoofd wordt gezien.
De subtiele helft
workBranchForbeslist twee dingen tegelijk: waar dit werk landt, én wat de commit is waar de guard straks tegenaan botst. Een legebaseShais daarbij een uitspraak — "er is geen voorouder" — en niet een lege string uit slordigheid: de aanroeper weigert dan de opslag in plaats van er blind overheen te schrijven.Dat gedrag was ongetoetst. De tests dekken nu ook de twee gevallen waarin de herkomst er wél is maar niet over dít deck gaat: een ander deck in dezelfde repo, en hetzelfde pad in een andere repo. In beide gevallen is andermans sha geen voorouder, en een guard die daarop draait gaat nergens over.
De teruggave is een
typedef WorkBranchChoicegeworden in plaats van een anoniem record. De vier velden horen bij elkaar: wieworkBranchgebruikt zonderforkFromtakt niet af, en wiebaseShagebruikt zondermidRoundweet niet of die basis ergens tegenaan kán botsen.Ratchet
TabsNotifierzakt van 2379 naar 2325 regels; de basislijn zakt mee. Een ratchet die na een opruiming blijft staan is geen ratchet — dan past het volgende stuk state-logica er zo weer in.Bijvangst
De SOURCE_MAP-regel van
deck_repo_serializer.dartzei nog dat de notities-sidecar door niets inservices/git/geschreven wordt. Dat is sinds #541 onwaar. De registratiepoort toetst aanwezigheid en niet juistheid, dus zulke regels verouderen stil — vandaar dat hij hier meteen recht is gezet, inclusiefmirrorDeckFiles,repoUserNotesStateenresolveRepoDeckMerge.Wat van #518 overblijft
lib/state/:saveToGit(164 regels) en_mergeOnConflict(143) zijn de volgende kandidaten, en dat zijn echte verplaatsingen met gedrag eraan — die verdienen hun eigen PR met hun eigen tests.app_shellblijft groot; het per-klasse-plafond bewaakt het inmiddels wel.Wat al gedaan bleek toen ik #518 tegen de code toetste: het per-klasse-plafond bestaat (
maxClassLines+classSizeBaseline), de SOURCE_MAP-claim is versmald en afgedwongen (source_map_coverage_test.dart), en de commentaartaalregel staat in CONTRIBUTING. Die drie hoeven niet meer.Getoetst
make checkgroen, ook na rebase op de huidige main.Niet gedraaid:
make check-secretsenmake sast— gitleaks, trufflehog en semgrep staan geen van drieën op deze machine. Deze wijziging verplaatst code en voegt geen sleutel, netwerkpad of afhankelijkheid toe, maar de eis is daarmee niet gehaald.Werkt aan #518; die blijft open voor de rest.