Documentmodus: visueel opslaan kan CRLF-documenten dupliceren of beschadigen #1648
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#1648
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Probleem
De byte-getrouwe visuele save-patcher vergelijkt regels uit de originele bron inclusief de achterblijvende carriage return met een door Quill naar LF genormaliseerde baseline. Daardoor vindt de LCS-uitlijning geen overeenkomst en kan een kleine visuele wijziging bestaande regels behouden én gewijzigde regels toevoegen.
Reproductie
Verwacht
Alleen de bedoelde inhoud verandert en de oorspronkelijke CRLF-regeleinden blijven behouden.
Technische aanwijzing
lib/utils/source_patcher.dart splitst original, baseline en current met split('\n'); alleen original bevat daarna nog '\r'. Zowel _alignLines als de fallback-inhoudsmapping vergelijken die regels letterlijk.
Gevonden bij audit van commit
d439638c6b.Triage: accepted
Bevestigd tegen
main(e93ef205c).lib/utils/source_patcher.dartsplitst alle drie de versies metsplit('\n'). De baseline loopt vianormalizeRichTextMarkdown, en die zet inlib/utils/markdown_paste_cleanup.dartélke\r\nen\rom naar\n.originalis de enige die de\rhoudt. Gevolg: in een CRLF-document is er geen enkele regel die aana[i] == b[j]voldoet — de LCS vindt nul overeenkomsten, de inhoudsfallback in_applyEditsevenmin (die vergelijkt op dezelfde letterlijke tekst), en de patcher levert origineel plus gewijzigd naast elkaar op.Oplossingsrichting
Splits
originalin paren (regeltekst, regeleinde) en vergelijk uitsluitend op de tekst; het regeleinde reist mee als eigenschap van de regel. Nieuwe regels uitcurrentkrijgen het dominante regeleinde van het document (eerste voorkomen van\r\nbepaalt het) — zo wordt een CRLF-document niet stilletjes gemengd. De publieke handtekening vanpatchVisualEditshoeft niet te wijzigen; het is één laag onder de LCS.Bewust niet:
originalóók normaliseren vóór het patchen. Dat maakt de functie byte-ontrouw voor precies het geval waarvoor ze bestaat.Regressietest (verplicht)
test/source_patcher_test.dart: CRLF-bron, één woord gewijzigd → precies die ene regel verschilt, alle regeleinden nog\r\n.test/visual_save_byte_faithful_test.dart: hetzelfde langs de echte round-trip, zodat de baseline-normalisatie in de test zit en niet in de aanname.Beide eerst rood.
Kosten
Eén bestand, plus twee tests. Geen l10n, geen formaatwijziging, geen andere aanroeper (
patchVisualEditswordt alleen doordocument_save_actions.dartgebruikt).Prioriteit
Hoog binnen deze reeks: het is stille schade aan het bestand van de gebruiker, in de stand die standaard aan staat.