fix(windows): twee stille Windows-bugs + vijftien platform-aannames in de suite #1763

Merged
brenno merged 4 commits from fix/windows-suite into main 2026-08-24 08:19:05 +00:00
Owner

Waarom

De Windows-job van de spiegel stond op zeventien rood — bij v0.4.8 vijftien,
bij v0.4.9 zeventien. Het waren geen zeventien varianten van één ding: twee
ervan zijn echte bugs die alleen op Windows optreden, vijftien waren toetsen die
de aannames van macOS toetsten in plaats van gedrag.

De twee bugs

Draaien in het bijsnijdvenster deed op Windows niets. writeBytesAtomicSync
schrijft naar een tijdelijk bestand en hernoemt dat over het doel. Op Windows
faalt een rename over een bestaand bestand; de async tweelingfunctie ving dat al
op met verwijder-dan-hernoem, en de bibliotheekdocumentatie beloofde dat gedrag
ook voor de sync-variant — maar daar ontbrak het. De enige aanroeper is het
bijsnijdvenster, dat een mislukte schrijfbeurt bewust inslikt zodat een
schrijffout de bijsnijdkeuze niet blokkeert. Samen maakte dat het geluidloos: de
preview draaide, het bestand bleef zoals het was, geen melding.

Een export buiten de projectmap verloor op Windows zijn afbeeldingen. De
herberekende relatieve paden (#1673) gingen ongewijzigd de Markdown in, dus met
backslashes. Een Markdown-link is een URL: daar is de backslash geen scheiding,
en in de LaTeX-route leest hij als ontsnappingsteken.

De vijftien toetsen

  • gate_lock_test (10×) start scripts/gate_lock.sh met Process.run
    Windows kent geen shebang. Het slot bestaat voor de machine waarop make check draait (macOS/Linux); geen poort die merges gate't draait Windows.
    Overgeslagen met een reden, zoals release_auto_version_test.dart al deed.
  • image_rename_service_test (2×) vergeleek een bestandspad met letterlijke
    tekst met schuine strepen; vergelijkt nu op padgelijkheid.
  • settings_dialog_profile_test en shell_present_and_close_test ruimden hun
    tempmap op met een kale deleteSync, terwijl Windows een net ingelezen
    bestand nog even vasthoudt (errno 32). Ze gebruiken nu deleteTempDir uit
    test/support — precies waarvoor die hulp in #933 is gemaakt.

Toetsing

  • make check groen (exit 0).
  • Beide bugs dragen een regressietest die ook op macOS rood is zonder de
    reparatie
    — proefondervindelijk vastgesteld door de reparatie tijdelijk terug
    te draaien. Dat kon door de Windows-tak toetsbaar te maken in plaats van hem te
    moeten dráaien: renameOnce bootst de mislukte rename na (zelfde middel als
    deleteOnce in test/support/temp_dir.dart), en pathContext laat de
    export-toets de Windows-padstijl doorrekenen.
  • Wat deze PR niet bewijst: dat de zeventien op de echte Windows-runner nu
    groen zijn. Die job draait alleen op een v*-tag of een handmatige dispatch op
    de spiegel. De volgende tag is de proef.

Bewaker

Overgeslagen, expliciet: geen formaat-, opslag-, afhankelijkheids- of
beloftewijziging. De exportreparatie raakt wél wat er in een .md terechtkomt,
maar in herstellende richting — een link die nergens naar wees wijst nu naar de
afbeelding.

## Waarom De Windows-job van de spiegel stond op zeventien rood — bij `v0.4.8` vijftien, bij `v0.4.9` zeventien. Het waren geen zeventien varianten van één ding: twee ervan zijn echte bugs die alleen op Windows optreden, vijftien waren toetsen die de aannames van macOS toetsten in plaats van gedrag. ## De twee bugs **Draaien in het bijsnijdvenster deed op Windows niets.** `writeBytesAtomicSync` schrijft naar een tijdelijk bestand en hernoemt dat over het doel. Op Windows faalt een rename over een bestaand bestand; de async tweelingfunctie ving dat al op met verwijder-dan-hernoem, en de bibliotheekdocumentatie beloofde dat gedrag ook voor de sync-variant — maar daar ontbrak het. De enige aanroeper is het bijsnijdvenster, dat een mislukte schrijfbeurt bewust inslikt zodat een schrijffout de bijsnijdkeuze niet blokkeert. Samen maakte dat het geluidloos: de preview draaide, het bestand bleef zoals het was, geen melding. **Een export buiten de projectmap verloor op Windows zijn afbeeldingen.** De herberekende relatieve paden (#1673) gingen ongewijzigd de Markdown in, dus met backslashes. Een Markdown-link is een URL: daar is de backslash geen scheiding, en in de LaTeX-route leest hij als ontsnappingsteken. ## De vijftien toetsen - `gate_lock_test` (10×) start `scripts/gate_lock.sh` met `Process.run` — Windows kent geen shebang. Het slot bestaat voor de machine waarop `make check` draait (macOS/Linux); geen poort die merges gate't draait Windows. Overgeslagen met een reden, zoals `release_auto_version_test.dart` al deed. - `image_rename_service_test` (2×) vergeleek een bestandspad met letterlijke tekst met schuine strepen; vergelijkt nu op padgelijkheid. - `settings_dialog_profile_test` en `shell_present_and_close_test` ruimden hun tempmap op met een kale `deleteSync`, terwijl Windows een net ingelezen bestand nog even vasthoudt (errno 32). Ze gebruiken nu `deleteTempDir` uit `test/support` — precies waarvoor die hulp in #933 is gemaakt. ## Toetsing - `make check` groen (exit 0). - Beide bugs dragen een regressietest die **ook op macOS rood is zonder de reparatie** — proefondervindelijk vastgesteld door de reparatie tijdelijk terug te draaien. Dat kon door de Windows-tak toetsbaar te maken in plaats van hem te moeten dráaien: `renameOnce` bootst de mislukte rename na (zelfde middel als `deleteOnce` in `test/support/temp_dir.dart`), en `pathContext` laat de export-toets de Windows-padstijl doorrekenen. - Wat deze PR **niet** bewijst: dat de zeventien op de echte Windows-runner nu groen zijn. Die job draait alleen op een `v*`-tag of een handmatige dispatch op de spiegel. De volgende tag is de proef. ## Bewaker Overgeslagen, expliciet: geen formaat-, opslag-, afhankelijkheids- of beloftewijziging. De exportreparatie raakt wél wat er in een `.md` terechtkomt, maar in herstellende richting — een link die nergens naar wees wijst nu naar de afbeelding.
`writeBytesAtomicSync` schreef naar een tijdelijk bestand en hernoemde dat over
het doel. Op Windows faalt een rename over een bestaand bestand; de async
tweelingfunctie ving dat al op met verwijder-dan-hernoem, en de
bibliotheekdocumentatie beloofde dat gedrag ook voor de sync-variant — maar daar
ontbrak het.

De enige aanroeper is het bijsnijdvenster, dat een mislukte schrijfbeurt
opzettelijk inslikt zodat een schrijffout de bijsnijdkeuze niet blokkeert. Beide
eigenschappen samen maakten het geluidloos: een gebruiker op Windows draaide een
afbeelding, zag de preview draaien, en het bestand bleef staan zoals het was.
Geen melding, geen logregel op het scherm.

De terugval staat er nu, met dezelfde afweging en hetzelfde plafond als in de
async-variant. `renameOnce` maakt de tak toetsbaar zonder Windows — hetzelfde
middel als `deleteOnce` in test/support/temp_dir.dart. De nieuwe toets is rood
zonder de reparatie, ook op macOS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`_rebaseImagePaths` herberekent relatieve afbeeldingspaden wanneer een export
buiten de projectmap landt (#1673), en zette het resultaat van `p.relative`
ongewijzigd in de Markdown. Dat is de padstijl van het platform, dus op Windows
kwam er `![Alt](..\map\foto.png)` uit: een Markdown-link is een URL, waar de
backslash geen scheiding is. Geen renderer volgt zo'n verwijzing, en in de
LaTeX-route leest hij als ontsnappingsteken — de afbeelding verdween dus uit
elke export die op Windows buiten de projectmap werd geschreven.

Het pad wordt nu naar URL-scheiding omgezet. Bestaat er geen relatief pad (op
Windows: een ander station), dan geeft `p.relative` het absolute pad terug; dat
wordt een file-URL in plaats van een half omgezet pad.

`pathContext` laat de toets de Windows-padstijl op elke machine doorrekenen, dus
beide nieuwe toetsen zijn ook op macOS rood zonder de reparatie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De Windows-job van de spiegel stond op zeventien rood. Twee daarvan waren echte
bugs (aparte commits); deze vijftien toetsten macOS-aannames:

- gate_lock_test (10×) start `scripts/gate_lock.sh` met `Process.run`. Windows
  kent geen shebang, dus dat is "%1 is not a valid Win32 application". Het slot
  bestaat voor de machine waarop `make check` draait — macOS en Linux — en geen
  enkele poort die merges gate't draait Windows. Overgeslagen met een reden,
  zoals release_auto_version_test.dart al deed voor zijn bash-toetsen.
- image_rename_service_test (2×) vergeleek een bestandspad met een letterlijke
  tekst met schuine strepen. Een pad krijgt de scheiding van het platform; de
  toets vergelijkt nu op padgelijkheid en toetst daarmee `destinationPath` in
  plaats van de padstijl van de machine.
- settings_dialog_profile_test en shell_present_and_close_test ruimden hun
  tempmap op met een kale `deleteSync`. Windows houdt een net via de beeldcache
  ingelezen bestand nog even vast (errno 32), waarna een geslaagde test alsnog
  rood werd. Ze gebruiken nu `deleteTempDir` uit test/support — precies waarvoor
  die hulp in #933 is gemaakt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs(changelog): de twee Windows-bugs uit de spiegel-job
All checks were successful
scans / scans (pull_request) Successful in 2m56s
static-gate / static-gate (pull_request) Successful in 6m53s
370354b024
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno merged commit ef5b87142c into main 2026-08-24 08:19:05 +00:00
Sign in to join this conversation.
No description provided.