From 922ca1cbb63adcea40ee64e89c8f0a37600634cf Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:39:53 +1100 Subject: [PATCH 01/50] Regroup todo.md by area, and leave out what is done The file was three lists by where an item came from, each opening with what had been fixed. It is now one list an area of what is open, with the history, the legend of evidence tags and three notes that described a change rather than work to do taken out. --- todo.md | 297 +++++++++++++++++++++++--------------------------------- 1 file changed, 122 insertions(+), 175 deletions(-) diff --git a/todo.md b/todo.md index 5c44894a..2a3e319f 100644 --- a/todo.md +++ b/todo.md @@ -1,186 +1,133 @@ -# Review todo - -Findings from a review of `main` at 991bc480 (2026-10-03). The list from the review at 4244ebe6 is closed, so this one weights what has landed since: documents and maps, the text diff, zoom and pan, the remembered window and views, and pictures decoded off the UI thread. - -Most of it came from six reviews run alongside, one per area: the library, the inline patcher, the tray, and the Windows, Linux and macOS heads. Every bug found is fixed and gone from this list: the five in the viewer's model, and the twenty seven the six reviews found. So is every performance item, all fourteen, and every smaller item but one. What is left is what those fixes did not reach. - -File and line references are as of a01dfc1d, before the second round of fixes and before the performance ones. The code they point at is unchanged, but lines below an edit have moved, so go by the names. - -- **reproduced**: run and seen by me. Either the API involved, or the repo's own sources compiled into a scratch console project outside the repo. No test in the repo yet. -- **measured**: timed by me in that same project. Release, net10.0, this machine. -- **read**: confirmed by me reading the code path, not run. -- **reported**: found by one of the six reviews and not rerun by me. What follows the word is the reviewer's own evidence: *ran* is a probe of theirs outside the repo, *measured* a timing of theirs, *read* a trace through the code, and *plausible* a reading that rests on something they could not run, with what would settle it. For each of these I checked that the code it quotes is in the tree as quoted, and nothing more. -- **left by the fix**: said by whoever fixed the bug it sits under, about the part the fix did not reach. -- Nothing under a macOS heading has been run by a person: the Swift cannot be built from Windows. CI's `macos-14` job compiles it and runs the suite and the pixel snapshots, and it passes there. The Linux fixes were built and run in an `ubuntu:24.04` container, and pass on CI's Linux job too. The two macOS performance changes are in the same position as the fixes, and have not been measured either. - - -## Bugs - -Nothing that was found as a bug is open. What follows is what the fixes left. - -### Library - -- [ ] A viewer that is alive and never binds the port is still reported as launched after `BindWait`, and its payload file stays. That is the apphost's "install .NET" dialog, which does not exit. At the gate it cannot be told from a viewer that is only slow. (left by the fix) -- [ ] A viewer that exits 1 or 4 has staged the patch itself, and the caller, told the launch failed, now stages it too: two trios in different `VerifyInline` folders until a passing run clears both. (left by the fix) -- [ ] A failed launch still spends a `MaxInstance` slot, so after five in one process the cap answers instead. (left by the fix) -- [ ] On macOS and Linux a tool started without ShellExecute still inherits the test host's streams. Nothing in the definitions tells a terminal tool, which needs them, from a windowed one: Neovim is declared `UseShellExecute: true` like the rest. (left by the fix) -- [ ] `DiffRunner.LaunchProcess` still starts a third party tool in the test host's working directory, which then cannot be deleted while the tool is open. Left alone because a tool resolves relative arguments against it and `ProcessCleanup` matches on those same strings. (left by the fix) -- [ ] None of the four tools now started through `WindowsProcess.StartInheritingNothing` (Word and Excel comparers, Cursor, VS Code) was itself run. A console exe, a windowed exe and a `.cmd` stood in for them. (left by the fix) - -### Inline snapshots - -- [ ] Verify has to change for the staged trios of a multi-targeted project to be cleared per framework: in `InlineEngine.Settle()`, call `InlineStaging.Settle(MappedSourceFile, inline.Line, inline.MemberName, VerifierSettings.IntermediateDir, SnapshotInSource)` in place of `ClearStaged(...)`. DiffEngine's half is done: the trios are labelled, and `Settle` clears only the running framework's. (left by the fix) -- [ ] A queued entry is still found by its line, with the member asked second. Three cases remain: a test that carries on past a failed verification and has two call sites only the line tells apart folds them into one; an entry the reporting framework has no content in is not moved, so a multi-target run can keep a stale duplicate; and a settle from the same member is believed on a key hit. Rebasing the hints of a file's remaining entries when one is accepted would close all three, and was not done because a batch accept finds entries by their `Variants` reference. (left by the fix) -- [ ] An `Append` with a stale hint takes the first call in the member that has no `Snapshot` call. Where an earlier call there is verified through files, or through `settings.Snapshot`, that is the wrong call, as it already was whenever such a call came first. (left by the fix) -- [ ] A `Remove` with a stale hint can answer AlreadyApplied while its anchored call is still there, because `RemovedAtHint` is asked first. (left by the fix: seen in its fuzzing, and present before it) +# Todo + +What is open after the review of `main` at 991bc480 and the three rounds of fixes that followed it: bugs, performance, and smaller items. Everything those rounds fixed is gone from here. What is left is one item that was never fixed, the macOS viewer started with no console session, and what the fixes did not reach, by area. + +An item with no tag was said by whoever made the fix it follows from. A tag says how else it is known. Nothing under the macOS head has been run by a person: the Swift cannot be built from Windows, and CI's `macos-14` job compiles it and runs the suite and the pixel captures, which open no window. The Linux head was built and run in an `ubuntu:24.04` container, under Xvfb with Mesa's software rasteriser. + + +## Library + +- [ ] A viewer that is alive and never binds the port is still reported as launched after `BindWait`, and its payload file stays. That is the apphost's "install .NET" dialog, which does not exit. At the gate it cannot be told from a viewer that is only slow. +- [ ] A viewer that exits 1 or 4 has staged the patch itself, and the caller, told the launch failed, now stages it too: two trios in different `VerifyInline` folders until a passing run clears both. +- [ ] A failed launch still spends a `MaxInstance` slot, so after five in one process the cap answers instead. +- [ ] On macOS and Linux a tool started without ShellExecute still inherits the test host's streams. Nothing in the definitions tells a terminal tool, which needs them, from a windowed one: Neovim is declared `UseShellExecute: true` like the rest. +- [ ] `DiffRunner.LaunchProcess` still starts a third party tool in the test host's working directory, which then cannot be deleted while the tool is open. Left alone because a tool resolves relative arguments against it and `ProcessCleanup` matches on those same strings. +- [ ] None of the four tools started through `WindowsProcess.StartInheritingNothing` (Word and Excel comparers, Cursor, VS Code) was itself run. A console exe, a windowed exe and a `.cmd` stood in for them. +- [ ] The listener table is every connection the machine has, filtered, so reading it grows with them: 0.45 ms at 86 connections and 7.9 ms at 3,102. `ViewerClient` skips it for a port that answered in the last second; `PiperClient.PortIsHeld` reads it on every send. A listener-only table by P/Invoke would not grow. +- [ ] `RecheckUnownedAfter` is still ten minutes, though a recheck on Windows is a read of the table rather than two seconds, and could come down. +- [ ] Off Windows the connect is the only question asked, since a refusal there is immediate. Whether the table reads as empty under WSL1 was not checked. +- [ ] `PiperClient.PortIsHeld` takes any exception from the table as "may be held", where it took two kinds. +- [ ] Kept connections were not run on macOS: neither the rebind of a port whose last owner left a client holding a connection, nor the receive timeout surfacing as `SocketError.TimedOut`. And they were tested against a stand-in for an older owner, not a released tray or viewer. +- [ ] A client talking to an owner from before `keeps` still makes a connection per settle, so the port exhaustion stands against an older tray. +- [ ] The async inline send and every asking send (`TrySend` with a response, `InlineQueueClient`, `OwnerLink`'s five a second listing) are still a connection each. +- [ ] A connect that fails because the machine has no ports left is still recorded as an unowned port. Which `SocketError` Windows gives there was not established. +- [ ] Parallel settles take turns at the one connection under a lock, so a slow owner holds them in a line, where each used to wait on a connection of its own. +- [ ] A test process holds a socket to the queue's owner for its whole life. On .NET Framework sockets are inheritable, so a child a test starts without ShellExecute can hold that connection open after the test host exits. (not run) +- [ ] The accept wait is a fixed 100 ms from the second failure in a row. The case where a failure persists was run on Linux only, by using up the descriptors. +- [ ] Apple's `ps` was not run with `-ww`; its manual says a second `-w` uses as many columns as it needs. + + +## Inline snapshots + +- [ ] Verify has to change for the staged trios of a multi-targeted project to be cleared per framework: in `InlineEngine.Settle()`, call `InlineStaging.Settle(MappedSourceFile, inline.Line, inline.MemberName, VerifierSettings.IntermediateDir, SnapshotInSource)` in place of `ClearStaged(...)`. DiffEngine's half is in: the trios are labelled, and `Settle` clears only the running framework's. +- [ ] Verify's half of a Remove applied twice: skipping the Remove when the source file is newer than the test assembly. DiffEngine's half keeps the removed call's line, empty, when a Snapshot call is under it, which is a rule about the next line and not a guarantee about line numbers. +- [ ] A queued entry is still found by its line, with the member asked second. Three cases remain: a test that carries on past a failed verification and has two call sites only the line tells apart folds them into one; an entry the reporting framework has no content in is not moved, so a multi-target run can keep a stale duplicate; and a settle from the same member is believed on a key hit. Rebasing the hints of a file's remaining entries when one is accepted would close all three, and was not done because a batch accept finds entries by their `Variants` reference. +- [ ] An `Append` with a stale hint takes the first call in the member that has no `Snapshot` call. Where an earlier call there is verified through files, or through `settings.Snapshot`, that is the wrong call, as it already was whenever such a call came first. +- [ ] A `Remove` with a stale hint can answer AlreadyApplied while its anchored call is still there, because `RemovedAtHint` is asked first. (seen in fuzzing, and present before the fix it was found beside) +- [ ] A `Remove` that takes a whole statement line (`settings.Snapshot("dup");`) still brings the next line up, so applied twice over a sibling `other.Snapshot("dup");` the second apply takes the sibling's statement. `RemovedAtHint` only recognises a removal under a verify call. (read, not run) +- [ ] An empty `TestName` or `MemberName` still reads back as null from `InlinePatchFile`; only `OriginalValue` has a line saying it is present and empty. +- [ ] The F# scanner outside a comment still takes a tick after an identifier character as part of the name, and still reads the holes of `$"..."` its own way. Only comments and backticked names were held to `dotnet fsi`. +- [ ] Lexing is still once a patch, in a batch as well: each patch is applied to what the one before it left, and one scan for all of them would not give the outcomes of applying in turn. 500 patches to a 600 KB file are 0.8 s of patching around one write. +- [ ] `CanAnchor` still reads and lexes the whole file for each call site a run has not seen before: 0.7 s for 500 call sites in the 600 KB file. +- [ ] A batch's one write that fails fails every patch from the first edit on, including one judged already applied or not found after it, and the file's mutex is held from the read to the write. +- [ ] A `VerifyInline` directory another process creates can be found up to a second late by `InlineStaging.Clear`. +- [ ] Two Windows-only tests assert that a send to a free port returns in under a second, where the refusal it avoids takes two. + + +## Tray + +- [ ] "Accept all in" a group from an attached viewer sends one `Accept` per key (`OwnerLink.AcceptGroup`), so the guard that leaves a delete whose file a move in the same sweep wrote does not apply there. +- [ ] A delete held back that way stays in the menu with only a log line to say why, and a second "Accept all" carries it out. +- [ ] An owning viewer's own batch looks to have the shape the tray's had: `ViewerSession.EnqueueTracked` replaces by key only, and `BeginAcceptAll` takes moves and deletes in queue order, so a delete can follow the move that wrote its file. (read, not run) +- [ ] A batch that begins between Verify raising a delete and queueing its patch can still carry out the delete without the patch. Closing that needs the two tied together on the wire. +- [ ] A logoff also skips `TrayVersionFile.Delete()`, for the reason it skipped the staging. +- [ ] The session ending was confirmed by sending the tray-shaped process `WM_QUERYENDSESSION` and `WM_ENDSESSION`, not by logging off. +- [ ] A process id is matched to the payload's `Exe` by file name only, so a reused id now held by another copy of the same tool is still tracked, and killed on accept if the move can be killed. +- [ ] A tool started through a `.cmd` (VS Code, Rider) is never tracked as a process, so it never counts for "Accept all open" and is never closed by the tray. Nor is a tool whose launcher hands over to an executable of another name and exits. The tool definitions were not surveyed for either. +- [ ] "Discard (n)" still discards tracked moves on the UI thread, with up to 500 ms per killable tool waiting for it to exit. Only the queue's half is on a worker, and a bulk discard that fails is only logged. +- [ ] A scan that keeps failing is only in the log. Nothing tells the user. +- [ ] `ListingTag` can answer "unchanged" for a listing built while a move was briefly out of the dictionary during an accept and then restored. +- [ ] `Tracker.differing` is never pruned when a move leaves. (noticed, not touched) +- [ ] `KeyRegisterTests` registers a real global hot key, Ctrl+Alt+Shift+F24, for the length of each test, and fails where something else holds it. + + +## Viewer model + +- [ ] Past its budget a diff is correct and may not be the smallest: two texts of more than 10,000 lines between them with 8,000 or more of the lines they share out of place. A block moved whole is found whatever its size. The same lines shuffled come out as nearly everything changed, where the longest run still in order could be kept: anchoring on the lines that occur once on each side, by the longest increasing run of them, would find it in the time of a sort. +- [ ] A pair is still read and diffed before the viewer answers the test process that sent it (`MessageHandler.TrackMove`). The diff is bounded, so what is left is two reads: a million lines a side, shuffled, is about two of the sender's three seconds. Answering first and filling the entry in afterwards, as a document arrives `Reading`, was not done. +- [ ] A screen is built when the state changes, which a scroll or a drag does every frame, and `QueueProjection.Rows` describes every row of the queue to draw the forty that fit: 0.55 ms and 1.1 MB at 2,000 entries, for each such frame. Slicing before describing would make it the visible rows'. +- [ ] `ScreenPayload` clips a row to the window's width in cells rather than the pane's, so about twice what a pane can show is encoded for the macOS and Linux heads: 3.6 ms a changed frame for a 4K window of 300 character CJK lines. `RowText.Shown`, which the WinForms head cuts with, would serve, once the model knows how many cells a pane has. +- [ ] A queue of more than a hundred pending files is looked at a hundred a pass, so a row that is not on screen follows its file within `count / 100` passes: two seconds for a thousand, and five times that while the window is hidden. +- [ ] Every arrival (`EnqueueInline`), settle and single accept still rebuilds the whole list from the whole queue, under the lock: a dictionary of the queue and an ordering. Only a batch's record step does not. +- [ ] The bulk discards are still one transition on the render thread: `DiscardGroup` and `DiscardAll` delete each received file under the lock. +- [ ] A snapshot discarded, or settled by a test that started passing, while its own source file is being written by a bulk accept was handed over with the rest of the file and is written with them. It is not counted, and a discard still takes it out of the queue. Closing it would take the applier asking, before its one write, which of the patches are still wanted. +- [ ] Both sides of a document are drawn at once, and four things about that could be better: a drawing is not stopped when the reader leaves its entry, though between two pages of a PDF it could be; the pages of a PDF that is put back because the other side stopped inside PDFium are dropped, and drawn again once PDFium is free; a PDF pair's right side waits for the left's first page, which is what lets the two be told apart when both stop; and `Withdrawn`, which takes a rendering back out of the state, lives in `DocumentWatch` where it belongs beside `ViewerSession.Rendered`. +- [ ] Which of two PDFs stopped inside PDFium is inferred from whose pages stopped first, not known. A thread descheduled between landing a page and asking for the lock, at the moment the other side hangs, would have the innocent side given up on and the culprit put back. +- [ ] `TrackedWatch` closes an open context menu when a file is written again with what it held, since the entry is replaced by its restamped copy through `ViewerSession.Refresh`. The reader is not moved. +- [ ] The two tests that show a pair is not diffed again, and the one that bounds what reading a file allocates, were not run against the code from before their fixes. + + +## Viewer, Windows head + +- [ ] Between half its own size and its own size an enlarged picture is still scaled on every paint: 15 ms for a 4000 by 3000 pair at 400%. A copy there would cost up to the decoded picture again, 96 MB for that pair. Decoding premultiplied (`Format32bppPArgb` in `ImageCache.Load`) measured 9 ms, and was left out because it moves translucent pixels by one level in five pixel scenes. +- [ ] A picture drawn from its scaled copy sits on whole pixels, up to half a pixel from its exact placement, so two pictures of different sizes can be a pixel apart relative to each other while zoomed below half size. +- [ ] `Uncomposable` is a picture's rather than a size's, so a scale that failed also stops the fitted copy being made again at a new size. +- [ ] `RowText.Shown`'s tests are in `DiffEngineViewer.Windows.Tests`, beside its one caller. They belong beside `CellGridTests`. +- [ ] A minimised window slows only its own frame wait. `OwnerLink`, `TrackedWatch` and the document reader go by `Hidden`, which only a Hide command sets, so they keep their on screen cadence while minimised. The head would have to tell the loop. +- [ ] A status that does not fit loses what is past two lines, behind an ellipsis and a tooltip. The footer does not wrap its buttons or give the status a line of its own as the other two heads do. Whether a scaled display shows the middle of a wrapped status is unchecked: captures are unscaled. +- [ ] Nothing proves by throwing that an exception comes out of a message pump in the test hosts rather than WinForms' dialog. The test reads the mode back instead, through an internal of WinForms, because a throwing one is what put the dialog on screen. +- [ ] `TwoKeysInOnePumpAreTwoCommands`, `ATextEntryHasNoPictureForTheWheelToFind` and `TheWheelOverAPictureZoomsAndOverTheRowsScrolls` failed once in a run of the whole solution and passed in the next and twice alone. They post keys and wheel turns to a form, and someone was using the machine. (seen once) +- [ ] Footer buttons leave `UseMnemonic` on, so an ampersand in a label would become an Alt access key. (noticed, not looked into) -### Tray -- [ ] "Accept all in" a group from an attached viewer sends one `Accept` per key (`OwnerLink.AcceptGroup`), so the guard that leaves a delete whose file a move in the same sweep wrote does not apply there. (left by the fix) -- [ ] A delete held back that way stays in the menu with only a log line to say why, and a second "Accept all" carries it out. (left by the fix) -- [ ] An owning viewer's own batch looks to have the shape the tray's had: `ViewerSession.EnqueueTracked` replaces by key only, and `BeginAcceptAll` takes moves and deletes in queue order, so a delete can follow the move that wrote its file. (left by the fix: read, not run) -- [ ] A batch that begins between Verify raising a delete and queueing its patch can still carry out the delete without the patch. Closing that needs the two tied together on the wire. (left by the fix) -- [ ] A logoff also skips `TrayVersionFile.Delete()`, for the reason it skipped the staging. (left by the fix) -- [ ] The session ending was confirmed by sending the tray-shaped process `WM_QUERYENDSESSION` and `WM_ENDSESSION`, not by logging off. (left by the fix) +## Viewer, Linux head -### Viewer, Linux head +- [ ] The body is not told about a taller footer. The model's eight chrome lines leave room for two rows of buttons and a status line; a paged document in a window under about 450 px wide needs four, and the last body rows are then hidden. Fixing it means the shim reporting fewer `rows`, which changes what `deview.h` says that field is. +- [ ] The machine's fonts are drawn, not shaped: Arabic is unjoined and right to left text is in stored order. Colour emoji fonts and CFF2 variable fonts cannot be read by stb_truetype and are passed over, so a machine whose only CJK font is the variable Noto still shows replacement glyphs. At most fifteen fonts are merged. +- [ ] Accept-all reads the Shift key's physical state, so a latched Shift (sticky keys) is a plain accept. +- [ ] A held letter repeats its command at the keyboard's repeat rate, so holding `a` accepts repeatedly. Only navigation should repeat, as on Windows. +- [ ] An idle window still turns sixty times a second. Each turn compares the screen's bytes with the last one's, asks after the files behind the pictures on it and waits out its sixtieth: 3 to 9 ms of processor a second. Waiting on the window system instead would take the managed loop, which also asks after its owner and its files each turn, being told when to wake. +- [ ] Nothing in `DiffEngineViewer.Tests` fails if the window goes back to drawing every frame. `NativeIdleBenchmarks` shows it, in its Drawn column, and is run by hand in the container. +- [ ] A hidden window is still built and drawn when its screen changes, which an arrival in the queue does. +- [ ] Leaving an idle window alone was run only under Xvfb with Mesa's software rasteriser, with no window manager and under openbox. Not on a GPU, under a compositor, on Wayland or over forwarded X, where what the window system keeps of a window that is not being drawn may differ, and where leaving one alone matters most. +- [ ] `deview_capture` makes its ImGui context without `ImGuiBackendFlags_RendererHasVtxOffset`, which the window's declares, so a capture whose draw list passes 65,535 vertices comes out scrambled. Nothing captures at that size, but dense text at 4K could. (ran, with the flag added to an older shim) +- [ ] A picture larger than `GL_MAX_TEXTURE_SIZE` draws as nothing. It could be reduced on the decoder thread to fit a texture. `PixelTests.ImageTooLargeForATexture` holds only under llvmpipe, whose limit is 16384. +- [ ] Display scale is read once, as the window is made. A change of `Xft.dpi` while running, and a scale per monitor under Wayland or XWayland, are not followed, and a placement remembered at one scale is used in pixels at another. Checked only under Xvfb with an X resource at 144 and 192, never on a HiDPI desktop. +- [ ] A frame of two pictures costs about a tenth more under llvmpipe since mipmaps (opaque at 4K, 27.0 ms to 30.1), probably the trilinear sampling of a picture drawn under half size. Mipmaps also add about a third to a picture's memory, drawn small or not. (measured, cause unconfirmed) +- [ ] `[`, `]`, `0`, `-` and `=` have no fallback by position on a layout that is not Latin; only the letters do. +- [ ] All input comes through GLFW's callbacks. A release that never arrives would leave a button held: GLFW's own release on losing focus is relied on, and hiding the window during a press was not tried. A two finger tap on a real touchpad is unconfirmed. -- [ ] The body is not told about a taller footer. The model's eight chrome lines leave room for two rows of buttons and a status line; a paged document in a window under about 450 px wide needs four, and the last body rows are then hidden. Fixing it means the shim reporting fewer `rows`, which changes what `deview.h` says that field is. (left by the fix) -- [ ] The machine's fonts are drawn, not shaped: Arabic is unjoined and right to left text is in stored order. Colour emoji fonts and CFF2 variable fonts cannot be read by stb_truetype and are passed over, so a machine whose only CJK font is the variable Noto still shows replacement glyphs. At most fifteen fonts are merged. (left by the fix) -- [ ] Accept-all reads the Shift key's physical state, since raylib gives no modifiers with a character, so a latched Shift (sticky keys) is a plain accept. (left by the fix) -### Viewer, macOS head +## Viewer, macOS head -- [ ] The four macOS fixes compile and the suite passes on CI, but none has been run by a person, and two are event handling that no capture exercises. What would confirm each on a Mac: +- [ ] `Runtime.open` cannot fail (it always returns true), so with no console session, as over SSH, AppKit aborts the process after the port was bound and the patch is lost. `CGSessionCopyCurrentDictionary()` is the documented question to ask, and was not used because it may also answer "no session" over SSH while the same user is logged in at the console, where the viewer opens today. What would settle it: print that call from an SSH shell with and without a console login, and run the viewer in each. (reported: plausible) +- [ ] To confirm on a Mac, from the bug fixes. Two are event handling that no capture exercises: - Keys and clicks queued: with three entries queued, `pkill -STOP -x DiffEngineViewer`, press Down twice, `pkill -CONT`: the panes scroll two rows. Stopped, Tab then `a`: the second entry is the one accepted. - The scroller's knob: dragging it scrolls the panes while the button is down, and the scroller stays on the right edge through a resize. - The footer: `DiffEngineViewer --diff a.png b.png` at the default size has "images differ" on a line of its own with nothing over "Zoom in"; a PDF pair has two rows of buttons, all of which click. - Ligatures: `!= <= => -> == ...` in a text file are each drawn as separate characters. -- [ ] A live resize still draws the rows sliced for the old size until the mouse comes up. That half of the tracking loop bug needs a frame callback in the C ABI. A press in the scroller's slot followed by a drag is still AppKit's loop too. (left by the fix) -- [ ] The managed side still slices the body for a footer of one row. This head has 64 pt to spare, which is three rows of buttons or two and a status line; past that the last one or two body rows are not drawn. (left by the fix) -- [ ] Every auto-repeat of a held `a` or `d` is now handed over, including ones queued during a stall. `event.isARepeat` would drop them. The Windows head now drops them for the commands that change the queue. (left by the fix) -- [ ] The title row has the footer's old shape: the subtitle is drawn over a long title. (left by the fix) - - -## Performance - -Nothing that was found as a performance item is open. Each was measured before and after by a benchmark that is now in the repository, in `src/DiffEngine.Benchmarks`, `src/DiffEngineViewer.Benchmarks` and `src/DiffEngineViewer.Windows.Benchmarks`, and the numbers are in the commits that made the changes. The two Linux items were measured in the `ubuntu:24.04` container, by `NativeFrameBenchmarks` and `NativeIdleBenchmarks`, which are left out of a run anywhere else. Two were not measured, because nothing here can run them: both macOS items. What follows is what the fixes left. - -### Viewer model - -- [ ] Past its budget a diff is correct and may not be the smallest: two texts of more than 10,000 lines between them with 8,000 or more of the lines they share out of place. A block moved whole is found whatever its size. The same lines shuffled come out as nearly everything changed, where the longest run still in order could be kept: anchoring on the lines that occur once on each side, by the longest increasing run of them, would find it in the time of a sort. (left by the fix) -- [ ] A pair is still read and diffed before the viewer answers the test process that sent it (`MessageHandler.TrackMove`). The diff is bounded now, so what is left is two reads: a million lines a side, shuffled, is about two of the sender's three seconds. Answering first and filling the entry in afterwards, as a document arrives `Reading`, was not done. (left by the fix) -- [ ] A screen is built when the state changes, which a scroll or a drag does every frame, and `QueueProjection.Rows` describes every row of the queue to draw the forty that fit: 0.55 ms and 1.1 MB at 2,000 entries, for each such frame. Slicing before describing would make it the visible rows'. (left by the fix) -- [ ] `ScreenPayload` clips a row to the window's width in cells rather than the pane's, so about twice what a pane can show is encoded for the macOS and Linux heads: 3.6 ms a changed frame for a 4K window of 300 character CJK lines. `RowText.Shown`, which the WinForms head now cuts with, would serve, once the model knows how many cells a pane has. (left by the fix) -- [ ] A queue of more than a hundred pending files is looked at a hundred a pass, so a row that is not on screen follows its file within `count / 100` passes: two seconds for a thousand, and five times that while the window is hidden. The entry on screen is still looked at every pass. (left by the fix) -- [ ] Only a batch's record step stopped rebuilding the whole list from the whole queue. Every arrival (`EnqueueInline`), settle and single accept still does, under the lock: a dictionary of the queue, two orderings and a key an entry. The order is now worked out once a change rather than twice, and a key once an entry. (left by the fix) -- [ ] The bulk discards are still one transition on the render thread: `DiscardGroup` and `DiscardAll` delete each received file under the lock. A discard waits on nothing, so they were left. (left by the fix) -- [ ] A snapshot discarded, or settled by a test that started passing, while its own source file is being written by a bulk accept was handed over with the rest of the file and is written with them. It is not counted, and a discard still takes it out of the queue. Before, that moment was the snapshot's own apply rather than its file's. Closing it would take the applier asking, before its one write, which of the patches are still wanted. (left by the fix) -- [ ] Both sides of a document are drawn at once, and four things about that are as they are for a reason and could be better: a drawing is not stopped when the reader leaves its entry, though between two pages of a PDF it now could be; the pages of a PDF that is put back because the other side stopped inside PDFium are dropped, and drawn again once PDFium is free; a PDF pair's right side waits for the left's first page, which is what lets the two be told apart when both stop; and `Withdrawn`, which takes a rendering back out of the state, lives in `DocumentWatch` where it belongs beside `ViewerSession.Rendered`. (left by the fix) -- [ ] Which of two PDFs stopped inside PDFium is inferred from whose pages stopped first, not known. A thread descheduled between landing a page and asking for the lock, at the moment the other side hangs, would have the innocent side given up on and the culprit put back. (left by the fix) - -### Library - -- [ ] The listener table is every connection the machine has, filtered, so reading it grows with them: 0.45 ms at 86 connections and 7.9 ms at 3,102. `ViewerClient` skips it for a port that answered in the last second; `PiperClient.PortIsHeld` reads it on every send, as it did before. A listener-only table by P/Invoke would not grow. (left by the fix) -- [ ] `RecheckUnownedAfter` is still ten minutes, though a recheck on Windows is now a read of the table rather than two seconds, and could come down. (left by the fix) -- [ ] Off Windows the connect is still the only question asked, since a refusal there is immediate. Whether the table reads as empty under WSL1 was not checked. (left by the fix) -- [ ] `PiperClient.PortIsHeld` now takes any exception from the table as "may be held", where it took two kinds. (left by the fix) - -### Inline snapshots - -- [ ] Lexing is still once a patch, in a batch as well: each patch is applied to what the one before it left, and one scan for all of them would not give the outcomes of applying in turn. 500 patches to a 600 KB file are 0.8 s of patching around one write. (left by the fix) -- [ ] `CanAnchor` still reads and lexes the whole file for each call site a run has not seen before: 0.7 s for 500 call sites in the 600 KB file. (left by the fix) -- [ ] A batch's one write that fails fails every patch from the first edit on, including one judged already applied or not found after it, and the file's mutex is held from the read to the write. (left by the fix) -- [ ] A `VerifyInline` directory another process creates can be found up to a second late by `InlineStaging.Clear`. (left by the fix) -- [ ] Two Windows-only tests assert that a send to a free port returns in under a second, where the refusal it avoids takes two. (left by the fix) - -### Viewer, Windows head - -- [ ] Between half its own size and its own size an enlarged picture is still scaled on every paint: 15 ms for a 4000 by 3000 pair at 400%. A copy there would cost up to the decoded picture again, 96 MB for that pair. Decoding premultiplied (`Format32bppPArgb` in `ImageCache.Load`) measured 9 ms, and was left out because it moves translucent pixels by one level in five pixel scenes. (left by the fix) -- [ ] A picture drawn from its scaled copy sits on whole pixels, up to half a pixel from its exact placement, so two pictures of different sizes can be a pixel apart relative to each other while zoomed below half size. (left by the fix) -- [ ] `Uncomposable` is a picture's rather than a size's, so a scale that failed also stops the fitted copy being made again at a new size. (left by the fix) -- [ ] `RowText.Shown`'s tests are in `DiffEngineViewer.Windows.Tests`, beside its one caller. They belong beside `CellGridTests`. (left by the fix) -- [ ] One of the fixes changes what is drawn. A character of two UTF-16 units whose first column of pixels is its pane's last, an emoji at the very edge, used to be cut to nothing and is now drawn. (left by the fix) - -### Viewer, Linux head - -- [ ] An idle window still turns sixty times a second. Each turn compares the screen's bytes with the last one's, asks after the files behind the pictures on it and waits out its sixtieth: 3 to 9 ms of processor a second, where it was half a second to ten. Waiting on the window system instead would take the managed loop, which also asks after its owner and its files each turn, being told when to wake. (left by the fix) -- [ ] What is not built rests on the list of what a frame is built from being whole: the screen, the pointer, the keys, the window, the decoder, the font finder, a tooltip's delay and the files behind the pictures. Anything `BuildFrame` comes to read that is none of those has to be asked in `deview_present` before a window is left alone, or the window shows the frame before until something else arrives. A frame that is built and comes out the same is not drawn whatever it read, so that half needs no such care. (left by the fix) -- [ ] Nothing in `DiffEngineViewer.Tests` fails if the window goes back to drawing every frame. `NativeIdleBenchmarks` shows it, in its Drawn column, and is run by hand in the container. (left by the fix) -- [ ] A hidden window is still built and drawn when its screen changes, which an arrival in the queue does. (left by the fix) -- [ ] Run only under Xvfb with Mesa's software rasteriser, with no window manager and under openbox. Not on a GPU, under a compositor, on Wayland or over forwarded X, where what the window system keeps of a window that is not being drawn may differ, and where leaving one alone matters most. (left by the fix) -- [ ] `deview_capture` makes its ImGui context without `ImGuiBackendFlags_RendererHasVtxOffset`, which the window's declares, so a capture whose draw list passes 65,535 vertices comes out scrambled. The old checkerboard took a 4K capture of two large pictures past it, which is how it was found. Nothing captures at that size, and the checkerboard no longer takes a capture there, but dense text could. (left by the fix: ran, with the flag added to the shim from before the fix) - -### Viewer, macOS head - -- [ ] Neither macOS change has been compiled by a person or run at all. CI's `macos-14` job compiles them, and its captures draw text from the kept lines. Nothing there runs the clip test or the scaled copy. What would confirm each on a Mac: +- [ ] To confirm on a Mac, from the performance changes. Nothing on CI runs the clip test or the scaled copy: - The premise: break in `Renderer.draw` while a spinner turns and print `context.boundingBoxOfClipPath`. The spinner's 44 pt square, or the whole view. - - A turn: Time Profiler on a pair with a long PDF. `CTLineCreateWithAttributedString` under `Renderer.draw` for each turn: about 150 before, none after, whichever clip AppKit hands over. - - Text outside Latin: `--diff` two files of Chinese and hold Down. The same symbol for each frame: every character before, the new row alone after. - - An enlarged picture: `--diff` two 2880 by 1800 screenshots, `+` once, and drag. Time under `Renderer.enlarged` for each frame: a `.high` resample of both panes before, a blit after, and one 1560 by 975 bitmap a pane about a tenth of a second after the step. -- [ ] Since macOS 11 a view with an automatic backing store is handed its whole bounds whatever was invalidated, clip included, so the clip test is safe and probably leaves nothing out on any supported macOS. What makes a spinner's turn cheap there is the kept lines. Two routes would make the clip test pay: `layer.contentsFormat = .RGBA8Uint` in `viewWillDraw`, which changes how the whole window is stored, or a view of the spinner's own. (left by the fix: read, in Apple's developer forums) -- [ ] A byte-equal pair of documents names one page's png in both panes. With one scaled copy a picture and panes a point apart in width, `fitted` looks to make the copy again for each pane in turn without end. The enlarged path stays out of it by drawing such a pair from the picture. (left by the fix: read, not run) - - -## Smaller - -One of the smaller items is open: the macOS viewer opened with no console session. The rest are fixed and gone from this list. What follows is that item and what the fixes left. - -### Viewer model - -- [ ] The two tests that show a pair is not diffed again, and the one that bounds what reading a file allocates, were not run against the code from before the fix. (left by the fix) -- [ ] `TrackedWatch` still closes an open context menu when a file is written again with what it held, since the entry is replaced by its restamped copy through `ViewerSession.Refresh`. The reader is not moved. (left by the fix) - -### Library - -- [ ] Kept connections were not run on macOS: neither the rebind of a port whose last owner left a client holding a connection, nor the receive timeout surfacing as `SocketError.TimedOut`. And they were tested against a stand-in for an older owner, not a released tray or viewer. (left by the fix) -- [ ] A client talking to an owner from before `keeps` still makes a connection per settle, so the port exhaustion stands against an older tray. (left by the fix) -- [ ] The async inline send and every asking send (`TrySend` with a response, `InlineQueueClient`, `OwnerLink`'s five a second listing) are still a connection each. (left by the fix) -- [ ] A connect that fails because the machine has no ports left is still recorded as an unowned port. Which `SocketError` Windows gives there was not established. (left by the fix) -- [ ] Parallel settles take turns at the one connection under a lock, so a slow owner now holds them in a line, where each used to wait on a connection of its own. (left by the fix) -- [ ] A test process holds a socket to the queue's owner for its whole life. On .NET Framework sockets are inheritable, so a child a test starts without ShellExecute can hold that connection open after the test host exits. Not run. (left by the fix) -- [ ] The accept wait is a fixed 100 ms from the second failure in a row. The case where a failure persists was run on Linux only, by using up the descriptors. (left by the fix) -- [ ] Apple's `ps` was not run with `-ww`; its manual says a second `-w` uses as many columns as it needs. (left by the fix) - -### Inline snapshots - -- [ ] Verify's half of the Remove applied twice is not done: skipping the Remove when the source file is newer than the test assembly. DiffEngine's half keeps the removed call's line, empty, when a Snapshot call is under it, which is a rule about the next line and not a guarantee about line numbers. (left by the fix) -- [ ] A `Remove` that takes a whole statement line (`settings.Snapshot("dup");`) still brings the next line up, so applied twice over a sibling `other.Snapshot("dup");` the second apply takes the sibling's statement. `RemovedAtHint` only recognises a removal under a verify call. (left by the fix: read, not run) -- [ ] An empty `TestName` or `MemberName` still reads back as null from `InlinePatchFile`; only `OriginalValue` gained a line saying it is present and empty. (left by the fix) -- [ ] The F# scanner outside a comment still takes a tick after an identifier character as part of the name, and still reads the holes of `$"..."` its own way. Only comments and backticked names were held to `dotnet fsi`. (left by the fix) - -### Tray - -- [ ] A process id is matched to the payload's `Exe` by file name only, so a reused id now held by another copy of the same tool is still tracked, and killed on accept if the move can be killed. (left by the fix) -- [ ] A tool started through a `.cmd` (VS Code, Rider) is never tracked as a process, so it never counts for "Accept all open" and is never closed by the tray. Before, the id held for it was the command interpreter's. Nor is a tool whose launcher hands over to an executable of another name and exits. The tool definitions were not surveyed for either. (left by the fix) -- [ ] "Discard (n)" still discards tracked moves on the UI thread, with up to 500 ms per killable tool waiting for it to exit. Only the queue's half moved to a worker, and a bulk discard that fails is only logged. (left by the fix) -- [ ] A scan that keeps failing is now only in the log. Nothing tells the user. (left by the fix) -- [ ] `ListingTag` can answer "unchanged" for a listing built while a move was briefly out of the dictionary during an accept and then restored. The fingerprint it replaced had the same gap. (left by the fix) -- [ ] `Tracker.differing` is never pruned when a move leaves. (left by the fix: noticed, not touched) -- [ ] `KeyRegisterTests` registers a real global hot key, Ctrl+Alt+Shift+F24, for the length of each test, and fails where something else holds it. (left by the fix) - -### Viewer, Windows head - -- [ ] A minimised window slows only its own frame wait. `OwnerLink`, `TrackedWatch` and the document reader go by `Hidden`, which only a Hide command sets, so they keep their on screen cadence while minimised. The head would have to tell the loop. (left by the fix) -- [ ] A status that does not fit still loses what is past two lines; it now ends in an ellipsis and shows whole in a tooltip. The footer does not wrap its buttons or give the status a line of its own as the other two heads do. Whether a scaled display shows the middle of a wrapped status, which the item claimed and unscaled captures did not show, is unchecked. (left by the fix) -- [ ] Nothing proves by throwing that an exception comes out of a message pump in the test hosts rather than WinForms' dialog. The test reads the mode back instead, through an internal of WinForms, because the throwing one is what put the dialog on screen. (left by the fix) -- [ ] `TwoKeysInOnePumpAreTwoCommands`, `ATextEntryHasNoPictureForTheWheelToFind` and `TheWheelOverAPictureZoomsAndOverTheRowsScrolls` failed once in a run of the whole solution and passed in the next and twice alone. They post keys and wheel turns to a form, and someone was using the machine. (seen once) -- [ ] Footer buttons leave `UseMnemonic` on, so an ampersand in a label would become an Alt access key. (left by the fix: noticed, not looked into) - -### Viewer, Linux head - -- [ ] A picture larger than `GL_MAX_TEXTURE_SIZE` now draws as nothing. It could be reduced on the decoder thread to fit a texture. `PixelTests.ImageTooLargeForATexture` holds only under llvmpipe, whose limit is 16384. (left by the fix) -- [ ] A held letter repeats its command at the keyboard's repeat rate, so holding `a` accepts repeatedly. Only navigation should repeat. The Windows head now drops those repeats. (left by the fix) -- [ ] Display scale is read once, as the window is made. A change of `Xft.dpi` while running, and a scale per monitor under Wayland or XWayland, are not followed, and a placement remembered at one scale is used in pixels at another. Checked only under Xvfb with an X resource at 144 and 192, never on a HiDPI desktop. (left by the fix) -- [ ] A frame of two pictures costs about a tenth more under llvmpipe (opaque at 4K, 27.0 ms to 30.1), probably the trilinear sampling of a picture drawn under half size. Mipmaps also add about a third to a picture's memory, drawn small or not. (left by the fix: measured, cause unconfirmed) -- [ ] `[`, `]`, `0`, `-` and `=` have no fallback by position on a layout that is not Latin; only the letters do. (left by the fix) -- [ ] All input now comes through GLFW's callbacks. A release that never arrives would leave a button held: GLFW's own release on losing focus is relied on, and hiding the window during a press was not tried. A two finger tap on a real touchpad is still unconfirmed; a press and release sent together now works. (left by the fix) - -### Viewer, macOS head - -- [ ] `Runtime.open` cannot fail (it always returns true), so with no console session, as over SSH, AppKit aborts the process after the port was bound and the patch is lost. `CGSessionCopyCurrentDictionary()` is the documented question to ask, and was not used because it may also answer "no session" over SSH while the same user is logged in at the console, where the viewer opens today. What would settle it: print that call from an SSH shell with and without a console login, and run the viewer in each. (reported: plausible) -- [ ] None of the six macOS fixes in this round has been compiled or run by a person, and five are event handling or window state that no capture exercises. The check to make on a Mac is in each commit's message. (left by the fix) -- [ ] A drag still pulls the other pane's centre into the dragged pane's range on an axis both can move on, when the two pictures differ in shape. Only the axis the dragged pane cannot move on is left alone. The Linux head has the same rule. (left by the fix) -- [ ] A hidden, miniaturised or covered window comes forward up to a tenth of a second late for a patch arriving over the socket, since the managed side cannot interrupt the pump, and `OwnerLink` and `TrackedWatch` do not slow for a window that is only covered or miniaturised. Both need the ABI to carry it. During a scroll or a drag the loop now turns at the rate events arrive, which a 120 Hz device makes faster than sixty. (left by the fix) -- [ ] `+`, `-` and `=` are still matched on `charactersIgnoringModifiers`; only the brackets moved to `characters`. (left by the fix) -- [ ] A control-click over a footer button now does nothing, as a right click does, where it used to click the button. (left by the fix) + - A turn: Time Profiler on a pair with a long PDF. No `CTLineCreateWithAttributedString` under `Renderer.draw` for a turn, whichever clip AppKit hands over. + - Text outside Latin: `--diff` two files of Chinese and hold Down. The same symbol for each frame: the new row alone. + - An enlarged picture: `--diff` two 2880 by 1800 screenshots, `+` once, and drag. Time under `Renderer.enlarged` for each frame: a blit, and one 1560 by 975 bitmap a pane about a tenth of a second after the step. +- [ ] To confirm on a Mac, from the smaller fixes: the six changes that redraw a window when a picture lands in a partial draw, match the page keys by the character typed, leave the other pane's pan alone, stop redrawing a window with no room for its picture, take a wheel's click and a control-click, and return from the pump on input. Five are event handling or window state that no capture exercises. The check for each is in its commit's message. +- [ ] A live resize still draws the rows sliced for the old size until the mouse comes up. It needs a frame callback in the C ABI. A press in the scroller's slot followed by a drag is still AppKit's loop too. +- [ ] The managed side still slices the body for a footer of one row. This head has 64 pt to spare, which is three rows of buttons or two and a status line; past that the last one or two body rows are not drawn. +- [ ] Every auto-repeat of a held `a` or `d` is handed over, including ones queued during a stall. `event.isARepeat` would drop them, as the Windows head does. +- [ ] The title row has the footer's old shape: the subtitle is drawn over a long title. +- [ ] Since macOS 11 a view with an automatic backing store is handed its whole bounds whatever was invalidated, clip included, so the clip test probably leaves nothing out on any supported macOS. Two routes would make it pay: `layer.contentsFormat = .RGBA8Uint` in `viewWillDraw`, which changes how the whole window is stored, or a view of the spinner's own. (read, in Apple's developer forums) +- [ ] A byte-equal pair of documents names one page's png in both panes. With one scaled copy a picture and panes a point apart in width, `fitted` looks to make the copy again for each pane in turn without end. The enlarged path stays out of it by drawing such a pair from the picture. (read, not run) +- [ ] A drag still pulls the other pane's centre into the dragged pane's range on an axis both can move on, when the two pictures differ in shape. Only the axis the dragged pane cannot move on is left alone. The Linux head has the same rule. +- [ ] A hidden, miniaturised or covered window comes forward up to a tenth of a second late for a patch arriving over the socket, since the managed side cannot interrupt the pump, and `OwnerLink` and `TrackedWatch` do not slow for a window that is only covered or miniaturised. Both need the ABI to carry it. During a scroll or a drag the loop turns at the rate events arrive, which a 120 Hz device makes faster than sixty. +- [ ] `+`, `-` and `=` are still matched on `charactersIgnoringModifiers`; only the brackets are matched on `characters`. From 74035866e67302b74b78e6e5925fa532d1b573a0 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:45:27 +1100 Subject: [PATCH 02/50] Take one press for each accept or discard in the macOS viewer, however long the key is held A held key repeats, and ViewerView.keyDown queued every repeat. For Down that is the point. For a, A and d it accepted or discarded the entry on screen and then each one that took its place, none of them read, and repeats queued while a frame was slow were still handed over after the key came up. keyDown now drops an event that is a repeat (NSEvent.isARepeat) when the key it maps to is accept, accept all or discard: the three of ViewerSession.ChangesQueue that a key can be in this head. The WinForms head does the same in ProcessCmdKey. Every other key repeats as before, and the menu bar's items do not come through keyDown. Not compiled and not run: nothing on the machine this was written on can build Swift against AppKit. CI's macos-14 job compiles it, and no capture exercises a key. To check on a Mac: with five or more entries queued, hold a for two seconds. One entry is accepted, where every entry was. The same for d and for shift+a. Hold Down in a long file: the panes keep scrolling. --- native/swift/Sources/Deview/ViewerView.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/native/swift/Sources/Deview/ViewerView.swift b/native/swift/Sources/Deview/ViewerView.swift index 7bb6d336..5dd8b379 100644 --- a/native/swift/Sources/Deview/ViewerView.swift +++ b/native/swift/Sources/Deview/ViewerView.swift @@ -395,9 +395,27 @@ final class ViewerView: NSView, NSViewToolTipOwner { return } + // A key held past the repeat delay arrives again many times a second, and each one is + // queued. That is what a held Down is for. A held a accepted the entry on screen and then + // every one that took its place, into source, none of them read, and the ones queued + // while a frame was slow were still handed over after the key came up. So what changes + // the queue takes a press each, as it does in the WinForms head. Swallowed rather than + // passed on: it is still this key. + if event.isARepeat, ViewerView.changesQueue(key) { + return + } + Runtime.shared.post(.key(key)) } + /// The keys that act on the queue rather than on the view: the ones of + /// `ViewerSession.ChangesQueue` that a key here can be. + private static func changesQueue(_ key: Int32) -> Bool { + key == DEVIEW_KEY_ACCEPT.value || + key == DEVIEW_KEY_ACCEPT_ALL.value || + key == DEVIEW_KEY_DISCARD.value + } + /// Matches ReadKey in deview.cpp and the WinForms head's Map, which is the keymap the docs /// publish. private static func map(_ event: NSEvent) -> Int32 { From 4ca18821b2b274961c57c8f9e7fc2488612fed49 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:45:45 +1100 Subject: [PATCH 03/50] Match the macOS viewer's zoom keys on what was typed, as the brackets are Plus, minus and equals were matched only on charactersIgnoringModifiers, which is the key with Option left out. On a layout that has one of them behind Option that is the digit or letter printed on the key, so the reader could not zoom from the keyboard. The brackets were moved to `characters` last round for the same reason, and these three now sit beside them in that switch. The matches on charactersIgnoringModifiers below stay, so nothing that zoomed stops: both readings keep Shift, so on a US layout equals unshifted, plus with Shift held and minus arrive as themselves either way. The command and control chords are left on charactersIgnoringModifiers, since `characters` with control held is a control character. Not compiled and not run: nothing on the machine this was written on can build Swift against AppKit. CI's macos-14 job compiles it, and no capture exercises a key. To check on a Mac: on the US layout, over a picture pair, = zooms in, shift+= zooms in, - zooms out and 0 fits, as before. Then add a layout that has plus, minus or equals behind Option, type it there, and it zooms where it did nothing. --- native/swift/Sources/Deview/ViewerView.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/native/swift/Sources/Deview/ViewerView.swift b/native/swift/Sources/Deview/ViewerView.swift index 5dd8b379..cb000241 100644 --- a/native/swift/Sources/Deview/ViewerView.swift +++ b/native/swift/Sources/Deview/ViewerView.swift @@ -468,11 +468,19 @@ final class ViewerView: NSView, NSViewToolTipOwner { // was. German, French, Nordic, Spanish and Italian layouts have them behind Option, and // with the modifiers left out the key is the digit or the letter printed on it, so those // readers could not turn a page from the keyboard. + // + // The zoom keys the same way, for a layout that has one of them behind Option. Shift is + // no part of this: it is kept by both readings, so equals unshifted and plus with shift + // held are each what was typed on a US keyboard, and each zooms in, as they did. switch event.characters { case "[": return DEVIEW_KEY_PREVIOUS_PAGE.value case "]": return DEVIEW_KEY_NEXT_PAGE.value + case "=", "+": + return DEVIEW_KEY_ZOOM_IN.value + case "-": + return DEVIEW_KEY_ZOOM_OUT.value default: break } From 682d0c1b625161f40c011ce0625a91a230486f12 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:46:18 +1100 Subject: [PATCH 04/50] Stop a long title a character short of the subtitle in the macOS viewer The title was drawn across the whole row and the subtitle over its right hand end, so a title long enough to reach it was two texts on top of one another, and neither could be read there. A deep path in a narrow window does it. Renderer.draw now gives a title that would run on under the subtitle the row up to one cell before it, and the text is clipped there. The title gives way, as it does in the Linux head: what it says is also in the pane headers and the queue, and which entry this is is said only by the subtitle. A title that fits beside its subtitle is handed the same rect as before, so it is drawn as it was. That is every capture: the widest title in the ten macOS pixel scenes is 42 cells and its subtitle 4, in a row of 120. Widths are counted in cells, as the footer's are, so a title of characters a fallback font draws wider than a cell can still reach the subtitle when the count says it fits. Not compiled and not run: nothing on the machine this was written on can build Swift against AppKit. CI's macos-14 job compiles it and its captures show the title row unchanged. To check on a Mac: `DiffEngineViewer --diff` two files whose names are sixty characters each, and narrow the window. The title stops one character before "diff", where it ran on under it. --- native/swift/Sources/Deview/Renderer.swift | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/native/swift/Sources/Deview/Renderer.swift b/native/swift/Sources/Deview/Renderer.swift index d373f9bf..095b722c 100644 --- a/native/swift/Sources/Deview/Renderer.swift +++ b/native/swift/Sources/Deview/Renderer.swift @@ -407,10 +407,18 @@ final class Renderer { let panesWidth = max(cell.width * 2, content - Renderer.padding - panesLeft) let half = (panesWidth / 2).rounded(.down) - text(frame.title, in: rect(top: Renderer.padding, left: Renderer.padding, width: size.width - Renderer.padding * 2, height: line, size), Palette.text, context) + // A title that would run on under the subtitle stops a character short of it, where the + // subtitle used to be drawn over whatever of the title had got that far. It is the title + // that gives way, as in the Linux head: what it says is also in the pane headers and the + // queue, and which entry of the queue this is is said only by the subtitle. One that fits + // has the whole row, as it always had, so it is drawn exactly as it was. + let titleWidth = size.width - Renderer.padding * 2 + let subtitleWidth = CGFloat(frame.subtitle.count) * cell.width + let runsUnder = !frame.subtitle.isEmpty && CGFloat(frame.title.count) * cell.width > titleWidth - subtitleWidth + let titleRoom = runsUnder ? titleWidth - subtitleWidth - cell.width : titleWidth + text(frame.title, in: rect(top: Renderer.padding, left: Renderer.padding, width: titleRoom, height: line, size), Palette.text, context) if !frame.subtitle.isEmpty { - let width = CGFloat(frame.subtitle.count) * cell.width - text(frame.subtitle, in: rect(top: Renderer.padding, left: size.width - Renderer.padding - width, width: width, height: line, size), Palette.dim, context) + text(frame.subtitle, in: rect(top: Renderer.padding, left: size.width - Renderer.padding - subtitleWidth, width: subtitleWidth, height: line, size), Palette.dim, context) } let firstRule = Renderer.padding + line + Renderer.gap From fdb69a2b3979181fa19e33fa61edeb2e7dcff52c Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:47:00 +1100 Subject: [PATCH 05/50] Keep a scaled copy for each pane when both panes of the macOS viewer name one picture A byte equal pair of documents names one page's png in both panes, since pages are kept under the document's hash. The left pane is half the panes' width rounded down and the right one the rest, so they can be a point apart, and a page fitted to its pane's width is then asked for at two sizes. Renderer kept one scaled copy a picture. Read through, that does not settle: the left pane's copy lands and is a redraw, in which the right pane finds the copy is not its size and asks for its own; that lands and is a redraw, in which the left pane asks again. A scale of the page on the work queue and a redraw of the window, for as long as the pair is on screen. A picture both panes name now keeps the last two copies made: when a copy lands, the one it takes the place of goes into Picture.spare rather than away, and `fitted` looks there after `scaled`. Two sizes are asked for, so that is one each, and nothing is asked for again until the window is resized. A picture only one pane names keeps one copy, as before. A capture is unchanged. It scales there and then for each pane and writes only `scaled`, as it did, and none of the macOS pixel scenes has one picture in both panes. The enlarged path still draws such a pair from the picture. Not compiled and not run: nothing on the machine this was written on can build Swift against AppKit. The loop was found by reading, and so was its end. CI's macos-14 job compiles this and its captures do not reach it. To check on a Mac: `DiffEngineViewer --diff a.pdf b.pdf` with b a copy of a, and drag the window's edge a point at a time until the page fills its pane's width. In Instruments, CGContextDrawImage under Renderer.scale on the pictures queue: called without end before, twice a resize after. CPU for the process falls to nothing once the window is left alone. --- native/swift/Sources/Deview/Renderer.swift | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/native/swift/Sources/Deview/Renderer.swift b/native/swift/Sources/Deview/Renderer.swift index 095b722c..d6e49e26 100644 --- a/native/swift/Sources/Deview/Renderer.swift +++ b/native/swift/Sources/Deview/Renderer.swift @@ -70,10 +70,16 @@ final class Renderer { private var dirty: CGRect? /// Both panes name the one picture in the draw in progress, as a byte equal pair of documents - /// does: their pages are kept under the hash of the document. There is one scaled copy a - /// picture and the two panes can be a point apart in width, so each would have the copy made - /// for its own size in turn, without end. An enlarged pair is not given the chance: it is - /// drawn from the picture, as every enlarged picture was before it had a copy. + /// does: their pages are kept under the hash of the document. The two panes can be a point + /// apart in width, and so can ask for copies of different sizes. With one copy a picture each + /// had it made for its own size in turn, without end: every one that landed was a redraw, in + /// which the other pane found the copy was not its own and asked again. So a picture both + /// panes name keeps the last two copies made, which is one for each: see `Picture.spare`. + /// An enlarged pair makes none: it is drawn from the picture, as every enlarged picture was + /// before it had a copy. + /// + /// As the last draw to begin left it. `settle` reads it for a copy that has landed, which + /// was asked for by that draw or by one before it. private var shared = false /// Decoded pictures, keyed by the path the screen model handed over and invalidated by the @@ -105,6 +111,10 @@ final class Renderer { /// goes when a copy for another size lands, and with the picture. var scaled: CGImage? + /// The copy `scaled` took the place of, kept only while both panes name this picture: see + /// `shared`. Each pane then has the copy made for its own size, one here and one there. + var spare: CGImage? + /// Being decoded on `work`. The pane shows a spinner until it lands. var decoding = false @@ -1057,6 +1067,14 @@ final class Renderer { return scaled } + // The other of the two copies a picture in both panes keeps, which is this pane's when + // the last one to land was made for the other + if let spare = entry.spare, + spare.width == width, + spare.height == height { + return spare + } + let size = Pixels(width: width, height: height) if capturing { guard let scaled = Renderer.scale(picture, to: size) else { @@ -1153,6 +1171,10 @@ final class Renderer { entry.scaling = nil if let image { + // The copy this one takes the place of is the other pane's, when both panes + // name the picture, and is kept for it. Otherwise it was made for a size + // the pane no longer has, and goes. + entry.spare = shared ? entry.scaled : nil entry.scaled = image } else { entry.unscalable = true From e5a2e7f987c65210bde7ff400d9599690be6561e Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:59:37 +1100 Subject: [PATCH 06/50] Keep holding a delete whose file an accepted move wrote, and say why A delete and a move pending on the same verified file are only tracked together when the delete arrived second, and an accept-all then carries out the move and leaves the delete. But the sweep forgot why as it ended: the delete stayed in the menu looking like any other, with a log line as the only account of it, and pressing "Accept all" again deleted the snapshot the first press had just accepted. Accepting the move from its own item and then pressing "Accept all" lost the file the same way, with no sweep having held anything. The reason is now on the delete. A move that writes a file marks the delete pending on it, whichever way the move was accepted, and no accept-all, from the menu, a hot key or the wire, carries a marked delete out. Accepting the delete on its own still does, from its item, the header over the deletes or its key over the wire. A test run that raises the delete again clears the mark, since that run looked at the file the move wrote. A delete waiting on a move that is still pending is held as before, for as long as the move is there. The user is told in a balloon when a sweep keeps one, and the menu marks the delete with "!" and carries the reason on the item and in its tip, as a snapshot that was not written does. The debug view has a Held field for it. Checked by TrackerMoveOntoDeleteTest (ASecondAcceptAllStillHoldsTheDelete, AMoveAcceptedOnItsOwnHoldsTheDeleteFromALaterAcceptAll, ASecondWireSweepStillHoldsTheDelete and TheDebugViewSaysWhyADeleteIsHeld fail without the fix, the first three by the file being deleted) and by MenuBuilderTest.ADeleteAcceptAllWouldKeepCarriesItsReason, which builds the items without opening the menu. --- src/DiffEngineTray.Tests/MenuBuilderTest.cs | 69 +++++++++ .../TrackerMoveOntoDeleteTest.cs | 137 ++++++++++++++++++ src/DiffEngineTray/DebugReport.cs | 5 + src/DiffEngineTray/MenuBuilder.cs | 29 +++- src/DiffEngineTray/TrackedDelete.cs | 9 +- src/DiffEngineTray/Tracker.cs | 96 ++++++++++-- 6 files changed, 330 insertions(+), 15 deletions(-) diff --git a/src/DiffEngineTray.Tests/MenuBuilderTest.cs b/src/DiffEngineTray.Tests/MenuBuilderTest.cs index 9498db5a..b78d8469 100644 --- a/src/DiffEngineTray.Tests/MenuBuilderTest.cs +++ b/src/DiffEngineTray.Tests/MenuBuilderTest.cs @@ -99,6 +99,75 @@ public async Task SnapshotThatWasNotWrittenCarriesItsReason() menu.Close(); } + /// + /// A delete "Accept all" passes over, because a move was accepted onto its file. It was listed + /// like every other delete, under a button that had just been pressed without removing it, and + /// only the log said why. Marked and given its reason the way a snapshot that was not written + /// is. + /// + /// The items are built without the menu being opened, so nothing is put on the desktop. + /// + /// + [Test] + public async Task ADeleteAcceptAllWouldKeepCarriesItsReason() + { + var directory = Path.Combine(Path.GetTempPath(), $"MenuBuilderTest_{Guid.NewGuid():N}"); + var staged = Path.Combine(directory, "staged"); + Directory.CreateDirectory(staged); + try + { + var received = Path.Combine(staged, "Sample.Test.received.txt"); + var verified = Path.Combine(directory, "Sample.Test.verified.txt"); + var plain = Path.Combine(directory, "Plain.verified.txt"); + await File.WriteAllTextAsync(received, "received"); + await File.WriteAllTextAsync(verified, "verified"); + await File.WriteAllTextAsync(plain, "plain"); + await using var tracker = new RecordingTracker(); + tracker.AddMove(received, verified, "theExe", "theArguments", true, null); + tracker.AddDelete(verified); + tracker.AddDelete(plain); + await tracker.AcceptAll(); + // The plain delete went with the sweep, and is tracked again for something to compare + await File.WriteAllTextAsync(plain, "plain"); + tracker.AddDelete(plain); + + var items = MenuBuilder.BuildTrackingMenuItems(tracker).ToList(); + try + { + var deletes = items + .OfType() + .ToList(); + var held = deletes.Single(_ => _.Text!.StartsWith("Sample.Test.verified.txt")); + await Assert.That(held.Text).IsEqualTo("Sample.Test.verified.txt !"); + await Assert.That(held.ToolTipText).IsEqualTo(Tracker.WroteItsFile); + var label = held.DropDownItems + .OfType() + .Single(_ => !_.Enabled); + await Assert.That(label.ToolTipText).IsEqualTo(Tracker.WroteItsFile); + await Assert.That(label.Text!.Length).IsLessThanOrEqualTo(60); + await Assert.That(label.Text).StartsWith("Kept by 'Accept all': a move was accepted onto this file"); + + var other = deletes.Single(_ => _.Text!.StartsWith("Plain.verified.txt")); + await Assert.That(other.Text).IsEqualTo("Plain.verified.txt"); + await Assert.That(other.DropDownItems + .OfType() + .Where(_ => !_.Enabled)) + .IsEmpty(); + } + finally + { + foreach (var item in items) + { + item.Dispose(); + } + } + } + finally + { + Directory.Delete(directory, true); + } + } + /// /// The same item with its drop down open, which is where the reason lives. The menu images /// elsewhere in this file stop at the top level and show only the marker, so nothing here saw diff --git a/src/DiffEngineTray.Tests/TrackerMoveOntoDeleteTest.cs b/src/DiffEngineTray.Tests/TrackerMoveOntoDeleteTest.cs index b7054513..bcc9b7ad 100644 --- a/src/DiffEngineTray.Tests/TrackerMoveOntoDeleteTest.cs +++ b/src/DiffEngineTray.Tests/TrackerMoveOntoDeleteTest.cs @@ -76,6 +76,143 @@ public async Task AcceptAllHoldsADeleteOfTheFileItsMoveJustWrote() await Assert.That(tracker.Deletes.Select(_ => _.File)).IsEquivalentTo([verified]); } + /// + /// The sweep that held the delete forgot why as it ended. The delete sat in the menu looking + /// like any other, and pressing "Accept all" again, which is what a delete still listed after + /// an accept-all invites, deleted the snapshot the first press had just accepted. + /// + [Test] + public async Task ASecondAcceptAllStillHoldsTheDelete() + { + var warnings = new ConcurrentQueue(); + await using var tracker = new RecordingTracker(inlineFailed: warnings.Enqueue); + tracker.AddMove(received, verified, "theExe", "theArguments", true, null); + var delete = tracker.AddDelete(verified); + await tracker.AcceptAll(); + + await tracker.AcceptAll(); + + await Assert.That(await File.ReadAllTextAsync(verified)).IsEqualTo("received"); + await Assert.That(tracker.Deletes.Select(_ => _.File)).IsEquivalentTo([verified]); + await Assert.That(tracker.HeldReason(delete)).IsEqualTo(Tracker.WroteItsFile); + // Said each time, since each press was an accept-all that left something undone + await Assert.That(warnings).IsEquivalentTo( + [ + Tracker.DeletesKept([delete]), + Tracker.DeletesKept([delete]) + ]); + } + + /// + /// The same loss with no sweep in the first half of it: the move accepted from its own menu + /// item, and then "Accept all" for what was left. + /// + [Test] + public async Task AMoveAcceptedOnItsOwnHoldsTheDeleteFromALaterAcceptAll() + { + await using var tracker = new RecordingTracker(); + var move = tracker.AddMove(received, verified, "theExe", "theArguments", true, null); + tracker.AddDelete(verified); + tracker.Accept(move); + + await tracker.AcceptAll(); + + await Assert.That(await File.ReadAllTextAsync(verified)).IsEqualTo("received"); + await Assert.That(tracker.Deletes).HasSingleItem(); + } + + [Test] + public async Task ASecondWireSweepStillHoldsTheDelete() + { + await using var tracker = new RecordingTracker(); + ITrackedFiles tracked = tracker; + tracker.AddMove(received, verified, "theExe", "theArguments", true, null); + tracker.AddDelete(verified); + tracked.AcceptAllTracked(holdDeletes: false); + + var (accepted, kept) = tracked.AcceptAllTracked(holdDeletes: false); + + await Assert.That(accepted).IsEqualTo(0); + await Assert.That(kept).IsEqualTo(1); + await Assert.That(await File.ReadAllTextAsync(verified)).IsEqualTo("received"); + } + + /// + /// Held from a sweep, and no more than that. Whoever knows the file is redundant accepts the + /// delete itself, from its own item or from the header over the deletes, or over the wire by + /// its key. + /// + [Test] + public async Task AHeldDeleteIsCarriedOutWhenAcceptedOnItsOwn() + { + await using var tracker = new RecordingTracker(); + tracker.AddMove(received, verified, "theExe", "theArguments", true, null); + var delete = tracker.AddDelete(verified); + await tracker.AcceptAll(); + + tracker.Accept(delete); + + await Assert.That(File.Exists(verified)).IsFalse(); + await tracker.AssertEmpty(); + } + + /// + /// A test run that raises the delete again has looked at the file the move wrote and still + /// says nothing produces it. That is the later statement, and the next sweep carries it out. + /// + [Test] + public async Task ADeleteRaisedAgainAfterTheWriteIsCarriedOut() + { + await using var tracker = new RecordingTracker(); + tracker.AddMove(received, verified, "theExe", "theArguments", true, null); + var delete = tracker.AddDelete(verified); + await tracker.AcceptAll(); + + tracker.AddDelete(verified); + await Assert.That(tracker.HeldReason(delete)).IsNull(); + await tracker.AcceptAll(); + + await Assert.That(File.Exists(verified)).IsFalse(); + await tracker.AssertEmpty(); + } + + /// + /// A delete waiting on a move that is still pending is held for as long as the move is, and + /// no longer: discarded, the move is never going to write the file. + /// + [Test] + public async Task ADeleteWaitingOnAMoveIsCarriedOutOnceTheMoveIsDiscarded() + { + await using var tracker = new RecordingTracker(); + var move = tracker.AddMove(received, verified, "theExe", "theArguments", true, null); + var delete = tracker.AddDelete(verified); + await Assert.That(tracker.HeldReason(delete)).IsEqualTo(Tracker.AwaitsItsFile); + + tracker.Discard(move); + await Assert.That(tracker.HeldReason(delete)).IsNull(); + await tracker.AcceptAll(); + + await Assert.That(File.Exists(verified)).IsFalse(); + await tracker.AssertEmpty(); + } + + /// + /// Where the reason is read by somebody who was not looking when the balloon went by: beside + /// the delete in the debug view, as it is in the menu. + /// + [Test] + public async Task TheDebugViewSaysWhyADeleteIsHeld() + { + await using var tracker = new RecordingTracker(); + tracker.AddMove(received, verified, "theExe", "theArguments", true, null); + tracker.AddDelete(verified); + await Assert.That(DebugReport.Build(tracker, DateTime.Now)).DoesNotContain(Tracker.WroteItsFile); + + await tracker.AcceptAll(); + + await Assert.That(DebugReport.Build(tracker, DateTime.Now)).Contains(Tracker.WroteItsFile); + } + /// /// The sweep a viewer displaying the tray's queue asks for, which has the same two halves in /// the same order. diff --git a/src/DiffEngineTray/DebugReport.cs b/src/DiffEngineTray/DebugReport.cs index 2e5cec88..0107d67c 100644 --- a/src/DiffEngineTray/DebugReport.cs +++ b/src/DiffEngineTray/DebugReport.cs @@ -48,6 +48,11 @@ public static string Build(Tracker tracker, DateTime now) AppendEntry(builder, index, delete.Name); AppendField(builder, "File", WithExistence(delete.File)); AppendField(builder, "Group", delete.Group); + // Only where there is one: why "Accept all" would leave this delete pending + if (tracker.HeldReason(delete) is { } held) + { + AppendField(builder, "Held", held); + } } AppendHeading(builder, "Moves", moves.Count); diff --git a/src/DiffEngineTray/MenuBuilder.cs b/src/DiffEngineTray/MenuBuilder.cs index 5ccf82d8..6b55b5ce 100644 --- a/src/DiffEngineTray/MenuBuilder.cs +++ b/src/DiffEngineTray/MenuBuilder.cs @@ -57,7 +57,7 @@ static List TrackingMenuItems(ToolStripItemCollection items, Hash .Where(_ => !fixedItems.Contains(_)) .ToList(); - static IEnumerable BuildTrackingMenuItems(Tracker tracker) + internal static IEnumerable BuildTrackingMenuItems(Tracker tracker) { // Read everything first and decide from the counts. TrackingAny is backed by the scan // cache, which drives the icon, and the snapshot half of it can be up to one scan behind @@ -163,7 +163,7 @@ static IEnumerable BuildMovesAndDeletes( Images.Delete); foreach (var delete in deletes) { - yield return BuildDelete(delete, () => tracker.Accept(delete)); + yield return BuildDelete(delete, tracker.HeldReason(delete), () => tracker.Accept(delete)); } } @@ -255,15 +255,34 @@ static string ForMenu(string name, string status) status = status[prefix.Length..]; } - return status.Length <= 60 ? status : $"{status[..59].TrimEnd()}…"; + return Shortened(status); } - static ToolStripDropDownButton BuildDelete(TrackedDelete delete, Action accept) + static string Shortened(string text) => + text.Length <= 60 ? text : $"{text[..59].TrimEnd()}…"; + + /// + /// Why "Accept all" leaves this delete pending, when it does. Marked and said the way a + /// snapshot that was not written is: a delete an accept-all had just passed over looked like + /// every other, and pressing "Accept all" again was the natural thing to try. + /// + static ToolStripDropDownButton BuildDelete(TrackedDelete delete, string? held, Action accept) { - var menu = new ToolStripDropDownButton($"{delete.Name}") + var marker = held == null ? "" : " !"; + var menu = new ToolStripDropDownButton($"{delete.Name}{marker}") { DropDownDirection = ToolStripDropDownDirection.Left }; + if (held != null) + { + menu.ToolTipText = held; + menu.DropDownItems.Add(new ToolStripMenuItem(Shortened(held)) + { + Enabled = false, + ToolTipText = held + }); + } + menu.DropDownItems.Add(new MenuButton("Accept delete", accept)); menu.DropDownItems.Add(BuildShowInExplorer(delete.File)); return menu; diff --git a/src/DiffEngineTray/TrackedDelete.cs b/src/DiffEngineTray/TrackedDelete.cs index ac490531..eafd0322 100644 --- a/src/DiffEngineTray/TrackedDelete.cs +++ b/src/DiffEngineTray/TrackedDelete.cs @@ -10,4 +10,11 @@ public TrackedDelete(string file, string? group) public string Name { get; } public string File { get; } public string? Group { get; } -} \ No newline at end of file + + /// + /// Set once a move has written this file while the delete was pending, and from then on no + /// accept-all carries the delete out: see . Cleared when a + /// test run raises the delete again, which is a statement made after the write. + /// + public bool Written { get; set; } +} diff --git a/src/DiffEngineTray/Tracker.cs b/src/DiffEngineTray/Tracker.cs index 814841bf..9f1ee5a3 100644 --- a/src/DiffEngineTray/Tracker.cs +++ b/src/DiffEngineTray/Tracker.cs @@ -469,7 +469,14 @@ Task AcceptSnapshotsThenDeletes(List pending, HashSet wri { if (!SweepSnapshots(out var failure)) { - AcceptDeletes(pending, written); + // Said, as the deletes held for a snapshot are below. Only the log knew, so + // the menu went on listing a delete "Accept all" had just been pressed over + // with nothing to say it had been left on purpose + var kept = AcceptDeletes(pending, written); + if (kept.Count > 0) + { + failure = failure is null ? DeletesKept(kept) : $"{failure} {DeletesKept(kept)}"; + } } else if (pending.Any(_ => deletes.ContainsKey(_.File))) { @@ -590,9 +597,63 @@ public TrackedDelete AddDelete(string file) => updateValueFactory: (_, existing) => { Log.Information("DeleteUpdated. File:{file}", file); + // Raised again, so by a run that looked at the file as it is now. Whatever a move + // wrote there since the delete was first raised, this is the later statement + existing.Written = false; return existing; }); + /// + /// Why an accept-all leaves a delete pending, where it would: null when it would carry it + /// out. For the menu and the debug view, which say it beside the delete, and for the sweeps, + /// which act on it. + /// + public string? HeldReason(TrackedDelete delete) + { + if (delete.Written) + { + return WroteItsFile; + } + + if (moves.Values.Any(_ => string.Equals(_.Target, delete.File, StringComparison.OrdinalIgnoreCase))) + { + return AwaitsItsFile; + } + + return null; + } + + /// + /// A move was accepted onto the file while its delete was pending. + /// + /// withdraws the delete a move finds waiting for its target, so the two + /// are only pending together when the delete arrived second, and which of them is the stale + /// one is then not knowable from here. The move is the snapshot arriving and the delete is the + /// last copy leaving, so the move goes ahead and the delete waits to be accepted on its own. + /// + /// + /// Remembered on the delete, rather than only for the sweep that wrote the file. The sweep + /// held the delete and forgot why as it ended, so the delete sat in the menu looking like any + /// other, and a second "Accept all" deleted the snapshot the first had just accepted. The same + /// went for a move accepted on its own and an accept-all after it. + /// + /// + public const string WroteItsFile = "Kept by 'Accept all': a move was accepted onto this file after the delete was raised, so deleting it would remove what was just accepted. Accept the delete on its own to delete the file anyway, or run the tests again."; + + /// + /// A move still pending is going to write the file. Not remembered: it is true for as long as + /// the move is there, and stops being true if the move is discarded. + /// + public const string AwaitsItsFile = "Kept by 'Accept all': a pending move is still to be accepted onto this file. Accept the delete on its own to delete the file anyway."; + + void MarkWritten(string target) + { + if (deletes.TryGetValue(target, out var delete)) + { + delete.Written = true; + } + } + /// /// Through , which is what the wire path has always /// used: it catches, re-tracks so the delete can be retried, and reports why. @@ -750,6 +811,7 @@ bool InnerMove(TrackedMove move, AcceptBatch batch) if (FileEx.SafeMove(move.Temp, move.Target)) { batch.Written.Add(move.Target); + MarkWritten(move.Target); DeleteTempDirectory(move); return true; } @@ -1013,8 +1075,12 @@ public Task AcceptAll() return AcceptSnapshotsThenDeletes(pending, written); } - void AcceptDeletes(List pending, HashSet written) + /// + /// The deletes left pending because of a move onto their file, for the caller to say so. + /// + List AcceptDeletes(List pending, HashSet written) { + var kept = new List(); // One at a time, and no Clear afterwards: a delete that fails re-tracks itself, and // clearing would throw that away. Unguarded, the first bad one also took the rest of the // sweep with it, so "Accept all" stopped at the first read-only file @@ -1029,23 +1095,35 @@ void AcceptDeletes(List pending, HashSet written) if (WrittenOrAwaited(delete, written)) { Log.Information("Kept the pending delete of `{Name}`: a move wrote that file, or is still pending onto it", delete.Name); + kept.Add(delete); continue; } Accept(delete); } + + return kept; + } + + /// + /// What a user is told about deletes an accept-all kept because of a move onto their file. + /// The menu says the same beside each of them, for whoever missed the balloon. + /// + internal static string DeletesKept(IReadOnlyList kept) + { + var which = kept.Count == 1 + ? $"The pending delete of '{kept[0].Name}' was kept" + : $"{kept.Count} pending deletes were kept"; + return $"{which}, since a move was accepted onto the same file, or is still to be, and deleting it would remove what the move put there. Accept a delete on its own to delete its file anyway."; } /// /// Whether a sweep must leave this delete pending, because the file it would remove is one a /// move in the same sweep has just written or one a move still pending is going to write. /// - /// withdraws the delete a move finds waiting for its target, so the two - /// are only pending together when the delete arrived second, and which of them is the stale - /// one is then not knowable from here. The move is the snapshot arriving and the delete is the - /// last copy leaving, so the move goes ahead and the delete waits to be accepted on its own: - /// carried out, it removed the received file a moment after that file had been moved into - /// place, and neither was left. + /// Carried out, it removed the received file a moment after that file had been moved into + /// place, and neither was left: see , which is also why a delete + /// whose file an earlier accept wrote is held by every sweep after it. /// /// /// By what was written rather than by what was swept. A move whose received file has gone is @@ -1054,7 +1132,7 @@ void AcceptDeletes(List pending, HashSet written) /// bool WrittenOrAwaited(TrackedDelete delete, HashSet written) => written.Contains(delete.File) || - moves.Values.Any(_ => string.Equals(_.Target, delete.File, StringComparison.OrdinalIgnoreCase)); + HeldReason(delete) is not null; public ICollection Deletes => deletes.Values; From c2795b54e3ff5a3e906750c562b5e2746331b4a1 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:59:37 +1100 Subject: [PATCH 07/50] Remove the tray's version marker when the session ends A logoff or a shutdown never returns from Application.Run(), so the TrayVersionFile.Delete() after it never ran and the marker went on saying a tray of this version was running. Only a tray that owned the inline queue listened for the session ending at all, and what it did then was stage its queue. Every tray now keeps the window that hears WM_ENDSESSION, and what it runs is Program.SessionEnding: the queue staged where it is held here, then the marker removed, the second whether or not the first worked. Checked by SessionEndWindowTest, with the removal handed in so the marker of a tray running on the machine is not touched: ATrayThatDoesNotOwnTheQueueRemovesItsMarkerAsTheSessionEnds and AnOwningTrayStagesItsQueueAndThenRemovesItsMarker. The line in Program.Inner that wires it is read, not run: nothing starts a tray in a test, and no session was ended to see it. --- .../SessionEndWindowTest.cs | 58 +++++++++++++++++++ src/DiffEngineTray/Program.cs | 35 +++++++++-- 2 files changed, 89 insertions(+), 4 deletions(-) diff --git a/src/DiffEngineTray.Tests/SessionEndWindowTest.cs b/src/DiffEngineTray.Tests/SessionEndWindowTest.cs index bee893b6..5d971eeb 100644 --- a/src/DiffEngineTray.Tests/SessionEndWindowTest.cs +++ b/src/DiffEngineTray.Tests/SessionEndWindowTest.cs @@ -78,6 +78,64 @@ public async Task AnOwningTrayStagesItsQueueAsTheSessionEnds() } } + /// + /// The version marker says a tray is running, and a clean exit removes it. A logoff reached + /// none of that, so the marker outlived the tray: only an owning tray was listening for the + /// session ending at all, and what it did then was stage its queue and nothing else. + /// + /// The removal is handed in, as Program hands in the real one, so nothing here touches the + /// marker of a tray running on this machine. + /// + /// + [Test] + public async Task ATrayThatDoesNotOwnTheQueueRemovesItsMarkerAsTheSessionEnds() + { + var removed = 0; + using (var window = new SessionEndWindow(Program.SessionEnding(null, () => removed++))) + { + SendMessage(window.Handle, queryEndSession, IntPtr.Zero, logoff); + SendMessage(window.Handle, endSession, new(1), logoff); + } + + await Assert.That(removed).IsEqualTo(1); + } + + [Test] + public async Task AnOwningTrayStagesItsQueueAndThenRemovesItsMarker() + { + var directory = Path.Combine(Path.GetTempPath(), $"tray-session-end-{Guid.NewGuid():N}"); + Directory.CreateDirectory(directory); + var host = OwnedInlineHost.TryOwn(_ => { }, new FakeLauncher(), 0) ?? + throw new("Could not bind an ephemeral port."); + try + { + await File.WriteAllTextAsync(Path.Combine(directory, "Sample.csproj"), ""); + var source = Path.Combine(directory, "SampleTests.cs"); + await File.WriteAllTextAsync(source, "// sample"); + host.Start(); + await Assert.That(Send(host, source).Ok).IsTrue(); + var staging = Path.Combine(directory, "obj", InlineStaging.DirectoryName); + bool? stagedWhenRemoved = null; + + using (var window = new SessionEndWindow( + Program.SessionEnding( + host, + () => stagedWhenRemoved = Directory.Exists(staging) && + Directory.GetFiles(staging).Any(_ => _.EndsWith(".inlinepatch"))))) + { + SendMessage(window.Handle, queryEndSession, IntPtr.Zero, logoff); + SendMessage(window.Handle, endSession, new(1), logoff); + } + + await Assert.That(stagedWhenRemoved).IsTrue(); + } + finally + { + await host.DisposeAsync(); + Directory.Delete(directory, recursive: true); + } + } + static void EndSession(OwnedInlineHost host) { using var window = new SessionEndWindow(host.SessionEnding); diff --git a/src/DiffEngineTray/Program.cs b/src/DiffEngineTray/Program.cs index 5043ce50..3f8382d1 100644 --- a/src/DiffEngineTray/Program.cs +++ b/src/DiffEngineTray/Program.cs @@ -105,10 +105,9 @@ void Warn(string message) => owned.Start(); } - // A logoff or a shutdown does not come back through Application.Run(), so the staging the - // unwind below performs never happens for one. Only for a queue held here: a viewer that - // owns it stages its own - using var sessionEnd = owned is null ? null : new SessionEndWindow(owned.SessionEnding); + // A logoff or a shutdown does not come back through Application.Run(), so nothing the + // unwind below performs happens for one + using var sessionEnd = new SessionEndWindow(SessionEnding(owned, TrayVersionFile.Delete)); // Not a using. Anything throwing between here and the await below would dispose a task // that is still running, and Task.Dispose throws for one that has not completed - which @@ -157,6 +156,34 @@ void Warn(string message) => await task; } + /// + /// What a clean exit does on its way out, for a session that ends instead: the queue staged, + /// when it is held here, and the version marker removed. + /// + /// The queue only where this tray owns it, since a viewer that owns it stages its own. The + /// marker whoever owns the queue: it says a tray of this version is running, to whatever + /// reads it to decide what it may send, and left behind by a logoff it went on saying so + /// until a tray was next started, which after a logoff need not be this version or any. + /// + /// + /// The queue first, being the one that cannot be had again, and the marker whether or not + /// that worked. + /// + /// + /// , except in a test. + internal static Action SessionEnding(OwnedInlineHost? owned, Action removeMarker) => + () => + { + try + { + owned?.SessionEnding(); + } + finally + { + removeMarker(); + } + }; + [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "ShowContextMenu")] static extern void ShowContextMenu(NotifyIcon icon); From a3ab518d30d635b4ae39f685cf62f3ef55c8377e Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:59:48 +1100 Subject: [PATCH 08/50] Discard tracked files off the thread that asked, and say when the queue would not "Discard (n)" is a menu click or a hot key, so it runs on the thread drawing everything. Only the queue's half of it had been moved to a worker: the tracked moves were still discarded before the call returned, and discarding a move ends its diff tool and waits up to half a second for it to go. The whole of it now runs on the worker, files first, so a queue that is slow to answer holds up nothing else. A queue that would not discard, or could not be reached, keeps its snapshots in the menu under the button just pressed to be rid of them, and only the log said why. It now goes to the balloon as well. Checked by TrackerClearTest. TheFilesAreNotDiscardedOnTheThreadThatAsked asks from a thread of its own and fails without the fix, as does ABulkDiscardTheQueueDidNotCarryOutIsSaid. The first needed somewhere to see the thread from, so the files half is a virtual method a test overrides. TrayViewerSyncTest still passes. --- src/DiffEngineTray.Tests/StubInlineHost.cs | 12 ++- src/DiffEngineTray.Tests/TrackerClearTest.cs | 87 +++++++++++++++++++ src/DiffEngineTray/Tracker.cs | 91 +++++++++++++------- 3 files changed, 155 insertions(+), 35 deletions(-) diff --git a/src/DiffEngineTray.Tests/StubInlineHost.cs b/src/DiffEngineTray.Tests/StubInlineHost.cs index cc14a9e4..c98214e8 100644 --- a/src/DiffEngineTray.Tests/StubInlineHost.cs +++ b/src/DiffEngineTray.Tests/StubInlineHost.cs @@ -93,12 +93,20 @@ public bool AcceptAll(out string? message, out bool refused) return AcceptAllSucceeds; } + /// + /// What a bulk discard reports. False is a queue that could not be reached, or one that would + /// not discard, with as what it said. + /// + public bool DiscardAllSucceeds { get; init; } = true; + + public string? DiscardAllMessage { get; init; } + public bool DiscardAll(out string? message) { - message = null; + message = DiscardAllMessage; DiscardStarted.Set(); DiscardBlock?.Wait(TimeSpan.FromSeconds(10)); - return true; + return DiscardAllSucceeds; } public void Focus(PendingSnapshot snapshot) diff --git a/src/DiffEngineTray.Tests/TrackerClearTest.cs b/src/DiffEngineTray.Tests/TrackerClearTest.cs index 17cd69ee..13a743b1 100644 --- a/src/DiffEngineTray.Tests/TrackerClearTest.cs +++ b/src/DiffEngineTray.Tests/TrackerClearTest.cs @@ -11,6 +11,93 @@ public async Task Simple() await tracker.AssertEmpty(); } + /// + /// "Discard (n)" is a menu click or a hot key, so the thread that asks is the one drawing + /// everything. Discarding a move ends its diff tool and waits up to half a second for it to + /// go, and the moves were discarded before the call returned: only the queue's half had been + /// moved to a worker. + /// + /// Asked from a thread of its own, which is never the worker's. Asked from the pool, the + /// thread that asked can be the one that picks the work up once the test awaits. + /// + /// + [Test] + public async Task TheFilesAreNotDiscardedOnTheThreadThatAsked() + { + await using var tracker = new WatchedTracker(); + tracker.AddDelete(file1); + tracker.AddMove(file2, file2, "theExe", "theArguments", true, null); + + var asked = new TaskCompletionSource<(int thread, Task clearing)>(TaskCreationOptions.RunContinuationsAsynchronously); + var thread = new Thread(() => asked.SetResult((Environment.CurrentManagedThreadId, tracker.Clear()))) + { + IsBackground = true + }; + thread.Start(); + var (caller, clearing) = await asked.Task; + await clearing; + + await Assert.That(tracker.DiscardedOn).IsNotNull(); + await Assert.That(tracker.DiscardedOn).IsNotEqualTo(caller); + await tracker.AssertEmpty(); + } + + /// + /// A queue that would not discard, or could not be reached, keeps its snapshots, and the menu + /// goes on listing them under a button that had just been pressed to be rid of them. The log + /// was the only place that said why. + /// + [Test] + public async Task ABulkDiscardTheQueueDidNotCarryOutIsSaid() + { + var warnings = new ConcurrentQueue(); + await using var tracker = new RecordingTracker( + inlineFailed: warnings.Enqueue, + inline: new StubInlineHost(new PendingSnapshot(@"c:\repo\sample.cs|12", "Sample.cs:12", null)) + { + DiscardAllSucceeds = false, + DiscardAllMessage = "The snapshot viewer did not answer." + }); + tracker.AddDelete(file1); + + await tracker.Clear(); + + await Assert.That(warnings).IsEquivalentTo( + ["Could not discard the pending snapshots. The snapshot viewer did not answer."]); + // The files went all the same, and the snapshots are still what the menu shows + await Assert.That(tracker.Deletes).IsEmpty(); + await Assert.That(tracker.Snapshots).HasSingleItem(); + } + + [Test] + public async Task ABulkDiscardThatWorkedSaysNothing() + { + var warnings = new ConcurrentQueue(); + await using var tracker = new RecordingTracker( + inlineFailed: warnings.Enqueue, + inline: new StubInlineHost(new PendingSnapshot(@"c:\repo\sample.cs|12", "Sample.cs:12", null))); + + await tracker.Clear(); + + await Assert.That(warnings).IsEmpty(); + await Assert.That(tracker.Snapshots).IsEmpty(); + } + + /// + /// A tracker that says which thread its files were discarded on. + /// + class WatchedTracker : + RecordingTracker + { + public int? DiscardedOn { get; private set; } + + protected override int DiscardFiles() + { + DiscardedOn = Environment.CurrentManagedThreadId; + return base.DiscardFiles(); + } + } + public void Dispose() { File.Delete(file1); diff --git a/src/DiffEngineTray/Tracker.cs b/src/DiffEngineTray/Tracker.cs index 9f1ee5a3..421ae626 100644 --- a/src/DiffEngineTray/Tracker.cs +++ b/src/DiffEngineTray/Tracker.cs @@ -1000,20 +1000,22 @@ static void KillProcesses(TrackedMove move) /// skipped came back on the next scan two seconds later. /// /// - /// The tracked files here, on the calling thread, and the snapshots on a worker, for the - /// reason gives: a queue a viewer owns is asked over a - /// socket, and one slow to answer held the thread drawing everything for as long as that - /// took. The menu and the hot key discard the task; tests await it. + /// All of it on a worker, as an accept-all's second half is. The snapshots for the reason + /// gives: a queue a viewer owns is asked over a socket, + /// and one slow to answer held the thread drawing everything for as long as that took. The + /// tracked files because discarding a move ends its diff tool and waits up to half a second + /// for each to go, which for a screen full of them was seconds of a tray that drew nothing. + /// The files first, so a queue that is slow to answer holds up nothing but itself. The menu + /// and the hot key discard the task; tests await it. /// /// - public Task Clear() - { - ((ITrackedFiles) this).DiscardAll(); - - return Task.Run(() => + public Task Clear() => + Task.Run(() => { try { + DiscardFiles(); + // Only forget the cached snapshots when the owner actually discarded them. It used // to be cleared regardless, so a discard the owner never received still emptied the // menu - and everything came back on the next scan two seconds later @@ -1023,7 +1025,11 @@ public Task Clear() } else { - Log.Error("{Message}", message ?? "Could not discard the pending snapshots."); + // Said, and not only logged: the snapshots are still in the menu, under the + // button that was just pressed to be rid of them + var failure = CouldNotDiscard(message); + Log.Error("{Message}", failure); + inlineFailed?.Invoke(failure); } // Nothing waits for the next scan to say so: the files went above, whatever the @@ -1032,9 +1038,48 @@ public Task Clear() } catch (Exception exception) { - ExceptionHandler.Handle("Failed to discard the pending snapshots", exception); + ExceptionHandler.Handle("Failed to discard everything pending", exception); } }); + + /// + /// What a user is told when "Discard (n)" could not discard the snapshots, which stay pending. + /// + internal static string CouldNotDiscard(string? message) + { + if (message is { Length: > 0 }) + { + return $"Could not discard the pending snapshots. {message}"; + } + + return "Could not discard the pending snapshots."; + } + + /// + /// Every tracked move and delete discarded, for and for the wire. Virtual + /// so a test can see which thread it was asked of. + /// + protected virtual int DiscardFiles() + { + var count = 0; + foreach (var delete in deletes.Values.ToList()) + { + if (deletes.TryRemove(delete.File, out _)) + { + count++; + } + } + + foreach (var move in moves.Values.ToList()) + { + if (moves.TryRemove(move.Temp, out var removed)) + { + InnerDiscard(removed); + count++; + } + } + + return count; } /// @@ -1377,28 +1422,8 @@ bool ITrackedFiles.Untrack(string key) return (accepted, kept); } - int ITrackedFiles.DiscardAll() - { - var count = 0; - foreach (var delete in deletes.Values.ToList()) - { - if (deletes.TryRemove(delete.File, out _)) - { - count++; - } - } - - foreach (var move in moves.Values.ToList()) - { - if (moves.TryRemove(move.Temp, out var removed)) - { - InnerDiscard(removed); - count++; - } - } - - return count; - } + int ITrackedFiles.DiscardAll() => + DiscardFiles(); (bool ok, string? message) AcceptTracked(TrackedDelete delete) { From d083c180045b75bdab18347e53677bf15cba904f Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:59:48 +1100 Subject: [PATCH 09/50] Say once when the tray's scan keeps failing A scan that fails is logged and the next one runs, which is right for one that fails alone. But a tray whose every scan failed looked like one with nothing wrong, while its icon and menu stopped following the files on disk. Three failures running are now said in a balloon, once for the run and not for each scan in it, which would be a balloon every two seconds for as long as the cause stood. A scan that works ends the run, so a later run of failures is said afresh. Nothing modal, and every failure is still logged. Checked by TrackerScanTest: AScanThatKeepsFailingIsSaidOnce and AScanThatFailsAgainAfterWorkingIsSaidAgain fail without the fix, and ASingleFailedScanIsNotSaid pins the threshold. The tests run scans themselves beside the tracker's own timer over the same failing queue, and what they assert holds however many of the timer's land in between. --- src/DiffEngineTray.Tests/RecordingTracker.cs | 5 +- src/DiffEngineTray.Tests/TrackerScanTest.cs | 108 +++++++++++++++++++ src/DiffEngineTray/Program.cs | 3 +- src/DiffEngineTray/Tracker.cs | 63 +++++++++-- 4 files changed, 167 insertions(+), 12 deletions(-) diff --git a/src/DiffEngineTray.Tests/RecordingTracker.cs b/src/DiffEngineTray.Tests/RecordingTracker.cs index 92db2cf1..c01da7d4 100644 --- a/src/DiffEngineTray.Tests/RecordingTracker.cs +++ b/src/DiffEngineTray.Tests/RecordingTracker.cs @@ -1,4 +1,4 @@ -class RecordingTracker(LockedFilesResolver? lockedFilesResolver = null, Action? acceptFailed = null, Action? inlineFailed = null, IInlineHost? inline = null) : +class RecordingTracker(LockedFilesResolver? lockedFilesResolver = null, Action? acceptFailed = null, Action? inlineFailed = null, IInlineHost? inline = null, Action? scanFailing = null) : Tracker( () => { @@ -9,7 +9,8 @@ class RecordingTracker(LockedFilesResolver? lockedFilesResolver = null, Action _.Contains("Failed to scan files"))).IsEmpty(); } + /// + /// Logged and nothing more, a tray whose every scan failed looked like one with nothing wrong + /// while its menu and icon stopped following the files. A run of failures is said once, in a + /// balloon, and not again for each scan in it: that would be one every two seconds. + /// + /// The scans here are run by the test, beside the tracker's own two second timer over the same + /// failing queue, whose scans count towards the same run. So what is asserted holds however + /// many of those land in between. + /// + /// + [Test] + public async Task AScanThatKeepsFailingIsSaidOnce() + { + var listed = 0; + var told = new ConcurrentQueue(); + var host = new StubInlineHost + { + Listed = () => + { + // The first is the tracker starting, and the rest are scans + if (Interlocked.Increment(ref listed) > 1) + { + throw new InvalidOperationException("TheScanFailure"); + } + } + }; + await using var tracker = new RecordingTracker(inline: host, scanFailing: told.Enqueue); + + for (var scan = 0; scan < Tracker.ScanFailuresBeforeTelling * 4; scan++) + { + await tracker.Scan(Cancel.None); + } + + await Assert.That(told).HasSingleItem(); + await Assert.That(told.Single()).Contains("TheScanFailure"); + await Assert.That(ModuleInitializer.IssuesAsked.Where(_ => _.Contains("Failed to scan files"))).IsEmpty(); + } + + /// + /// A scan that works ends the run, so the next run of failures is news again. + /// + [Test] + public async Task AScanThatFailsAgainAfterWorkingIsSaidAgain() + { + var failing = false; + var told = new ConcurrentQueue(); + var host = new StubInlineHost + { + Listed = () => + { + if (Volatile.Read(ref failing)) + { + throw new InvalidOperationException("TheScanFailure"); + } + } + }; + await using var tracker = new RecordingTracker(inline: host, scanFailing: told.Enqueue); + + async Task ScanThrice() + { + for (var scan = 0; scan < Tracker.ScanFailuresBeforeTelling; scan++) + { + await tracker.Scan(Cancel.None); + } + } + + Volatile.Write(ref failing, true); + await ScanThrice(); + await Assert.That(told.Count).IsEqualTo(1); + + Volatile.Write(ref failing, false); + await tracker.Scan(Cancel.None); + + Volatile.Write(ref failing, true); + await ScanThrice(); + await Assert.That(told.Count).IsEqualTo(2); + } + + /// + /// One scan failing is a file that went between two lines of it, and nobody is told. + /// + [Test] + public async Task ASingleFailedScanIsNotSaid() + { + var failing = true; + var told = new ConcurrentQueue(); + var listed = 0; + var host = new StubInlineHost + { + Listed = () => + { + // The tracker starting, which is not a scan, and then the one scan that fails + if (Interlocked.Increment(ref listed) > 1 && + Volatile.Read(ref failing)) + { + throw new InvalidOperationException("TheScanFailure"); + } + } + }; + await using var tracker = new RecordingTracker(inline: host, scanFailing: told.Enqueue); + + await tracker.Scan(Cancel.None); + Volatile.Write(ref failing, false); + await tracker.Scan(Cancel.None); + + await Assert.That(told).IsEmpty(); + } + public TrackerScanTest() { directory = Path.Combine(Path.GetTempPath(), "DiffEngineTray.Tests", Guid.NewGuid().ToString("N")); diff --git a/src/DiffEngineTray/Program.cs b/src/DiffEngineTray/Program.cs index 3f8382d1..9ec0c2e4 100644 --- a/src/DiffEngineTray/Program.cs +++ b/src/DiffEngineTray/Program.cs @@ -94,7 +94,8 @@ void Warn(string message) => acceptFailed: move => Warn( $"Could not accept '{move.Name}': the file move keeps failing. The move is still pending, so accept can be retried."), inlineFailed: Warn, - inline: owned); + inline: owned, + scanFailing: Warn); // Owning the queue means knowing the moment it changes, rather than finding out on the // next two second scan. Wired before serving starts, so the first patch to arrive counts. diff --git a/src/DiffEngineTray/Tracker.cs b/src/DiffEngineTray/Tracker.cs index 421ae626..ea7dace7 100644 --- a/src/DiffEngineTray/Tracker.cs +++ b/src/DiffEngineTray/Tracker.cs @@ -17,21 +17,16 @@ class Tracker : AsyncTimer timer; int lastScanCount; - public Tracker(Action active, Action inactive, LockedFilesResolver? lockedFilesResolver = null, Action? acceptFailed = null, Action? inlineFailed = null, IInlineHost? inline = null) + public Tracker(Action active, Action inactive, LockedFilesResolver? lockedFilesResolver = null, Action? acceptFailed = null, Action? inlineFailed = null, IInlineHost? inline = null, Action? scanFailing = null) { this.active = active; this.inactive = inactive; this.lockedFilesResolver = lockedFilesResolver; this.acceptFailed = acceptFailed; this.inlineFailed = inlineFailed; + this.scanFailing = scanFailing; this.inline = inline ?? new RemoteInlineHost(); - timer = new( - ScanFiles, - TimeSpan.FromSeconds(2), - // Logged and no more. This is the timer's own thread, and the handler everything else - // uses follows the log with a modal box: no scan ran again until somebody answered it, - // and a scan is nothing anybody asked for, so the box arrived out of nowhere - exception => Log.Error(exception, "Failed to scan files")); + timer = new(Scan, TimeSpan.FromSeconds(2)); // Seeded rather than left empty until the first scan two seconds later. The menu reads // this cache now, so without it a tray that has just started shows none of what a viewer @@ -39,7 +34,57 @@ public Tracker(Action active, Action inactive, LockedFilesResolver? lockedFilesR Refresh(); } - Task ScanFiles(Cancel cancel) + /// + /// How many scans have to fail one after the other before anybody is told. One that fails + /// alone is a file that went between two lines of it, and is put right by the next. + /// + internal const int ScanFailuresBeforeTelling = 3; + + Action? scanFailing; + int failedScans; + + /// + /// One scan, and what is made of it failing. + /// + /// Logged, every time. This is the timer's own thread, and the handler everything else uses + /// follows the log with a modal box: no scan ran again until somebody answered it, and a scan + /// is nothing anybody asked for, so the box arrived out of nowhere. + /// + /// + /// The log alone left a tray whose every scan failed looking like one with nothing wrong: the + /// icon and the menu stopped following the files, and nothing said so. So a run of failures + /// is said once, in a balloon, when it has gone on long enough not to be a passing one. Once + /// for the run, rather than for each scan in it, which would be a balloon every two seconds + /// for as long as the cause stood. A scan that works ends the run, and the next run is told + /// afresh. + /// + /// + internal async Task Scan(Cancel cancel) + { + try + { + await ScanFiles(cancel); + Interlocked.Exchange(ref failedScans, 0); + } + catch (OperationCanceledException) + { + throw; + } + catch (Exception exception) + { + Log.Error(exception, "Failed to scan files"); + // Counted across threads, since a test runs scans beside the timer's + if (Interlocked.Increment(ref failedScans) == ScanFailuresBeforeTelling) + { + scanFailing?.Invoke(ScanFailingMessage(exception)); + } + } + } + + internal static string ScanFailingMessage(Exception exception) => + $"The pending files could not be checked, {ScanFailuresBeforeTelling} times running, so the menu and the icon may be behind what is on disk. {exception.Message} Every failure is in the log: 'Open logs' in the menu."; + + internal Task ScanFiles(Cancel cancel) { foreach (var delete in deletes.ToList() .Where(delete => !File.Exists(delete.Value.File))) From 44053c03b59106b23c1b4f951e6432044e74efc5 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:59:58 +1100 Subject: [PATCH 10/50] Count a tracked file put back after a failed accept as a change to the listing An accept takes its move out of the tracker for as long as the move takes, seconds when a file is locked, and puts the same object back when it could not be carried out. The queue owner takes its listing tag and then builds the listing, so a listing built in that gap went out without the move under a tag taken while it was there. Once the move was back the tracker held exactly the objects it had held at the tag, so every later poll was answered "unchanged" and the displaying viewer went on missing a pending file until something else changed. A delete that could not be deleted has the same gap, a shorter one. Version() tells a change by which objects are tracked, and that stays. The two places that put the same object back are counted as well, and a count that has moved is a change. Checked by TrackerVersionTest: AMoveTakenOutAndPutBackIsAChange lists from inside the failed accept, sees no move, and then asks for the version, and ADeleteTakenOutAndPutBackIsAChange does the same for a delete. Both fail without the fix, with the version unmoved. --- .../TrackerVersionTest.cs | 96 +++++++++++++++++++ src/DiffEngineTray/Tracker.cs | 26 ++++- 2 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/DiffEngineTray.Tests/TrackerVersionTest.cs diff --git a/src/DiffEngineTray.Tests/TrackerVersionTest.cs b/src/DiffEngineTray.Tests/TrackerVersionTest.cs new file mode 100644 index 00000000..f9981b84 --- /dev/null +++ b/src/DiffEngineTray.Tests/TrackerVersionTest.cs @@ -0,0 +1,96 @@ +/// +/// is how a queue owner tells a displaying viewer that nothing +/// it listed has changed, so it has to move whenever a listing could have been built from +/// something other than what is tracked now. +/// +/// An accept takes its move out of the tracker for as long as the move takes, which is seconds +/// when a file is locked, and puts the same object back when it could not be carried out. The +/// owner takes its tag and then builds its listing, so a listing built in that gap goes out +/// without the move under a tag taken with it. Compared by which objects are tracked, the tracker +/// then looked exactly as it had at the tag, and the viewer was told "unchanged" about a listing +/// that was missing a pending file, for as long as nothing else changed. +/// +/// +public class TrackerVersionTest : + IDisposable +{ + [Test] + public async Task AMoveTakenOutAndPutBackIsAChange() + { + ITrackedFiles tracked = null!; + int? listedWhileAccepting = null; + // Told of the failure while the move is still out, which is where a listing built + // between the two halves of an accept stands + await using var tracker = new RecordingTracker( + acceptFailed: _ => listedWhileAccepting = tracked.Moves().Count); + tracked = tracker; + var move = tracker.AddMove(temp, target, "theExe", "theArguments", false, null); + // Read-only, so the accept gives up at once rather than after its retries + File.SetAttributes(target, FileAttributes.ReadOnly); + var before = tracked.Version(); + + tracker.Accept(move); + + await Assert.That(listedWhileAccepting).IsEqualTo(0); + await Assert.That(tracker.FindMove(temp)).IsSameReferenceAs(move); + await Assert.That(tracked.Version()).IsNotEqualTo(before); + } + + /// + /// The same gap for a delete, which is untracked while its file is deleted and tracked again + /// when that fails. + /// + [Test] + public async Task ADeleteTakenOutAndPutBackIsAChange() + { + await using var tracker = new RecordingTracker(); + ITrackedFiles tracked = tracker; + var delete = tracker.AddDelete(target); + var before = tracked.Version(); + + await using (File.Open(target, FileMode.Open, FileAccess.Read, FileShare.None)) + { + tracker.Accept(delete); + } + + await Assert.That(tracker.Deletes).HasSingleItem(); + await Assert.That(tracked.Version()).IsNotEqualTo(before); + } + + [Test] + public async Task NothingHappeningIsNoChange() + { + await using var tracker = new RecordingTracker(); + ITrackedFiles tracked = tracker; + tracker.AddMove(temp, target, "theExe", "theArguments", false, null); + tracker.AddDelete(other); + + var before = tracked.Version(); + + await Assert.That(tracked.Version()).IsEqualTo(before); + } + + public TrackerVersionTest() + { + directory = Path.Combine(Path.GetTempPath(), "DiffEngineTray.Tests", Guid.NewGuid().ToString("N")); + var received = Path.Combine(directory, "received"); + Directory.CreateDirectory(received); + temp = Path.Combine(received, "file.received.txt"); + target = Path.Combine(directory, "file.verified.txt"); + other = Path.Combine(directory, "other.verified.txt"); + File.WriteAllText(temp, "received"); + File.WriteAllText(target, "verified"); + File.WriteAllText(other, "other"); + } + + public void Dispose() + { + File.SetAttributes(target, FileAttributes.Normal); + Directory.Delete(directory, true); + } + + readonly string directory; + readonly string temp; + readonly string target; + readonly string other; +} diff --git a/src/DiffEngineTray/Tracker.cs b/src/DiffEngineTray/Tracker.cs index ea7dace7..52499993 100644 --- a/src/DiffEngineTray/Tracker.cs +++ b/src/DiffEngineTray/Tracker.cs @@ -793,8 +793,17 @@ void Restore(TrackedMove removed) { Release(removed); } + + Interlocked.Increment(ref restores); } + /// + /// How many times something taken out to be accepted has been put back, which is the one + /// change to what is tracked that cannot see by looking: + /// the same object in the same place as before it left. + /// + long restores; + /// /// Lets go of the process a move was tracked with, without ending it, once the move has left /// for good. @@ -1255,6 +1264,7 @@ IReadOnlyList ITrackedFiles.Deletes() => readonly Lock versionGate = new(); readonly List versioned = []; + long versionedRestores; long version; /// @@ -1271,16 +1281,29 @@ IReadOnlyList ITrackedFiles.Deletes() => /// Rather than a count of changes, kept wherever the dictionaries are written: there are a /// score of such places, and one missed is a viewer that goes on showing a file that left. /// + /// + /// Except for the one change that leaves the same objects behind it. An accept takes its move + /// out for as long as the move takes, seconds when a file is locked, and puts the same object + /// back when it could not be carried out. The owner takes its tag and then builds its listing, + /// so a listing built in that gap goes out without the move, under a tag taken while it was + /// there, and once the move was back nothing here looked different from when the tag was + /// taken: the viewer was told "unchanged" about a listing missing a pending file. Those are + /// two places, and the delete that could not be deleted, and they are + /// counted. + /// /// long ITrackedFiles.Version() { lock (versionGate) { - if (Unchanged()) + var restored = Interlocked.Read(ref restores); + if (restored == versionedRestores && + Unchanged()) { return version; } + versionedRestores = restored; versioned.Clear(); foreach (var move in moves) { @@ -1485,6 +1508,7 @@ int ITrackedFiles.DiscardAll() => { // Re-tracked so it can be retried, and refused so the caller shows why. deletes.TryAdd(removed.File, removed); + Interlocked.Increment(ref restores); return (false, $"Could not delete {removed.Name}. {exception.Message}"); } From dd348bcfd191808d5bcfef0afb036c4dce6a4899 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:59:58 +1100 Subject: [PATCH 11/50] Forget what a pair was found to be once its move has left The scan remembers a pair it found different, by the two files' sizes and write times, so it does not read both through again every two seconds. Nothing took an entry out when its move was accepted, discarded or settled, so a tray that stayed up kept one for every received file it had ever compared. Pruned in the scan, once a pass, rather than wherever a move leaves: there are a score of such places, and a scan still comparing a move as it leaves writes its entry after any of them had run. Checked by TrackerScanTest.WhatAMoveWasFoundToBeIsForgottenOnceItHasLeft, which fails without the fix. --- src/DiffEngineTray.Tests/TrackerScanTest.cs | 25 +++++++++++++++++++++ src/DiffEngineTray/Tracker.cs | 18 +++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/DiffEngineTray.Tests/TrackerScanTest.cs b/src/DiffEngineTray.Tests/TrackerScanTest.cs index f71ed870..97f30f7f 100644 --- a/src/DiffEngineTray.Tests/TrackerScanTest.cs +++ b/src/DiffEngineTray.Tests/TrackerScanTest.cs @@ -41,6 +41,31 @@ public async Task AMoveThatCameToEqualItsTargetIsDropped() await Assert.That(tracker.Moves).IsEmpty(); } + /// + /// A pair found different is remembered, so the next scan does not read both files through + /// again. Nothing forgot it when the move left, so the tray kept one for every received file + /// it had ever compared. + /// + [Test] + public async Task WhatAMoveWasFoundToBeIsForgottenOnceItHasLeft() + { + await using var tracker = new RecordingTracker(); + File.WriteAllText(temp, "received"); + File.WriteAllText(target, "verified"); + var scanned = tracker.AddMove(temp, target, "theExe", "theArguments", true, null); + await tracker.HandleScanMove(new(temp, scanned)); + await Assert.That(tracker.KnownDiffering).IsEqualTo(1); + + // Still tracked, so still worth knowing + await tracker.ScanFiles(Cancel.None); + await Assert.That(tracker.KnownDiffering).IsEqualTo(1); + + tracker.Discard(scanned); + await tracker.ScanFiles(Cancel.None); + + await Assert.That(tracker.KnownDiffering).IsEqualTo(0); + } + /// /// A file that may not be read is no more a failure of the scan than one that is locked: the /// pair cannot be compared this round. Only the locked one was caught, so this one failed the diff --git a/src/DiffEngineTray/Tracker.cs b/src/DiffEngineTray/Tracker.cs index 52499993..668b8bcc 100644 --- a/src/DiffEngineTray/Tracker.cs +++ b/src/DiffEngineTray/Tracker.cs @@ -92,6 +92,19 @@ internal Task ScanFiles(Cancel cancel) deletes.TryRemove(delete.Key, out _); } + // What a pair was last found to be is worth keeping only while the pair is tracked. Here, + // once a scan, rather than wherever a move leaves: there are a score of such places, and + // a scan that is still comparing a move as it leaves writes its entry after any of them + // had run. Left alone, a tray that stays up for weeks kept an entry for every received + // file it had ever found different. + foreach (var temp in differing.Keys) + { + if (!moves.ContainsKey(temp)) + { + differing.TryRemove(temp, out _); + } + } + // A passing re-run sends a settle message, and whoever owns the queue drops the entry // then, so there is nothing to expire here. Just refresh the listing that drives the icon. snapshots = inline.List(); @@ -169,6 +182,11 @@ void RemoveAndKill() readonly ConcurrentDictionary differing = new(StringComparer.OrdinalIgnoreCase); + /// + /// How many pairs are remembered as found different, for the tests. + /// + internal int KnownDiffering => differing.Count; + static (long, DateTime, long, DateTime)? Stamp(TrackedMove move) { try From 1132937ac9b7cdfa6389facdc2ad3c5268aa9288 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:59:58 +1100 Subject: [PATCH 12/50] Stop KeyRegisterTests registering a real global hot key The tests took Ctrl+Alt+Shift+F24 from the whole desktop for the length of each, so they failed wherever something else held it and took it from whatever wanted it meanwhile. What they are about is what happens to a press once a key is bound, which the desktop has no part in. KeyRegister has an internal constructor taking the two calls it makes to register and give back a key, and the public one passes user32's. The tests pass their own, so nothing is registered, and two more pin what the real calls were only assumed to do: a key the desktop refuses is not bound, and every key bound is given back on dispose. Checked by running KeyRegisterTests. Not shown failing first: that would mean holding the key from another process on the owner's desktop. --- src/DiffEngineTray.Tests/KeyRegisterTests.cs | 104 +++++++++++++++---- src/DiffEngineTray/HotKey/KeyRegister.cs | 28 ++++- 2 files changed, 109 insertions(+), 23 deletions(-) diff --git a/src/DiffEngineTray.Tests/KeyRegisterTests.cs b/src/DiffEngineTray.Tests/KeyRegisterTests.cs index c0a3debb..2434ffcd 100644 --- a/src/DiffEngineTray.Tests/KeyRegisterTests.cs +++ b/src/DiffEngineTray.Tests/KeyRegisterTests.cs @@ -8,34 +8,32 @@ /// The filter is called directly here and never through a message loop, so nothing thrown can /// reach WinForms' own handling of it. /// +/// +/// Nothing is registered with the desktop. These used to take Ctrl+Alt+Shift+F24 for the length +/// of each test, a key held for every process on the machine: they failed wherever something +/// else had it, and beside themselves whenever two runs of them overlapped. What they are about +/// is what happens to a press once a key is bound, which the desktop has no part in. +/// /// -[NotInParallel] public class KeyRegisterTests { const int id = 9731; - - // Every modifier and a key no keyboard has, since registering is for the whole desktop for - // as long as the test takes const KeyModifiers modifiers = KeyModifiers.Control | KeyModifiers.Alt | KeyModifiers.Shift; [Test] public async Task AnActionThatThrowsIsReportedAndTheKeyIsStillHandled() { - // No awaiting until the register is disposed: a hot key registered with no window belongs - // to the thread that registered it, which is the one that has to take it back + var desktop = new Desktop(); bool bound; - var handled = false; - using (var register = new KeyRegister(IntPtr.Zero)) + bool handled; + using (var register = desktop.Register()) { bound = register.TryAddBinding( id, modifiers, Keys.F24, () => throw new InvalidOperationException("TheHotKeyFailure")); - if (bound) - { - handled = register.PreFilterMessage(ref HotKeyPressed); - } + handled = register.PreFilterMessage(ref HotKeyPressed); } await Assert.That(bound).IsTrue(); @@ -46,21 +44,91 @@ public async Task AnActionThatThrowsIsReportedAndTheKeyIsStillHandled() [Test] public async Task AnActionRuns() { + var desktop = new Desktop(); bool bound; - var handled = false; + bool handled; var ran = false; - using (var register = new KeyRegister(IntPtr.Zero)) + using (var register = desktop.Register()) { bound = register.TryAddBinding(id, modifiers, Keys.F24, () => ran = true); - if (bound) - { - handled = register.PreFilterMessage(ref HotKeyPressed); - } + handled = register.PreFilterMessage(ref HotKeyPressed); } await Assert.That(bound).IsTrue(); await Assert.That(handled).IsTrue(); await Assert.That(ran).IsTrue(); + await Assert.That(desktop.Asked).IsEquivalentTo([(id, modifiers, Keys.F24)]); + } + + /// + /// A combination something else holds is refused by the desktop, and the press that then + /// never comes must not find an action waiting for it. + /// + [Test] + public async Task AKeyTheDesktopRefusesIsNotBound() + { + var desktop = new Desktop + { + Refuses = true + }; + bool bound; + bool handled; + var ran = false; + using (var register = desktop.Register()) + { + bound = register.TryAddBinding(id, modifiers, Keys.F24, () => ran = true); + handled = register.PreFilterMessage(ref HotKeyPressed); + } + + await Assert.That(bound).IsFalse(); + await Assert.That(handled).IsFalse(); + await Assert.That(ran).IsFalse(); + } + + [Test] + public async Task EveryKeyBoundIsGivenBackOnDispose() + { + var desktop = new Desktop(); + using (var register = desktop.Register()) + { + register.TryAddBinding(id, modifiers, Keys.F24, () => + { + }); + register.TryAddBinding(id + 1, modifiers, Keys.F23, () => + { + }); + } + + await Assert.That(desktop.Held).IsEmpty(); + } + + /// + /// What a register asks of the desktop, answered here: which ids hold a key, and whether the + /// next one asked for is refused. + /// + class Desktop + { + public bool Refuses { get; init; } + + public HashSet Held { get; } = []; + + public List<(int id, KeyModifiers modifiers, Keys key)> Asked { get; } = []; + + public KeyRegister Register() => + new( + IntPtr.Zero, + (_, id, modifiers, key) => + { + Asked.Add((id, modifiers, key)); + if (Refuses) + { + return false; + } + + Held.Add(id); + return true; + }, + (_, id) => Held.Remove(id)); } // WM_HOTKEY, with the binding's id where the message carries it diff --git a/src/DiffEngineTray/HotKey/KeyRegister.cs b/src/DiffEngineTray/HotKey/KeyRegister.cs index 39cc8072..148e48a6 100644 --- a/src/DiffEngineTray/HotKey/KeyRegister.cs +++ b/src/DiffEngineTray/HotKey/KeyRegister.cs @@ -11,10 +11,28 @@ public class KeyRegister : IntPtr handle; Dictionary bindings = []; + Func register; + Func unregister; - public KeyRegister(IntPtr handle) + public KeyRegister(IntPtr handle) : + this(handle, RegisterHotKey, UnregisterHotKey) + { + } + + /// + /// With something other than the desktop to register with, for the tests that are about what + /// happens once a key is pressed. A hot key is taken from the whole desktop, so a test that + /// registers one for real fails wherever something else already holds it, and takes it from + /// whatever would have wanted it while the test runs. + /// + internal KeyRegister( + IntPtr handle, + Func register, + Func unregister) { this.handle = handle; + this.register = register; + this.unregister = unregister; Application.AddMessageFilter(this); } @@ -50,9 +68,9 @@ public bool TryAddBinding(int id, bool shift, bool control, bool alt, string key public bool TryAddBinding(int id, KeyModifiers modifiers, Keys keys, Action action) { - UnregisterHotKey(handle, id); + unregister(handle, id); - if (!RegisterHotKey(handle, id, modifiers, keys)) + if (!register(handle, id, modifiers, keys)) { return false; } @@ -64,7 +82,7 @@ public bool TryAddBinding(int id, KeyModifiers modifiers, Keys keys, Action acti public void ClearBinding(int id) { bindings.Remove(id); - UnregisterHotKey(handle, id); + unregister(handle, id); } public bool PreFilterMessage(ref Message message) @@ -107,7 +125,7 @@ public void Dispose() foreach (var id in bindings.Keys) { - UnregisterHotKey(handle, id); + unregister(handle, id); } } } \ No newline at end of file From d341b5489dc39f9311eb184e1718237794625d84 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:59:58 +1100 Subject: [PATCH 13/50] Track a process as a move's tool only when it was started with the received file A move's process id is a claim, and it was believed when the process holding the id ran the executable the move names. That tells which program a process is and not which window: a stale id Windows had handed to another copy of the same tool, open on another snapshot or started by hand for a merge, was tracked as this pair's and ended when the pair was accepted. Every tool DiffEngine starts is given the two paths as arguments, the received file exactly as the move carries it, so the process is now also asked for its command line and tracked only when that names the received file as the whole of a path. It is the question ProcessCleanup.StillRunning asks before a newer library sends an id, asked again here for a library that does not. Read through NtQueryInformationProcess(ProcessCommandLineInformation), which needs only the handle already held and reads nothing out of the other process's memory. A process's start time was the other candidate and settles nothing: the id is checked as the move arrives, when everything there is to find was started before it, the process that took over a closed tool's id included. Checked by TrackerProcessImageTest with processes the test starts: AnotherCopyOfTheToolIsNotTrackedAndNotEnded, ACopyOfTheToolShowingALongerPathIsNotTracked and AReRunNamingAnotherCopyOfTheToolLeavesTheMoveWithNone fail without the fix, the first with the copy tracked. The tests elsewhere that stand a process in for a diff tool now start it with the received file on its command line, as a tool is. --- src/DiffEngineTray.Tests/FileLockUtils.cs | 15 +- .../TrackerLockedMoveTest.cs | 2 +- src/DiffEngineTray.Tests/TrackerMoveTest.cs | 21 ++- .../TrackerProcessImageTest.cs | 158 +++++++++++++++++- .../TrackerProcessReleaseTest.cs | 2 +- .../TrackerTrackedFilesTest.cs | 2 +- src/DiffEngineTray/ProcessEx.cs | 136 ++++++++++++++- src/DiffEngineTray/Tracker.cs | 4 +- 8 files changed, 321 insertions(+), 19 deletions(-) diff --git a/src/DiffEngineTray.Tests/FileLockUtils.cs b/src/DiffEngineTray.Tests/FileLockUtils.cs index 1f396c06..ff0e241a 100644 --- a/src/DiffEngineTray.Tests/FileLockUtils.cs +++ b/src/DiffEngineTray.Tests/FileLockUtils.cs @@ -1,8 +1,21 @@ static class FileLockUtils { - public static Process StartFileLockProcess(string path) + /// The file the process holds open, with nothing else let in. + /// + /// A received file to name on the command line, for a process standing in for a diff tool + /// showing that pair: the tray tracks a process as a move's tool only when it was started + /// with the move's received file. + /// + public static Process StartFileLockProcess(string path, string? shows = null) { var script = $"$f = [System.IO.File]::Open('{path.Replace("'", "''")}', 'Open', 'ReadWrite', 'None'); [Console]::WriteLine('locked'); Start-Sleep -Seconds 60"; + if (shows is not null) + { + // A comment to the script, and the last thing inside the quotes the command is passed + // in, so the path ends at a quote as it does where a diff tool is handed one + script = $"{script} # {shows}"; + } + var process = new Process { StartInfo = new() diff --git a/src/DiffEngineTray.Tests/TrackerLockedMoveTest.cs b/src/DiffEngineTray.Tests/TrackerLockedMoveTest.cs index 6cf3fa87..7ffbdcdb 100644 --- a/src/DiffEngineTray.Tests/TrackerLockedMoveTest.cs +++ b/src/DiffEngineTray.Tests/TrackerLockedMoveTest.cs @@ -115,7 +115,7 @@ public async Task Ignore_DropsTheKilledProcessFromThePendingMove() (_, _) => LockedFilesResponse.Ignore); var lockProcess = FileLockUtils.StartFileLockProcess(target1); // Stands in for the diff tool: a killable process the move is tracking - var toolProcess = FileLockUtils.StartFileLockProcess(temp2); + var toolProcess = FileLockUtils.StartFileLockProcess(temp2, shows: temp1); try { // Named as the tool, since a process running something else is not tracked diff --git a/src/DiffEngineTray.Tests/TrackerMoveTest.cs b/src/DiffEngineTray.Tests/TrackerMoveTest.cs index 69e8b4cd..e85a4d86 100644 --- a/src/DiffEngineTray.Tests/TrackerMoveTest.cs +++ b/src/DiffEngineTray.Tests/TrackerMoveTest.cs @@ -25,12 +25,19 @@ public async Task AddSame() { await using var tracker = new RecordingTracker(); tracker.AddMove(file1, file1, "theExe", "theArguments", true, null); - using var process = Process.GetCurrentProcess(); - var processId = process.Id; - var tracked = tracker.AddMove(file1, file1, Environment.ProcessPath, "theArguments", false, processId); - await Assert.That(tracker.Moves).HasSingleItem(); - await Assert.That(tracked.Process!.Id).IsEqualTo(process.Id); - await Assert.That(tracker.TrackingAny).IsTrue(); + // Stands in for the diff tool showing the pair, started with the received file as one is + var process = FileLockUtils.StartFileLockProcess(file3, shows: file1); + try + { + var tracked = tracker.AddMove(file1, file1, process.MainModule!.FileName, "theArguments", false, process.Id); + await Assert.That(tracker.Moves).HasSingleItem(); + await Assert.That(tracked.Process!.Id).IsEqualTo(process.Id); + await Assert.That(tracker.TrackingAny).IsTrue(); + } + finally + { + FileLockUtils.Cleanup(process); + } } [Test] @@ -121,7 +128,7 @@ public async Task OpenDiffToolFromAMenuBuiltBeforeTheMoveWasUpdated() var toolLock = file3; // Stands in for an auto refresh diff tool that is still open, which is what DiffRunner // resends the id of - var tool = FileLockUtils.StartFileLockProcess(toolLock); + var tool = FileLockUtils.StartFileLockProcess(toolLock, shows: temp); try { // Nothing at this path exists, so if the launcher gets past the process it starts diff --git a/src/DiffEngineTray.Tests/TrackerProcessImageTest.cs b/src/DiffEngineTray.Tests/TrackerProcessImageTest.cs index a8f1b9ae..0ddff291 100644 --- a/src/DiffEngineTray.Tests/TrackerProcessImageTest.cs +++ b/src/DiffEngineTray.Tests/TrackerProcessImageTest.cs @@ -89,6 +89,161 @@ public async Task AReRunNamingAProcessRunningSomethingElseLeavesTheMoveWithNone( await Assert.That(stranger.WaitForExit(1000)).IsFalse(); } + /// + /// The image says which program a process is, and not which window. A stale id that Windows + /// handed to another copy of the same tool - the one open on the next snapshot along, or one + /// started by hand for a merge - passed on the image alone, was tracked as this pair's, and + /// was ended when the pair was accepted. The tool for a pair was started with its received + /// file, and this one was not. + /// + [Test] + public async Task AnotherCopyOfTheToolIsNotTrackedAndNotEnded() + { + await using var tracker = new RecordingTracker(); + var copy = StartAnotherCopy(shows: Path.Combine(directory, "received", "another.trackerprocessimage")); + try + { + var tracked = tracker.AddMove(temp, target, Image, "theArguments", true, copy.Id); + + await Assert.That(tracked.Process).IsNull(); + await Assert.That(tracked.IsOpen).IsFalse(); + + tracker.Accept(tracked); + + await Assert.That(tracker.Moves).IsEmpty(); + await Assert.That(copy.WaitForExit(1000)).IsFalse(); + } + finally + { + FileLockUtils.Cleanup(copy); + } + } + + /// + /// Open on a file whose path only starts as the received file's does. + /// + [Test] + public async Task ACopyOfTheToolShowingALongerPathIsNotTracked() + { + await using var tracker = new RecordingTracker(); + var copy = StartAnotherCopy(shows: $"{temp}.bak"); + try + { + var tracked = tracker.AddMove(temp, target, Image, "theArguments", true, copy.Id); + + await Assert.That(tracked.Process).IsNull(); + } + finally + { + FileLockUtils.Cleanup(copy); + } + } + + [Test] + public async Task AReRunNamingAnotherCopyOfTheToolLeavesTheMoveWithNone() + { + await using var tracker = new RecordingTracker(); + tracker.AddMove(temp, target, Image, "theArguments", true, stranger.Id); + var copy = StartAnotherCopy(shows: null); + try + { + var tracked = tracker.AddMove(temp, target, Image, "theArguments", true, copy.Id); + + await Assert.That(tracked.Process).IsNull(); + tracker.Accept(tracked); + await Assert.That(copy.WaitForExit(1000)).IsFalse(); + } + finally + { + FileLockUtils.Cleanup(copy); + } + } + + /// + /// What the comparison reads, asked of a process whose command line is known. + /// + [Test] + public async Task TheCommandLineOfAProcessIsRead() + { + var commandLine = ProcessEx.CommandLine(stranger); + + await Assert.That(commandLine).IsNotNull(); + await Assert.That(commandLine!).Contains("-NoProfile"); + await Assert.That(commandLine).Contains(temp); + await Assert.That(ProcessEx.WasStartedFor(commandLine, temp)).IsTrue(); + } + + /// + /// A 32 bit process asked from a 64 bit one, which is most diff tools: they install under + /// Program Files (x86). The command line of one is in another place in its memory, which is + /// why it is asked for rather than read out of there. + /// + [Test] + public async Task TheCommandLineOfA32BitProcessIsRead() + { + var powershell = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), + @"WindowsPowerShell\v1.0\powershell.exe"); + // Nothing to ask where there is no 32 bit side, or no 32 bit PowerShell on it + if (!Environment.Is64BitProcess || + !File.Exists(powershell)) + { + return; + } + + using var process = new Process + { + StartInfo = new() + { + FileName = powershell, + Arguments = $"-NoProfile -Command \"[Console]::WriteLine('ready'); Start-Sleep -Seconds 60 # {temp}\"", + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardOutput = true + } + }; + process.Start(); + try + { + await process.StandardOutput.ReadLineAsync(); + + var commandLine = ProcessEx.CommandLine(process); + + await Assert.That(ProcessEx.WasStartedFor(commandLine, temp)).IsTrue(); + } + finally + { + process.Kill(); + process.WaitForExit(5000); + } + } + + [Test] + public async Task ACommandLineNamesAPathOnlyAsTheWholeOfAnArgument() + { + const string path = @"C:\temp\Sample.received.txt"; + + await Assert.That(ProcessEx.WasStartedFor($"\"tool.exe\" \"C:\\code\\Sample.verified.txt\" \"{path}\"", path)).IsTrue(); + await Assert.That(ProcessEx.WasStartedFor($"\"tool.exe\" /left:\"{path}\" /right:\"C:\\code\\Sample.verified.txt\"", path)).IsTrue(); + await Assert.That(ProcessEx.WasStartedFor($"tool.exe {path} other", path)).IsTrue(); + await Assert.That(ProcessEx.WasStartedFor($"tool.exe {path.ToUpperInvariant()}", path)).IsTrue(); + // Found first as the start of a longer path, and then as itself + await Assert.That(ProcessEx.WasStartedFor($"tool.exe \"{path}.bak\" \"{path}\"", path)).IsTrue(); + await Assert.That(ProcessEx.WasStartedFor($"tool.exe \"{path}.bak\"", path)).IsFalse(); + await Assert.That(ProcessEx.WasStartedFor("tool.exe \"C:\\temp\\Other.received.txt\"", path)).IsFalse(); + await Assert.That(ProcessEx.WasStartedFor(null, path)).IsFalse(); + } + + /// + /// A second process running the image the first does, started with another file or with none. + /// + Process StartAnotherCopy(string? shows) + { + var locked = Path.Combine(directory, $"locked-{Guid.NewGuid():N}.txt"); + File.WriteAllText(locked, ""); + return FileLockUtils.StartFileLockProcess(locked, shows); + } + [Test] public async Task AMoveNamingNoToolIsNotGivenAProcess() { @@ -113,7 +268,8 @@ public TrackerProcessImageTest() File.WriteAllText(target, "verified"); var locked = Path.Combine(directory, "locked.txt"); File.WriteAllText(locked, ""); - stranger = FileLockUtils.StartFileLockProcess(locked); + // Started with the received file on its command line, as a diff tool showing the pair is + stranger = FileLockUtils.StartFileLockProcess(locked, shows: temp); } public void Dispose() diff --git a/src/DiffEngineTray.Tests/TrackerProcessReleaseTest.cs b/src/DiffEngineTray.Tests/TrackerProcessReleaseTest.cs index 93d5417d..3faa8be9 100644 --- a/src/DiffEngineTray.Tests/TrackerProcessReleaseTest.cs +++ b/src/DiffEngineTray.Tests/TrackerProcessReleaseTest.cs @@ -112,7 +112,7 @@ public TrackerProcessReleaseTest() File.WriteAllText(target, "verified"); var locked = Path.Combine(directory, "locked.txt"); File.WriteAllText(locked, ""); - tool = FileLockUtils.StartFileLockProcess(locked); + tool = FileLockUtils.StartFileLockProcess(locked, shows: temp); } public void Dispose() diff --git a/src/DiffEngineTray.Tests/TrackerTrackedFilesTest.cs b/src/DiffEngineTray.Tests/TrackerTrackedFilesTest.cs index cc1280ef..843b694b 100644 --- a/src/DiffEngineTray.Tests/TrackerTrackedFilesTest.cs +++ b/src/DiffEngineTray.Tests/TrackerTrackedFilesTest.cs @@ -288,7 +288,7 @@ public async Task AMoveArrivingAgainOverTheViewerPortKeepsAnotherToolAndItsProce await File.WriteAllTextAsync(temp, "content"); // Stands in for the diff tool the sender started for the pair. A process of its own, // since the tray kills the tool of a move it may kill - var tool = FileLockUtils.StartFileLockProcess(file); + var tool = FileLockUtils.StartFileLockProcess(file, shows: temp); try { // Named as the tool, since a process running something else is not tracked diff --git a/src/DiffEngineTray/ProcessEx.cs b/src/DiffEngineTray/ProcessEx.cs index 19a8ebe5..564898de 100644 --- a/src/DiffEngineTray/ProcessEx.cs +++ b/src/DiffEngineTray/ProcessEx.cs @@ -75,13 +75,19 @@ public static bool TryGet(int id, [NotNullWhen(true)] out Process? process) /// ended. /// An image that cannot be read. One this account cannot open was never held by /// either, and one that has exited has nothing left to end. + /// Another copy of the tool, which is running the right image for another pair or for + /// somebody's own use: see . /// /// /// A launcher that is itself an executable - a shim that starts the real tool and waits - is /// the image the sender started and the id it sent, so it matches as it always did. /// /// - public static bool TryGetTool(int id, string? exe, [NotNullWhen(true)] out Process? process) + /// + /// The received file of the move, which the tool showing the pair was started with: see + /// . + /// + public static bool TryGetTool(int id, string? exe, string temp, [NotNullWhen(true)] out Process? process) { if (!TryGet(id, out process)) { @@ -89,21 +95,141 @@ public static bool TryGetTool(int id, string? exe, [NotNullWhen(true)] out Proce } var image = ImagePath(process); - if (IsSameExecutable(image, exe)) + if (!IsSameExecutable(image, exe)) + { + Log.Warning( + "Process {Id} is not tracked as the diff tool: it is running `{Image}` and the move names `{Exe}`", + id, + image ?? "an image that could not be read", + exe ?? "no tool"); + process.Dispose(); + process = null; + return false; + } + + if (WasStartedFor(CommandLine(process), temp)) { return true; } Log.Warning( - "Process {Id} is not tracked as the diff tool: it is running `{Image}` and the move names `{Exe}`", + "Process {Id} is not tracked as the diff tool: it is running `{Image}` and was not started with `{Temp}`", id, - image ?? "an image that could not be read", - exe ?? "no tool"); + image, + temp); process.Dispose(); process = null; return false; } + /// + /// Whether a process running the tool is the one showing this pair, by whether it was started + /// with the received file on its command line. + /// + /// The image says which program a process is and not which window. A stale id handed to + /// another copy of the same tool - the one open on the next snapshot along, or one somebody + /// started by hand for a merge - passed on the image, was tracked as this pair's, and was + /// ended when the pair was accepted. Every tool DiffEngine starts is given the two paths as + /// arguments, the received file among them exactly as the move carries it, and + /// ProcessCleanup.StillRunning asks the same of the command line before a newer library + /// sends an id at all. This is that question asked again here, for a library that does not. + /// + /// + /// A process's start time was the other candidate and settles nothing: the id is checked as + /// the move arrives, when every process there is to find was started before it, the one that + /// took over a closed tool's id included. + /// + /// + /// A command line that cannot be read is not known to be the tool's, and is treated as every + /// other such case is. + /// + /// + internal static bool WasStartedFor(string? commandLine, string temp) + { + if (commandLine is null || + temp.Length == 0) + { + return false; + } + + var from = 0; + while (true) + { + var found = commandLine.IndexOf(temp, from, StringComparison.OrdinalIgnoreCase); + if (found < 0) + { + return false; + } + + // The whole of an argument's path, and not the start of a longer one: the tool open + // on `Sample.received.txt.bak` was not started for `Sample.received.txt` + var end = found + temp.Length; + if (end == commandLine.Length || + commandLine[end] == '"' || + char.IsWhiteSpace(commandLine[end])) + { + return true; + } + + from = found + 1; + } + } + + [DllImport("ntdll.dll", ExactSpelling = true)] + static extern int NtQueryInformationProcess(SafeProcessHandle process, int informationClass, IntPtr information, int length, out int returned); + + // ProcessCommandLineInformation. Answers with a UNICODE_STRING and the characters after it, in + // one buffer, and needs no more than the right to query the process: nothing is read out of + // the other process's memory, so it is the same call whatever the bitness of either side + const int processCommandLine = 60; + + /// + /// The command line a process was started with, asked of the handle that is held, or null + /// when it will not say. + /// + internal static string? CommandLine(Process process) + { + try + { + var handle = process.SafeHandle; + // Fails for want of room, and says how much it wants + NtQueryInformationProcess(handle, processCommandLine, IntPtr.Zero, 0, out var length); + if (length <= 0) + { + return null; + } + + var buffer = Marshal.AllocHGlobal(length); + try + { + if (NtQueryInformationProcess(handle, processCommandLine, buffer, length, out _) != 0) + { + return null; + } + + // Length in bytes, then MaximumLength, then the pointer at its natural alignment + var bytes = (ushort) Marshal.ReadInt16(buffer); + var text = Marshal.ReadIntPtr(buffer, IntPtr.Size); + if (text == IntPtr.Zero) + { + return null; + } + + return Marshal.PtrToStringUni(text, bytes / 2); + } + finally + { + Marshal.FreeHGlobal(buffer); + } + } + catch (Exception exception) + when (exception is Win32Exception or InvalidOperationException or EntryPointNotFoundException) + { + // Exited, or no longer this account's to ask + return null; + } + } + /// /// By file name and not by path. One executable has several paths - through a junction, a /// substituted drive, a short name, another case - and the one the sender resolved need not be diff --git a/src/DiffEngineTray/Tracker.cs b/src/DiffEngineTray/Tracker.cs index 668b8bcc..595b451c 100644 --- a/src/DiffEngineTray/Tracker.cs +++ b/src/DiffEngineTray/Tracker.cs @@ -259,7 +259,7 @@ public TrackedMove AddMove( Process? process = null; if (processId != null) { - ProcessEx.TryGetTool(processId.Value, exe, out process); + ProcessEx.TryGetTool(processId.Value, exe, temp, out process); } var move = BuildTrackedMove(temp, exe, arguments, canKill, target, process); @@ -290,7 +290,7 @@ public TrackedMove AddMove( existing.Process = null; // Against the tool the pair was tracked with when this move names none, as // Retarget keeps that one - ProcessEx.TryGetTool(processId.Value, exe ?? existing.Exe, out process); + ProcessEx.TryGetTool(processId.Value, exe ?? existing.Exe, temp, out process); } var move = exe == null From 0b2833b74280f50fee1e3bbb2829615673d844d1 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:48:56 +1100 Subject: [PATCH 14/50] Hold a failed compose against its size rather than against the picture ImageCache remembered that a compose on the pool had failed as a flag on the picture, so that a pane asking on every step of its spinner did not start it again for good. What fails is nearly always the memory for one size, the whole of a large picture at half its own, and the flag also stopped the fitted copy being made again: after the next resize the pane had the copy from before it stretched into place for as long as the entry was on screen. What failed is now kept as the size and the way of building it. That one is still not started again, and any other is. AComposeThatFailsLeavesTheOtherSizesToBeMade was run against the flag and failed there, waiting for a fitted compose that was never started. --- .../ImageCacheTests.cs | 38 +++++++++++++++++++ src/DiffEngineViewer.Windows/ImageCache.cs | 28 ++++++++++---- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/DiffEngineViewer.Windows.Tests/ImageCacheTests.cs b/src/DiffEngineViewer.Windows.Tests/ImageCacheTests.cs index 127de1b0..e24cbaae 100644 --- a/src/DiffEngineViewer.Windows.Tests/ImageCacheTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/ImageCacheTests.cs @@ -356,6 +356,44 @@ public async Task AComposeThatFailsIsNotTriedAgain() await Assert.That(attempts).IsEqualTo(1); } + /// + /// What failed was that size made that way, and nothing else is held against the picture. An + /// enlarged copy there was no memory for used to stop the fitted one being made again too, so + /// after the next resize the pane had the old size stretched into place for good. + /// + [Test] + public async Task AComposeThatFailsLeavesTheOtherSizesToBeMade() + { + var path = Write("uncomposable-at-one-size.png", SamplePng.Build(8, 6, 200, 40, 40)); + var posted = new Posts(); + using var cache = new ImageCache(posted.Add); + cache.Get(path, null); + var attempts = 0; + Func enlarged = (_, _) => + { + attempts++; + throw new InvalidOperationException("Out of memory."); + }; + cache.Composite(path, new(4, 3), Build, () => { }); + (await posted.Take())(); + + cache.Composite(path, new(400, 300), enlarged, () => { }); + (await posted.Take())(); + + // The fitted copy at a new size, which is what a resize asks for + cache.Composite(path, new(6, 4), Build, () => { }); + (await posted.Take())(); + await Assert.That(cache.Composite(path, new(6, 4), Build, () => { })!.Size).IsEqualTo(new(6, 4)); + + // And the one that failed is still not tried again, while another size of it is + cache.Composite(path, new(400, 300), enlarged, () => { }); + await Assert.That(posted.Count).IsEqualTo(0); + await Assert.That(attempts).IsEqualTo(1); + cache.Composite(path, new(200, 150), enlarged, () => { }); + (await posted.Take())(); + await Assert.That(attempts).IsEqualTo(2); + } + static Bitmap Build(Image picture, Size size) => new(size.Width, size.Height); diff --git a/src/DiffEngineViewer.Windows/ImageCache.cs b/src/DiffEngineViewer.Windows/ImageCache.cs index 2192dfe0..7643992b 100644 --- a/src/DiffEngineViewer.Windows/ImageCache.cs +++ b/src/DiffEngineViewer.Windows/ImageCache.cs @@ -92,11 +92,23 @@ Composite is { } composite && public Size? Composing { get; set; } /// - /// A compose on the pool failed, so none is started again: the pane would ask on every - /// step of its spinner, which would turn for good. Drawn as nothing, as a picture that - /// cannot be decoded is. + /// The composes on the pool that failed, each a size and a way of building it, so the + /// same one is not started again: the pane would ask on every step of its spinner, which + /// would turn for good. Drawn as nothing, as a picture that cannot be decoded is. + /// + /// A size's rather than the picture's. What fails is nearly always the memory for one + /// size, the whole of a large picture at half its own, and held against the picture that + /// also stopped the fitted copy being made again when the window was next resized, so + /// the one from before the resize was stretched into place for good. + /// /// - public bool Uncomposable { get; set; } + readonly HashSet<(Size Size, Func Build)> uncomposable = []; + + public bool Uncomposable(Size size, Func build) => + uncomposable.Contains((size, build)); + + public void Failed(Size size, Func build) => + uncomposable.Add((size, build)); /// /// Composes reading on the pool, and whether the cache has let go of @@ -343,7 +355,7 @@ void Loaded(string path, Stamp stamp, Image? image, Action loaded) } if (entry.Composing is null && - !entry.Uncomposable && + !entry.Uncomposable(size, build) && entry.TryRead()) { entry.Composing = size; @@ -360,13 +372,13 @@ void Loaded(string path, Stamp stamp, Image? image, Action loaded) entry.EndRead(); } }, - built => Landed(path, entry, built, build, loaded)); + built => Landed(path, entry, size, built, build, loaded)); } return entry.Composite; } - void Landed(string path, Entry entry, Bitmap? built, Func build, Action loaded) + void Landed(string path, Entry entry, Size size, Bitmap? built, Func build, Action loaded) { entry.Composing = null; // Only into the entry it was made from. One the cache has since let go of, for a picture @@ -381,7 +393,7 @@ void Landed(string path, Entry entry, Bitmap? built, Func b if (built is null) { - entry.Uncomposable = true; + entry.Failed(size, build); // Repainted, so the spinner it was showing goes loaded(); return; From 954b3247b9ccaf1c71a656d53aa21bb2a7361757 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:48:56 +1100 Subject: [PATCH 15/50] Draw an ampersand in a footer button's label as an ampersand The footer's buttons left UseMnemonic on, as the status label once did. A label is the model's words, and an ampersand in one was not drawn: the letter after it was underlined and became an Alt chord that pressed the button. A_footer_button_does_not_read_one_as_a_mnemonic was run without the change and failed. The button row is named so the test can find it. --- .../AmpersandTests.cs | 27 +++++++++++++++++++ src/DiffEngineViewer.Windows/ViewerForm.cs | 7 ++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/DiffEngineViewer.Windows.Tests/AmpersandTests.cs b/src/DiffEngineViewer.Windows.Tests/AmpersandTests.cs index 7819f7c1..4d22d027 100644 --- a/src/DiffEngineViewer.Windows.Tests/AmpersandTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/AmpersandTests.cs @@ -31,4 +31,31 @@ public async Task The_status_line_does_not_read_one_as_a_mnemonic() await Assert.That(status.UseMnemonic).IsFalse(); } + + /// + /// Nor a footer button, whose label is the model's as the status is. One that did made the + /// letter after the ampersand an Alt chord that pressed it. + /// + [Test] + public async Task A_footer_button_does_not_read_one_as_a_mnemonic() + { + using var form = new ViewerForm("title", 800, 600); + var screen = ScreenBuilder.Build(Fixtures.File()); + + form.Apply( + screen with + { + Buttons = [new("Accept R&D", true, CommandKind.Accept), .. screen.Buttons] + }); + + var buttons = form.Controls + .Find("buttons", true) + .Single() + .Controls + .OfType() + .ToList(); + await Assert.That(buttons.Count).IsGreaterThan(1); + await Assert.That(buttons[0].Text).IsEqualTo("Accept R&D"); + await Assert.That(buttons.All(_ => !_.UseMnemonic)).IsTrue(); + } } diff --git a/src/DiffEngineViewer.Windows/ViewerForm.cs b/src/DiffEngineViewer.Windows/ViewerForm.cs index e29fa09e..9c42da49 100644 --- a/src/DiffEngineViewer.Windows/ViewerForm.cs +++ b/src/DiffEngineViewer.Windows/ViewerForm.cs @@ -12,6 +12,7 @@ sealed class ViewerForm : Form readonly FlowLayoutPanel buttonRow = new() { + Name = "buttons", Dock = DockStyle.Left, AutoSize = true, WrapContents = false, @@ -649,7 +650,11 @@ void ApplyButtons(Screen screen) // Standard rather than System: WinForms draws these itself, including in dark // mode, so their pixels are pinned to the .NET version rather than to whatever // the OS build's theme renderer does with a Win32 button. - FlatStyle = FlatStyle.Standard + FlatStyle = FlatStyle.Standard, + // A label is the model's words, and an ampersand in one is an ampersand. Read as + // a mnemonic it is not drawn, and the letter after it becomes an Alt chord that + // presses the button. + UseMnemonic = false }; button.Click += (_, _) => discrete.Enqueue(new(Button: index)); pool.Add(button); From 6df4f24dab3a7b17b211a01fe1be93a6ad81d706 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:00:12 +1100 Subject: [PATCH 16/50] Keep a decoded picture premultiplied, as the buffer it is painted into is Between half its own size and its own size an enlarged picture is scaled on every paint, straight from the decoded picture, since a copy of the whole of it at that size would be up to the decoded picture again. The decoded picture was kept as the decoder hands it over, so GDI+ multiplied every pixel it read by its alpha on every one of those paints. ImageCache.Load now copies the decode into Format32bppPArgb, once. PicturePaintBenchmarks, a pair of 4000 by 3000 pictures at 400% in the window a viewer opens at, fifteen iterations, on a machine busy with other builds: before after Still 20.2 ms 8.6 ms Dragged 15.4 ms 9.3 ms 150% and 200%, which copy from a scaled copy, are 2 ms either way. No more memory is held. What it costs is that a translucent pixel is rounded when it is multiplied rather than after it is filtered. Against the committed baselines the five scenes with a picture in them differ by one level in 255, in translucent pixels only (1,006 pixels in Images, 54,608 in ImagesEnlarged), and by nothing in an opaque one. All of them still pass at the 0.9999 the suite compares with, so no baseline is replaced. DecodesPremultiplied failed against the decode as it was. --- .../ImageCacheTests.cs | 36 +++++++++++++++++++ src/DiffEngineViewer.Windows/ImageCache.cs | 32 ++++++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/DiffEngineViewer.Windows.Tests/ImageCacheTests.cs b/src/DiffEngineViewer.Windows.Tests/ImageCacheTests.cs index e24cbaae..d3730433 100644 --- a/src/DiffEngineViewer.Windows.Tests/ImageCacheTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/ImageCacheTests.cs @@ -23,6 +23,42 @@ public async Task DecodesOnceAndKeepsIt() await Assert.That(ReferenceEquals(cache.Get(path, null), first)).IsTrue(); } + /// + /// Kept with its colours multiplied by their alpha, which is what a paint's buffer holds, so + /// drawing from it converts nothing: the way a decoder hands it over, every paint of an + /// enlarged picture multiplied every pixel it read. An opaque pixel is the one in the file, + /// and a translucent one keeps its alpha. + /// + [Test] + public async Task DecodesPremultiplied() + { + var path = Write("premultiplied.png", SamplePng.Build(8, 6, 200, 40, 40)); + using var cache = new ImageCache(); + using var file = new Bitmap(path); + + var picture = (Bitmap) cache.Get(path, null)!; + + await Assert.That(picture.PixelFormat).IsEqualTo(System.Drawing.Imaging.PixelFormat.Format32bppPArgb); + var translucent = 0; + for (var x = 0; x < 8; x++) + { + var expected = file.GetPixel(x, 0); + var kept = picture.GetPixel(x, 0); + await Assert.That(kept.A).IsEqualTo(expected.A); + if (expected.A == 255) + { + await Assert.That(kept).IsEqualTo(expected); + } + else + { + translucent++; + } + } + + // Or the sample has stopped fading out, and this compares only what cannot differ + await Assert.That(translucent).IsGreaterThan(0); + } + /// /// The hazard this cache is written around. GDI+ holds the stream it was handed for as long as /// the image lives, so decoding straight from the file would make the viewer the reason its own diff --git a/src/DiffEngineViewer.Windows/ImageCache.cs b/src/DiffEngineViewer.Windows/ImageCache.cs index 7643992b..69f78fbb 100644 --- a/src/DiffEngineViewer.Windows/ImageCache.cs +++ b/src/DiffEngineViewer.Windows/ImageCache.cs @@ -496,7 +496,7 @@ bool TryCached(string path, Stamp stamp, out Image? image) // received file is one that blocks the accept it exists to perform. using var stream = new MemoryStream(FileSide.ReadBytes(path)); using var decoded = new Bitmap(stream); - return new Bitmap(decoded); + return Premultiplied(decoded); } catch { @@ -504,6 +504,36 @@ bool TryCached(string path, Stamp stamp, out Image? image) } } + /// + /// A copy of with its colours already multiplied by their alpha, + /// which is what the double buffer a paint draws into holds. Kept the way a decoder hands it + /// over, GDI+ multiplied every pixel it read on every paint that drew from it. For a picture + /// enlarged to between half its size and its own, which is scaled on every paint, that was + /// 15 ms a paint for a pair of 4000 by 3000 pictures and is 9. + /// + /// Not the same bytes on screen: a translucent pixel is rounded when it is multiplied rather + /// than after it is filtered, which moves it by one level in 255 at most and an opaque one + /// not at all. + /// + /// + static Bitmap Premultiplied(Bitmap decoded) + { + var copy = new Bitmap(decoded.Width, decoded.Height, PixelFormat.Format32bppPArgb); + try + { + using var graphics = Graphics.FromImage(copy); + // Its pixels and nothing under them, so nothing to blend with + graphics.CompositingMode = CompositingMode.SourceCopy; + graphics.DrawImage(decoded, new Rectangle(0, 0, decoded.Width, decoded.Height)); + return copy; + } + catch + { + copy.Dispose(); + throw; + } + } + void Forget(string path) { if (entries.Remove(path, out var entry)) From f8993aab15180de4a8a0633a9427a951492621c6 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:00:13 +1100 Subject: [PATCH 17/50] Prove by throwing that an exception comes out of a pump in the test host The mode the module initializer sets was only read back, through an internal of WinForms, because finding out by throwing is what put WinForms' dialog on a desktop. It can be thrown where no dialog is reachable. NativeWindow.Callback catches what a WndProc throws and either rethrows it, in the mode asked for, or hands it to the window's OnThreadException. It is Control's override of that which goes on to the dialog; a bare NativeWindow's does nothing. So the new test throws from a bare, message only window: in the right mode the exception comes out of the DoEvents that dispatched the message, and in the wrong one it would be swallowed and the test would fail having shown nothing. Under that, the throwing thread has a handler on Application.ThreadException, which is what WinForms looks for before it makes a dialog. The thread is the test's own and catches everything. Not run against a host without the mode: that is the rule, and the test does not need it to be safe, but it has only been seen to pass. --- .../UnhandledExceptionTests.cs | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/src/DiffEngineViewer.Windows.Tests/UnhandledExceptionTests.cs b/src/DiffEngineViewer.Windows.Tests/UnhandledExceptionTests.cs index c493b144..0cf4ae02 100644 --- a/src/DiffEngineViewer.Windows.Tests/UnhandledExceptionTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/UnhandledExceptionTests.cs @@ -27,4 +27,117 @@ public async Task AWindowOnATestThreadLetsAnExceptionThrough() await Assert.That(lets).IsTrue(); } + + /// + /// And found out by throwing, which the test above cannot do: it reads an internal by name, + /// and says what WinForms intends rather than what a pump does. + /// + /// Thrown from a bare rather than from a control. Every window + /// WinForms makes has the one callback, which catches what its WndProc throws and either + /// throws it on, in the mode the module initializer asks for, or hands it to the window's + /// OnThreadException. It is a control's that goes on to the dialog. A bare window's does + /// nothing at all, so were the mode not the one asked for, the exception would be swallowed + /// and this would fail having shown nothing. In the mode asked for it comes out of the + /// DoEvents that dispatched the message, which is what a failing test relies on. + /// + /// + /// And a second net under that one, since being wrong is somebody's desktop: the dialog is + /// WinForms' answer only when nothing has asked for the exception, so the thread that throws + /// asks for it first, with a handler on . + /// + /// + /// On a thread of its own, since that handler is a thread's and a test's continuation need + /// not be on the thread it started on, and to a window that is only ever a place to send + /// messages. Everything is caught there: an exception leaving a thread ends the process. + /// + /// + [Test] + public async Task AnExceptionInAWindowMessageComesOutOfThePump() + { + Exception? cameOut = null; + Exception? handled = null; + Exception? unexpected = null; + var thread = new Thread( + () => + { + ThreadExceptionEventHandler net = (_, args) => handled = args.Exception; + try + { + // Before anything can throw + Application.ThreadException += net; + var window = new Thrower(); + window.CreateHandle( + new() + { + Parent = messageOnly + }); + try + { + PostMessage(window.Handle, Thrower.Throw, IntPtr.Zero, IntPtr.Zero); + try + { + Application.DoEvents(); + } + catch (Exception exception) + { + cameOut = exception; + } + } + finally + { + window.DestroyHandle(); + } + } + catch (Exception exception) + { + unexpected = exception; + } + finally + { + Application.ThreadException -= net; + } + }) + { + IsBackground = true + }; + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); + // Nothing here waits on anything but a posted message. Long, since all it bounds is a + // run that would otherwise never end + var finished = await Task.Run(() => thread.Join(TimeSpan.FromMinutes(1))); + + await Assert.That(finished).IsTrue(); + await Assert.That(unexpected).IsNull(); + await Assert.That(handled).IsNull(); + await Assert.That(cameOut?.Message).IsEqualTo(Thrower.Said); + } + + /// + /// A window with no place on any screen: a child of HWND_MESSAGE is never shown, listed or + /// drawn. + /// + static readonly IntPtr messageOnly = new(-3); + + sealed class Thrower : NativeWindow + { + /// + /// The first of the messages Windows leaves to an application. + /// + public const int Throw = 0x8000; + + public const string Said = "Thrown inside a window message."; + + protected override void WndProc(ref Message message) + { + if (message.Msg == Throw) + { + throw new InvalidOperationException(Said); + } + + base.WndProc(ref message); + } + } + + [DllImport("user32.dll")] + static extern bool PostMessage(IntPtr window, int message, IntPtr wParam, IntPtr lParam); } From 8e29229738261e2e8801068b94f35424942a27db Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:00:13 +1100 Subject: [PATCH 18/50] Keep the keyboard of whoever is at the machine out of the tests that post input TwoKeysInOnePumpAreTwoCommands, ATextEntryHasNoPictureForTheWheelToFind and TheWheelOverAPictureZoomsAndOverTheRowsScrolls failed once while somebody was using the machine. Two things about the keyboard reached them. A key message carries no modifiers and WinForms reads a wheel turn the same way: both are put beside Control.ModifierKeys, which is the thread's own table of what is held, and that follows the keyboard whenever input reaches the thread. With Alt in that table a posted Down is no command, and with Control a wheel turn over the rows zooms, which are the failures seen. The hosts now say that no modifier is held before each message is read (ThreadKeys), for the calling thread only. And the forms were the foreground window. Shown the ordinary way a form is activated, and parked off every display it still had the keyboard: what was typed at the machine while a test ran went to the test, as its commands, and not to what it was typed into. ViewerForm.Parked shows it without activating it, the tests' own forms are a ParkedForm, and a capture parks the window it shows for itself, which had the same effect for as long as it took. Checked without sending anything to the desktop. With Alt or Control set in the thread's table and the hosts not clearing it, the first two tests failed as reported; with the hosts clearing it they pass, which APostedKeyIsNoChordWhateverTheThreadTakesToBeHeld and WithControlHeldTheWheelZoomsOverTheRows now hold. A ViewerForm shown as the tests showed it was GetForegroundWindow; AFormATestPostsToDoesNotTakeTheKeyboard holds that it is not. --- .../EnlargedPictureTests.cs | 2 +- .../FormsHeadTests.cs | 56 ++++++++++++++-- .../PaneHitTests.cs | 2 +- .../ParkedForm.cs | 13 ++++ .../PictureZoomTests.cs | 36 +++++++++- .../ThreadKeys.cs | 65 +++++++++++++++++++ .../FormsViewerWindow.cs | 5 +- src/DiffEngineViewer.Windows/ViewerForm.cs | 13 ++++ 8 files changed, 183 insertions(+), 9 deletions(-) create mode 100644 src/DiffEngineViewer.Windows.Tests/ParkedForm.cs create mode 100644 src/DiffEngineViewer.Windows.Tests/ThreadKeys.cs diff --git a/src/DiffEngineViewer.Windows.Tests/EnlargedPictureTests.cs b/src/DiffEngineViewer.Windows.Tests/EnlargedPictureTests.cs index f44dc949..cd63ae81 100644 --- a/src/DiffEngineViewer.Windows.Tests/EnlargedPictureTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/EnlargedPictureTests.cs @@ -357,7 +357,7 @@ static string Write(string name, bool across) /// sealed class Host : IDisposable { - readonly Form form = new() + readonly Form form = new ParkedForm { StartPosition = FormStartPosition.Manual, Location = new(-4000, -2000), diff --git a/src/DiffEngineViewer.Windows.Tests/FormsHeadTests.cs b/src/DiffEngineViewer.Windows.Tests/FormsHeadTests.cs index b7b2bd45..0abd30ca 100644 --- a/src/DiffEngineViewer.Windows.Tests/FormsHeadTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/FormsHeadTests.cs @@ -543,6 +543,48 @@ public async Task TwoKeysInOnePumpAreTwoCommands() await Assert.That(after - before).IsEqualTo(2); } + /// + /// A key posted by one of these tests is that key, on a thread that takes Alt to be down as + /// much as on any other. A form reads a key message beside whatever its thread takes to be + /// held, and Alt with Down is no command: these failed, once, on a machine somebody was + /// using, the way this did until a frame said what was held before pumping. + /// + [Test] + public async Task APostedKeyIsNoChordWhateverTheThreadTakesToBeHeld() + { + using var host = new FormHost(Fixtures.File(Lines(300, 3), Lines(300))); + host.Settle(); + var before = ScreenBuilder.Build(host.State).Left.ScrollTop; + + ThreadKeys.Hold(Keys.Menu); + host.PostKey(Keys.Down); + host.Frame(); + + await Assert.That(ScreenBuilder.Build(host.State).Left.ScrollTop - before).IsEqualTo(1); + } + + /// + /// The form these tests post to is never the window the keyboard goes to, and neither is the + /// one a canvas is hosted in. Each was, shown the ordinary way: off every display and still + /// the foreground window, so whatever was typed at the machine while a test ran was taken + /// from what it was meant for and applied here as commands. + /// + [Test] + public async Task AFormATestPostsToDoesNotTakeTheKeyboard() + { + using var host = new FormHost(Fixtures.File()); + host.Settle(); + using var canvas = new CanvasHost(); + Application.DoEvents(); + + var foreground = GetForegroundWindow(); + await Assert.That(foreground).IsNotEqualTo(host.Form.Handle); + await Assert.That(foreground).IsNotEqualTo(canvas.Canvas.FindForm()!.Handle); + } + + [DllImport("user32.dll")] + static extern IntPtr GetForegroundWindow(); + /// /// d pressed while one entry is on screen, then a click on another row, both before the /// pump runs. In the order they happened, the first entry is discarded and the second selected. @@ -865,7 +907,7 @@ public async Task LosingCaptureMidDragEndsTheDrag() SendMessage(canvas.Handle, leftButtonDown, leftButtonFlag, Point(press.X, press.Y)); var captured = canvas.Capture; - using var other = new Form + using var other = new ParkedForm { StartPosition = FormStartPosition.Manual, Location = new(-4000, -2000), @@ -898,7 +940,7 @@ public async Task LosingCaptureMidSplitterDragEndsTheDrag() var y = canvas.BodyTop() + 40; SendMessage(canvas.Handle, leftButtonDown, leftButtonFlag, Point(splitter, y)); - using var other = new Form + using var other = new ParkedForm { StartPosition = FormStartPosition.Manual, Location = new(-4000, -2000), @@ -1202,7 +1244,7 @@ struct ScrollBarInfo /// sealed class CanvasHost : IDisposable { - readonly Form form = new() + readonly Form form = new ParkedForm { StartPosition = FormStartPosition.Manual, Location = new(-4000, -2000), @@ -1266,7 +1308,10 @@ public FormHost(SessionState state) { StartPosition = FormStartPosition.Manual, Location = new(-4000, -2000), - ShowInTaskbar = false + ShowInTaskbar = false, + // Or it is the foreground window for as long as the test runs, and whatever is + // typed at the machine meanwhile arrives here beside what the test posts + Parked = true }; Form.Show(); Canvas = Field(Form, "canvas"); @@ -1281,6 +1326,9 @@ public FormHost(SessionState state) public ViewerInput Frame() { Form.Apply(ScreenBuilder.Build(State)); + // What is posted here is a key and no chord, whatever is held at the keyboard as + // this runs: see ThreadKeys + ThreadKeys.ReleaseModifiers(); Application.DoEvents(); var input = Form.Drain(); Apply(input); diff --git a/src/DiffEngineViewer.Windows.Tests/PaneHitTests.cs b/src/DiffEngineViewer.Windows.Tests/PaneHitTests.cs index 779ad1b9..de45c85d 100644 --- a/src/DiffEngineViewer.Windows.Tests/PaneHitTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/PaneHitTests.cs @@ -189,7 +189,7 @@ public async Task WithNoQueueTheLeftPaneStartsAtTheEdge() /// sealed class Host : IDisposable { - readonly Form form = new() + readonly Form form = new ParkedForm { StartPosition = FormStartPosition.Manual, Location = new(-2000, -2000), diff --git a/src/DiffEngineViewer.Windows.Tests/ParkedForm.cs b/src/DiffEngineViewer.Windows.Tests/ParkedForm.cs new file mode 100644 index 00000000..2cb7f36d --- /dev/null +++ b/src/DiffEngineViewer.Windows.Tests/ParkedForm.cs @@ -0,0 +1,13 @@ +/// +/// A window for a test to put a canvas in, shown so that it will paint and take messages and +/// never made the window the keyboard goes to. A form shown the ordinary way is activated, and +/// off every display it was still the foreground window: for as long as a test ran, what the +/// person at the machine typed went to it rather than to what they were typing into, and reached +/// the canvas as its own commands. +/// +[System.ComponentModel.DesignerCategory("")] +sealed class ParkedForm : Form +{ + protected override bool ShowWithoutActivation => + true; +} diff --git a/src/DiffEngineViewer.Windows.Tests/PictureZoomTests.cs b/src/DiffEngineViewer.Windows.Tests/PictureZoomTests.cs index 67bf20d3..62b1199f 100644 --- a/src/DiffEngineViewer.Windows.Tests/PictureZoomTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/PictureZoomTests.cs @@ -67,6 +67,28 @@ public async Task ATextEntryHasNoPictureForTheWheelToFind() await Assert.That(scrolled).IsEqualTo(1); } + /// + /// With control held the wheel is for the picture wherever the pointer is, as it is in + /// everything else that shows one. Held is what the thread takes to be held, which is also + /// why the tests beside this one say that nothing is. + /// + [Test] + public async Task WithControlHeldTheWheelZoomsOverTheRows() + { + using var host = new Host(); + host.Draw(Fixtures.File()); + var zoomed = 0; + var scrolled = 0; + host.Canvas.Zoomed += _ => zoomed += _; + host.Canvas.Scrolled += _ => scrolled += _; + + host.Wheel(new(width / 4, height / 2), 120, control: true); + host.Wheel(new(width / 4, height / 2), 120); + + await Assert.That(zoomed).IsEqualTo(1); + await Assert.That(scrolled).IsEqualTo(1); + } + /// /// Dragging right brings what is to the left of the middle into view, by as much of the /// enlarged picture as the pointer crossed. Reported once per move and then not again. @@ -152,7 +174,7 @@ static Point Middle(Rectangle area) => /// sealed class Host : IDisposable { - readonly Form form = new() + readonly Form form = new ParkedForm { StartPosition = FormStartPosition.Manual, Location = new(-2000, -2000), @@ -182,11 +204,21 @@ public void Draw(SessionState state) Canvas.DrawToBitmap(bitmap, new(0, 0, Canvas.Width, Canvas.Height)); } - public void Wheel(Point at, int delta) + public void Wheel(Point at, int delta, bool control = false) { + // Whether control is held is not in the message as WinForms reads it. It asks the + // thread, which would otherwise answer with whatever is held at the keyboard as this + // runs: see ThreadKeys + ThreadKeys.ReleaseModifiers(); + if (control) + { + ThreadKeys.Hold(Keys.ControlKey); + } + // The one mouse message whose point is in screen coordinates var screen = Canvas.PointToScreen(at); SendMessage(Canvas.Handle, mouseWheel, new(delta << 16), Pack(screen)); + ThreadKeys.ReleaseModifiers(); } public void Press(Point at) => diff --git a/src/DiffEngineViewer.Windows.Tests/ThreadKeys.cs b/src/DiffEngineViewer.Windows.Tests/ThreadKeys.cs new file mode 100644 index 00000000..ba3a7109 --- /dev/null +++ b/src/DiffEngineViewer.Windows.Tests/ThreadKeys.cs @@ -0,0 +1,65 @@ +/// +/// The keys the calling thread takes to be held, which is what WinForms asks when a message +/// reaches it: a key message says which key and nothing of Shift, Control or Alt, and a wheel +/// turn is read the same way, so is put beside both. +/// +/// A test that posts a key to a form is posting half of what the form reads. The other half is +/// this table, which follows the keyboard whenever input reaches the thread, and the forms +/// these tests post to were the foreground window (see ). So with Alt +/// down at the machine for an Alt+Tab, or Control for a copy, a test read the key it posted as +/// that chord: Down was no command, and a wheel turn over the rows zoomed. +/// +/// +/// So a test says what is held before each message is read. Only for the calling thread: nothing +/// here reaches the keyboard, another thread or another process. +/// +/// +static class ThreadKeys +{ + /// + /// Shift, Control and Alt, and the left and right key of each, which the table holds apart. + /// + static readonly Keys[] modifiers = + [ + Keys.ShiftKey, + Keys.ControlKey, + Keys.Menu, + Keys.LShiftKey, + Keys.RShiftKey, + Keys.LControlKey, + Keys.RControlKey, + Keys.LMenu, + Keys.RMenu + ]; + + /// + /// No modifier held, whatever the keyboard says. + /// + public static void ReleaseModifiers() => + Set(modifiers, false); + + /// + /// held, until or the thread ends. + /// + public static void Hold(Keys key) => + Set([key], true); + + static void Set(Keys[] keys, bool held) + { + var state = new byte[256]; + GetKeyboardState(state); + foreach (var key in keys) + { + // The top bit is down. The bottom one is a toggle, which no modifier has + state[(int) key] = held ? (byte) 0x80 : (byte) 0; + } + + SetKeyboardState(state); + } + + [DllImport("user32.dll")] + static extern bool GetKeyboardState(byte[] state); + + [DllImport("user32.dll")] + static extern bool SetKeyboardState(byte[] state); +} diff --git a/src/DiffEngineViewer.Windows/FormsViewerWindow.cs b/src/DiffEngineViewer.Windows/FormsViewerWindow.cs index 3e22ac98..99d7b891 100644 --- a/src/DiffEngineViewer.Windows/FormsViewerWindow.cs +++ b/src/DiffEngineViewer.Windows/FormsViewerWindow.cs @@ -176,13 +176,15 @@ public bool Capture(Screen screen, int width, int height, string pngPath) // DrawToBitmap sends a paint message, and a window that has never been shown does not // answer one: the result is a correctly sized image of nothing. Shown off to the side - // rather than at the default position, so a capture run does not steal focus mid screen. + // rather than at the default position, and without being activated: off to the side it + // was still the foreground window, with the keyboard, for as long as the capture took. var wasVisible = form.Visible; if (!wasVisible) { form.StartPosition = FormStartPosition.Manual; form.Location = new(-2000, -2000); form.ShowInTaskbar = false; + form.Parked = true; form.Show(); } @@ -208,6 +210,7 @@ public bool Capture(Screen screen, int width, int height, string pngPath) if (!wasVisible) { form.Visible = false; + form.Parked = false; } } diff --git a/src/DiffEngineViewer.Windows/ViewerForm.cs b/src/DiffEngineViewer.Windows/ViewerForm.cs index 9c42da49..0d495f93 100644 --- a/src/DiffEngineViewer.Windows/ViewerForm.cs +++ b/src/DiffEngineViewer.Windows/ViewerForm.cs @@ -234,6 +234,19 @@ public ViewerForm(string title, int width, int height, WindowPlacement? placemen }; } + /// + /// Shown without being made the window the keyboard goes to. For a form that is shown only + /// so that it will paint and take messages, somewhere nobody can see it: a capture, and the + /// tests that post input to one. Shown as a window ordinarily is, it took the keyboard from + /// whatever the person at the machine was typing into for as long as it was up, and what + /// they typed next was this window's commands. + /// + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public bool Parked { get; set; } + + protected override bool ShowWithoutActivation => + Parked; + /// /// Once the handle exists, because DeviceDpi is only meaningful then, and again whenever the /// window moves to a display with different scaling. From 0f56680d6718adb4b239c4d34d309c409f524b3f Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:10:21 +1100 Subject: [PATCH 19/50] Wrap the footer's buttons, and give a status with no room a line of its own The WinForms footer was one row of buttons and a label in whatever they left, two lines high. A window narrower than its buttons had the rest of them past its edge, where they could not be reached, and a status beside a document's ten buttons had the width of a few words: what did not fit in two lines of that was lost behind an ellipsis. It is now laid out as the other two heads lay theirs out. The buttons wrap onto another row where one does not hold them. The status goes beside the last row when it fits there on one line, and under the buttons when it does not, on as many lines as it needs up to three. The label is as tall as those lines at the font it has and they start at its top, so on a scaled display it cannot show the middle of a status as a label of a fixed two lines, centred, could. A taller footer hides no rows: it is docked under the canvas, which reports what it has left, and the model slices for that. So nothing was needed of the core. A status under the buttons goes back beside them only with room to spare, since what it says can turn on how many rows the body has and the body has a row more with it beside them. The buttons are the footer's own children now: a panel around them is as wide as the footer once they wrap, and lay over the status in a capture. Three baselines. StatusThatDoesNotFit and DocumentPageEnlarged each had a status that did not fit beside a document's buttons, wrapped in two lines there and the first cut short; each now has it whole on a line under them, with the footer a line taller and the pages that much smaller. FooterThatWraps is new: the same in a window 560 wide, two rows of buttons and a status of two lines. Every other scene is the pixels it was. ButtonsThatDoNotFitOneRowWrap, ATallerFooterIsRowsTheBodyIsNotAskedFor, AStatusWithNoRoomBesideTheButtonsHasLinesOfItsOwn, TheStatusIsAsTallAsItsLinesAtALargerFont and AStatusUnderTheButtonsIsSlowToGoBackBesideThem all failed against the footer as it was. No display was scaled: a test cannot, so the font is made larger instead. --- .../AmpersandTests.cs | 3 +- .../FormsHeadTests.cs | 170 ++++++++++++++++++ ...xelTests.DocumentPageEnlarged.verified.png | Bin 55070 -> 53548 bytes ...owsPixelTests.FooterThatWraps.verified.png | Bin 0 -> 28402 bytes ...xelTests.StatusThatDoesNotFit.verified.png | Bin 54002 -> 55926 bytes .../WindowsPixelTests.cs | 40 ++++- src/DiffEngineViewer.Windows/ViewerForm.cs | 170 +++++++++++++++--- 7 files changed, 351 insertions(+), 32 deletions(-) create mode 100644 src/DiffEngineViewer.Windows.Tests/WindowsPixelTests.FooterThatWraps.verified.png diff --git a/src/DiffEngineViewer.Windows.Tests/AmpersandTests.cs b/src/DiffEngineViewer.Windows.Tests/AmpersandTests.cs index 4d22d027..f8d72e3f 100644 --- a/src/DiffEngineViewer.Windows.Tests/AmpersandTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/AmpersandTests.cs @@ -49,8 +49,9 @@ screen with }); var buttons = form.Controls - .Find("buttons", true) + .Find("status", true) .Single() + .Parent! .Controls .OfType() .ToList(); diff --git a/src/DiffEngineViewer.Windows.Tests/FormsHeadTests.cs b/src/DiffEngineViewer.Windows.Tests/FormsHeadTests.cs index 0abd30ca..2ea37526 100644 --- a/src/DiffEngineViewer.Windows.Tests/FormsHeadTests.cs +++ b/src/DiffEngineViewer.Windows.Tests/FormsHeadTests.cs @@ -456,6 +456,176 @@ public async Task AFooterButtonIsSizedToItsCurrentLabel() await Assert.That(after.Width).IsGreaterThanOrEqualTo(button.MinimumSize.Width); } + /// + /// A document's ten buttons in a window too narrow for one row of them: every one of them is + /// inside the footer, on more rows than one. In one row, those past the window's edge could + /// not be reached at all. + /// + [Test] + public async Task ButtonsThatDoNotFitOneRowWrap() + { + using var host = new FormHost(Fixtures.Document()); + host.Settle(); + var footer = Field(host.Form, "footer"); + var oneRow = footer.Height; + + host.Form.ClientSize = new(560, 700); + host.Settle(); + + var buttons = FooterButtons(host.Form); + await Assert.That(buttons.Count).IsEqualTo(10); + await Assert.That(buttons.Select(_ => _.Top).Distinct().Count()).IsEqualTo(2); + await Assert.That(buttons.All(_ => footer.ClientRectangle.Contains(_.Bounds))).IsTrue(); + await Assert.That(footer.Height).IsGreaterThan(oneRow); + } + + /// + /// What the footer takes comes off the canvas, which says so: the model is asked for the + /// rows the canvas has left, so none is drawn behind a footer that grew. + /// + [Test] + public async Task ATallerFooterIsRowsTheBodyIsNotAskedFor() + { + using var host = new FormHost(Fixtures.File(Lines(300, 3), Lines(300))); + host.Settle(); + var footer = Field(host.Form, "footer"); + var before = (Rows: host.State.Rows, Footer: footer.Height, Canvas: host.Canvas.Height); + + // A file's five buttons are on two rows at this width + host.Form.ClientSize = new(300, host.Form.ClientSize.Height); + host.Settle(); + + var grew = footer.Height - before.Footer; + var cell = host.Canvas.CellSize(); + await Assert.That(grew).IsGreaterThan(cell.Height); + await Assert.That(host.Canvas.Height).IsEqualTo(before.Canvas - grew); + await Assert.That(host.State.Rows).IsEqualTo(host.Canvas.BodyCapacity + ScreenBuilder.Chrome); + await Assert.That(host.State.Rows).IsLessThan(before.Rows); + // The last row the model sliced ends inside the canvas + var rows = ScreenBuilder.Build(host.State).Left.Rows.Count; + await Assert.That(host.Canvas.BodyTop() + rows * cell.Height).IsLessThanOrEqualTo(host.Canvas.Height); + } + + /// + /// A status with no room beside the buttons goes under them, and the label is as tall as the + /// lines it wraps to: nothing of it is cut. Then one that fits beside them is beside them + /// again, in a footer the height it always was. + /// + [Test] + public async Task AStatusWithNoRoomBesideTheButtonsHasLinesOfItsOwn() + { + using var form = new ViewerForm("title", 700, 600); + var screen = ScreenBuilder.Build(ViewerSession.Resize(Fixtures.Document(), columns, rows)); + var footer = Field(form, "footer"); + var status = Field [Test] public Task StatusThatDoesNotFit() @@ -195,16 +195,40 @@ public Task StatusThatDoesNotFit() return Capture( screen with { - // Five lines of the label's width, where it has the height for two - Status = "START lines 1-14 of 40, page 1 of 1, page 1 differs, 200% zoom, selected 3 lines of sample.received.pdf, " + - "which is 112 characters, and could not be drawn: Not a readable PDF document: it was cut short END" + Status = longStatus }); } + const string longStatus = + "START lines 1-14 of 40, page 1 of 1, page 1 differs, 200% zoom, selected 3 lines of sample.received.pdf, " + + "which is 112 characters, and could not be drawn: Not a readable PDF document: it was cut short END"; + + /// + /// The same in a window half as wide: a document's buttons on two rows, since one does not + /// hold them, and the status under them on the two lines it needs at that width, read from + /// the left. In one row the buttons past the window's edge could not be reached at all. + /// + /// Fewer rows than the window of the other scenes holds, as the canvas reports fewer once + /// the footer is this tall. + /// + /// + [Test] + public Task FooterThatWraps() + { + var screen = ScreenBuilder.Build(ViewerSession.Resize(Fixtures.Document(), 60, 26)); + return Capture( + screen with + { + Status = longStatus + }, + 560, + 560); + } + static Task Capture(SessionState state) => Capture(ScreenBuilder.Build(ViewerSession.Resize(state, columns, rows))); - static async Task Capture(Screen screen) + static async Task Capture(Screen screen, int width = width, int height = height) { var path = Path.Combine(Path.GetTempPath(), $"deview-{Guid.NewGuid():N}.png"); try diff --git a/src/DiffEngineViewer.Windows/ViewerForm.cs b/src/DiffEngineViewer.Windows/ViewerForm.cs index 0d495f93..f2ec6fb8 100644 --- a/src/DiffEngineViewer.Windows/ViewerForm.cs +++ b/src/DiffEngineViewer.Windows/ViewerForm.cs @@ -10,27 +10,17 @@ sealed class ViewerForm : Form Dock = DockStyle.Fill }; - readonly FlowLayoutPanel buttonRow = new() - { - Name = "buttons", - Dock = DockStyle.Left, - AutoSize = true, - WrapContents = false, - Margin = Padding.Empty - }; - readonly Label status = new() { Name = "status", - Dock = DockStyle.Fill, TextAlign = ContentAlignment.MiddleRight, ForeColor = Palette.Dim, AutoSize = false, - // A status too long for what the buttons leave wraps, and the label has the height for two - // lines. The rest was cut with nothing to say so, and the status line is where the model - // says what no picture can. With this the cut ends in an ellipsis, and the label shows the - // whole status as a tip when the pointer rests on it. It is cut from the end either way: - // the lines kept are the first two, so right aligned still keeps the start. + // The status line is where the model says what no picture can, and one that has not the + // room is given a line of its own, and more lines when one is not enough: see + // LayOutFooter. Past the most lines it is given, the cut ends in an ellipsis, and the + // label shows the whole status as a tip when the pointer rests on it. It is cut from the + // end: the lines kept are the first ones. AutoEllipsis = true, // The status line is built from paths, solution names and whatever the applier said, and a // Label reads an ampersand in any of those as a mnemonic: "R&D" drew as "R_D" with D live @@ -65,10 +55,9 @@ sealed class ViewerForm : Form }; /// - /// Height is set from the display, not here. Forty logical pixels is a hair over what a - /// button needs at 100%, and scaling that button without scaling the panel leaves an AutoSize - /// row docked inside something too short for it, which is a layout fight rather than a clipped - /// button. + /// Height is set from the display and from what is in it, not here: see + /// . Its padding is where that puts things, since nothing in it is + /// docked. /// readonly Panel footer = new() { @@ -166,7 +155,11 @@ public ViewerForm(string title, int width, int height, WindowPlacement? placemen KeyPreview = true; footer.Controls.Add(status); - footer.Controls.Add(buttonRow); + // How many rows the buttons make is a matter of the window's width. Asked as the surface + // is about to dock what is in it, which is before the footer has its new width and in + // time for the height this comes to: set once the footer had been docked, it was the + // old height that the docking kept. + Surface.Layout += (_, _) => LayOutFooter(); // Everything lives in one filling panel so a capture can take the client area alone. Going // through the form would include the title bar, which is themed by the OS and would make a @@ -517,10 +510,136 @@ protected override void OnFormClosed(FormClosedEventArgs e) void ScaleChrome() { - footer.Height = LogicalToDeviceUnits(40); + LayOutFooter(); scrollBar.Width = SystemInformation.GetVerticalScrollBarWidthForDpi(DeviceDpi); } + /// + /// What a footer of one row of buttons takes, in logical pixels. A hair over what a button + /// needs at 100%, and scaled with the display: scaling the button without scaling the footer + /// left a row inside something too short for it. + /// + const int footerRow = 40; + + /// + /// The most lines a status is given. One that needs more is the applier's or a decoder's + /// message at length, in a window narrow enough that the footer would be most of it. + /// + const int statusLines = 3; + + /// + /// Whether the status is on a line of its own, under the buttons. + /// + bool statusBelow; + + bool layingOut; + + /// + /// Where the buttons and the status go, and how tall that makes the footer. As the other two + /// heads lay theirs out: the buttons wrap onto another row where the window is too narrow for + /// one, and the status goes beside the last row of them when it fits there on one line, and + /// under them when it does not, on as many lines as it needs up to . + /// It was a label in whatever one row of buttons left, two lines high: buttons past the + /// window's edge could not be reached at all, and a status had the width of a few words to + /// say what it does in a sentence. + /// + /// A taller footer hides nothing. It is docked under the canvas, which is that much shorter + /// and reports that many fewer rows, so the next screen is sliced for what is left. + /// + /// + /// The label is as tall as the lines it is given at the font the display scales it to, and + /// they start at its top. Two lines high whatever it held, and centred, a status of more + /// lines than that showed the middle of itself. + /// + /// + void LayOutFooter() + { + // Setting the footer's height has the surface lay itself out, which is what asks for this + if (layingOut) + { + return; + } + + layingOut = true; + footer.SuspendLayout(); + try + { + var padding = footer.Padding; + // A row: a button and the space under it. One of them is the footer as it always was + var row = LogicalToDeviceUnits(footerRow) - padding.Vertical; + // The surface's width, which is what the footer is docked across + var inner = Math.Max(1, Surface.ClientSize.Width - padding.Horizontal); + + // Where the row being filled starts, and how far along it the last button reaches, + // with the gap after it + var top = 0; + var reach = 0; + for (var index = 0; index < shownButtons; index++) + { + var button = pool[index]; + // Sized to the label it has now, and no smaller than a button always was + var size = button.GetPreferredSize(Size.Empty); + if (index > 0 && + reach + size.Width > inner) + { + top += row; + reach = 0; + } + + button.Bounds = new(padding.Left + reach, padding.Top + top, size.Width, size.Height); + reach += size.Width + buttonGap; + } + + var room = inner - reach; + var line = status.GetPreferredSize(Size.Empty); + statusBelow = shownButtons > 0 && + status.Text.Length > 0 && + line.Width + Reluctance(line) > room; + if (!statusBelow) + { + status.TextAlign = ContentAlignment.MiddleRight; + status.Bounds = new(padding.Left + reach, padding.Top + top, Math.Max(0, room), row); + footer.Height = padding.Top + top + row + padding.Bottom; + return; + } + + var wrapped = status.GetPreferredSize(new(inner, 0)).Height; + var height = Math.Min(Math.Max(wrapped, line.Height), line.Height * statusLines); + // One line ends where the buttons' row would have ended it. More than one is read + // from the left, as a paragraph is + status.TextAlign = height > line.Height ? ContentAlignment.TopLeft : ContentAlignment.TopRight; + status.Bounds = new(padding.Left, padding.Top + top + row, inner, height); + footer.Height = padding.Top + top + row + height + padding.Bottom; + } + finally + { + footer.ResumeLayout(); + layingOut = false; + } + } + + /// + /// How much more room than it needs a status under the buttons has to see beside them before + /// it goes back there. What a status says can turn on how many rows the body has, "lines 1-9 + /// of 40" against "lines 1-10", and the body has a row more with the status beside the + /// buttons than under them: a status a digit either side of what fits would have changed + /// places on every frame. Not in a capture, which is one frame and has to come out the same + /// whatever the window drew before it. + /// + int Reluctance(Size line) => + statusBelow && !Synchronous ? line.Height * 2 : 0; + + /// + /// Between one button and the next, which is not scaled: it never was. + /// + const int buttonGap = 6; + + /// + /// How many of the screen has a button for. The rest are hidden, and a + /// button's own Visible cannot be asked: it answers for its window as well. + /// + int shownButtons; + /// /// Brings the window up, for a snapshot that has just arrived and wants reading. /// @@ -567,6 +686,9 @@ public void Apply(Screen screen) last = screen; status.Text = screen.Status; ApplyButtons(screen); + // Before the canvas is handed the screen: what the footer comes to is what is left of + // the window for it to draw in + LayOutFooter(); canvas.Draw(screen); ApplyScroll(screen); ApplyMenu(screen); @@ -659,7 +781,6 @@ void ApplyButtons(Screen screen) // The size a button has by default, which GrowOnly never went under, so a short // label does not make a button smaller than it always was MinimumSize = LogicalToDeviceUnits(new Size(75, 23)), - Margin = new(0, 0, 6, 0), // Standard rather than System: WinForms draws these itself, including in dark // mode, so their pixels are pinned to the .NET version rather than to whatever // the OS build's theme renderer does with a Win32 button. @@ -671,9 +792,12 @@ void ApplyButtons(Screen screen) }; button.Click += (_, _) => discrete.Enqueue(new(Button: index)); pool.Add(button); - buttonRow.Controls.Add(button); + // Straight into the footer, beside the status, with nothing around them: a panel of + // their own is as wide as the footer once they wrap, and lies over the status + footer.Controls.Add(button); } + shownButtons = screen.Buttons.Count; for (var index = 0; index < pool.Count; index++) { var button = pool[index]; From 48f74fd2f1cc82821192b71c9551abf1c25040e6 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:46:23 +1100 Subject: [PATCH 20/50] Give back the MaxInstance slot of a viewer launch that failed The launch gate asks MaxInstance for a slot before it starts a viewer, since that is the only moment the cap can stop one. A launch that then failed - no viewer resolved, or the one started exited with a failure before anything held the queue - kept the slot, though no window came of it. Five of those in one process, which is five failing snapshots against a copy too old for its arguments, and every pair after them was answered TooManyRunningDiffTools with nothing running. The gate now returns the slot on the two paths that report Failed from a launch. A launch cancelled while its viewer is binding keeps it, since that viewer is running and will open its window. A test that supplies its own canLaunch gets a giveBack that does nothing unless it supplies that too. AFailedLaunchGivesItsSlotBack and its async twin fail without the two calls (Capped where Failed and Launched were expected) and pass with them. ALaunchThatOpenedAViewerKeepsItsSlot holds the other side. --- src/DiffEngine.Tests/ViewerLaunchGateTests.cs | 102 ++++++++++++++++++ src/DiffEngine/MaxInstance.cs | 9 ++ src/DiffEngine/Viewer/ViewerLaunchGate.cs | 20 +++- 3 files changed, 128 insertions(+), 3 deletions(-) diff --git a/src/DiffEngine.Tests/ViewerLaunchGateTests.cs b/src/DiffEngine.Tests/ViewerLaunchGateTests.cs index 5c0b526e..5b73640b 100644 --- a/src/DiffEngine.Tests/ViewerLaunchGateTests.cs +++ b/src/DiffEngine.Tests/ViewerLaunchGateTests.cs @@ -375,6 +375,108 @@ public async Task TheDefaultSlotCheckReadsMaxInstance() } } + /// + /// A slot is for a window, and a viewer that could not be run opened none. With the slot + /// kept, a cap of one was used up by the copy that exited on its arguments, and the launch + /// after it - of a viewer that would have run - was told too many diff tools were open. + /// + [Test] + public async Task AFailedLaunchGivesItsSlotBack() + { + var viewer = new FakeViewer(); + try + { + DiffRunner.MaxInstancesToLaunch(1); + MaxInstance.ResetCount(); + + var failed = ViewerLaunchGate.Launch( + retry: () => true, + launch: () => Exited(2), + isOwned: () => false); + var notStarted = ViewerLaunchGate.Launch( + retry: () => true, + launch: () => null, + isOwned: () => false); + var outcome = ViewerLaunchGate.Launch( + retry: () => true, + launch: viewer.Start, + isOwned: viewer.IsUp); + + await Assert.That(failed).IsEqualTo(ViewerLaunchOutcome.Failed); + await Assert.That(notStarted).IsEqualTo(ViewerLaunchOutcome.Failed); + await Assert.That(outcome).IsEqualTo(ViewerLaunchOutcome.Launched); + await Assert.That(viewer.Starts).IsEqualTo(1); + } + finally + { + MaxInstance.ResetAppDomainValue(); + MaxInstance.ResetCount(); + } + } + + /// + [Test] + public async Task AFailedLaunchGivesItsSlotBackAsync() + { + var viewer = new FakeViewer(); + try + { + DiffRunner.MaxInstancesToLaunch(1); + MaxInstance.ResetCount(); + + var failed = await ViewerLaunchGate.LaunchAsync( + retry: () => Task.FromResult(true), + launch: () => Task.FromResult(Exited(2)), + Cancel.None, + isOwned: () => false); + var outcome = await ViewerLaunchGate.LaunchAsync( + retry: () => Task.FromResult(true), + launch: () => Task.FromResult(viewer.Start()), + Cancel.None, + isOwned: viewer.IsUp); + + await Assert.That(failed).IsEqualTo(ViewerLaunchOutcome.Failed); + await Assert.That(outcome).IsEqualTo(ViewerLaunchOutcome.Launched); + await Assert.That(viewer.Starts).IsEqualTo(1); + } + finally + { + MaxInstance.ResetAppDomainValue(); + MaxInstance.ResetCount(); + } + } + + /// + /// A launch that worked keeps its slot, which is what the cap counts. + /// + [Test] + public async Task ALaunchThatOpenedAViewerKeepsItsSlot() + { + var viewer = new FakeViewer(); + try + { + DiffRunner.MaxInstancesToLaunch(1); + MaxInstance.ResetCount(); + + ViewerLaunchGate.Launch( + retry: () => true, + launch: viewer.Start, + isOwned: viewer.IsUp); + var outcome = ViewerLaunchGate.Launch( + retry: () => true, + launch: viewer.Start, + isOwned: () => false); + + await Assert.That(outcome).IsEqualTo(ViewerLaunchOutcome.Capped); + await Assert.That(viewer.Starts).IsEqualTo(1); + } + finally + { + MaxInstance.ResetAppDomainValue(); + MaxInstance.ResetCount(); + } + } + /// /// The real probe, against a real bound port, so the default the call sites rely on is not /// only ever exercised through a stand-in. diff --git a/src/DiffEngine/MaxInstance.cs b/src/DiffEngine/MaxInstance.cs index 319e2be2..9c4f14b6 100644 --- a/src/DiffEngine/MaxInstance.cs +++ b/src/DiffEngine/MaxInstance.cs @@ -119,4 +119,13 @@ public static bool Reached() var count = Interlocked.Increment(ref launchedInstances); return count > MaxInstancesToLaunch; } + + /// + /// Returns a slot granted, for a caller whose launch then opened + /// nothing. The cap is on windows, and a slot has to be asked for before there is one, so + /// the launch that fails is the only one that knows it was charged for a window that never + /// came. + /// + public static void GiveBack() => + Interlocked.Decrement(ref launchedInstances); } diff --git a/src/DiffEngine/Viewer/ViewerLaunchGate.cs b/src/DiffEngine/Viewer/ViewerLaunchGate.cs index a1a3735a..4edbbbac 100644 --- a/src/DiffEngine/Viewer/ViewerLaunchGate.cs +++ b/src/DiffEngine/Viewer/ViewerLaunchGate.cs @@ -64,7 +64,7 @@ enum ViewerLaunchOutcome /// already up is not a new instance and spends nothing, which is why the caller cannot ask: it /// would charge all twenty of the callers above for the one window between them. Asked after the /// ownership probe, so the nineteen that find an owner still forward their work when the cap is -/// long since reached. +/// long since reached. And given back when the launch fails, since no window came of it. /// /// static class ViewerLaunchGate @@ -100,13 +100,23 @@ static class ViewerLaunchGate /// Supplied by the tests that are about the gate rather than about the cap, since the count it /// reads is shared with every other launch the process has made. /// + /// + /// Returns the slot spent, for a launch that then failed: the + /// cap is on windows, and that one opened none. Kept, five viewers that could not be run - a + /// copy too old for its arguments, one with no runtime - used up the cap, and every pair + /// after them was told too many diff tools were running when none was. Defaults to + /// where the slot was asked of it, and to nothing where a test + /// supplied the asking. + /// public static ViewerLaunchOutcome Launch( Func retry, Func launch, Func? isOwned = null, - Func? canLaunch = null) + Func? canLaunch = null, + Action? giveBack = null) { isOwned ??= () => ViewerClient.IsOwned(); + giveBack ??= canLaunch is null ? MaxInstance.GiveBack : () => { }; canLaunch ??= () => !MaxInstance.Reached(); bool owned; gate.Wait(); @@ -126,6 +136,7 @@ public static ViewerLaunchOutcome Launch( if (viewer is null || !WaitForBind(viewer, isOwned)) { + giveBack(); return ViewerLaunchOutcome.Failed; } } @@ -159,9 +170,11 @@ public static async Task LaunchAsync( Func> launch, Cancel cancel, Func? isOwned = null, - Func? canLaunch = null) + Func? canLaunch = null, + Action? giveBack = null) { isOwned ??= () => ViewerClient.IsOwned(); + giveBack ??= canLaunch is null ? MaxInstance.GiveBack : () => { }; canLaunch ??= () => !MaxInstance.Reached(); bool owned; await gate.WaitAsync(cancel).ConfigureAwait(false); @@ -179,6 +192,7 @@ public static async Task LaunchAsync( if (viewer is null || !await WaitForBindAsync(viewer, isOwned, cancel).ConfigureAwait(false)) { + giveBack(); return ViewerLaunchOutcome.Failed; } } From 48ba7fc6050a26c63d763333f29470d703772da9 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:47:34 +1100 Subject: [PATCH 21/50] Benchmark reading the listener table beside open connections ListenerTable.IsHeld is asked in front of every connect that might wait to be refused, and what it reads is every TCP row the machine has, filtered down to the listeners. This measures it for a port nobody listens on, with nothing added and with 1,500 loopback connections of this process's own, which are 3,000 rows. Committed ahead of the change to how the table is read, so the earlier number can be had again from history. On the machine it was written on: 1.3 ms and 99 KB with nothing added, 9.3 ms and 694 KB with the 1,500. --- .../ListenerTableBenchmarks.cs | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/DiffEngine.Benchmarks/ListenerTableBenchmarks.cs diff --git a/src/DiffEngine.Benchmarks/ListenerTableBenchmarks.cs b/src/DiffEngine.Benchmarks/ListenerTableBenchmarks.cs new file mode 100644 index 00000000..39815b26 --- /dev/null +++ b/src/DiffEngine.Benchmarks/ListenerTableBenchmarks.cs @@ -0,0 +1,66 @@ +using System.Net; +using System.Net.Sockets; +using BenchmarkDotNet.Attributes; + +namespace DiffEngine.Benchmarks; + +// What it costs to ask the operating system whether anything is listening on a port, which is +// asked in front of a connect that would otherwise wait two seconds to be refused: by ViewerClient +// for a port it has not just talked to, and by PiperClient on every move and delete. +// +// The answer is no here, which is the answer that has to look at every row there is. What is +// varied is how many connections the machine has open beside the listeners, since that is what +// the cost was found to follow: each loopback connection made here is two rows, one for each end. +// +// Never the real ports, which a tray on the machine running this owns. The port asked about is +// one this process binds and does not listen on, as in UnownedPortBenchmarks. +[MemoryDiagnoser] +public class ListenerTableBenchmarks +{ + [Params(0, 1500)] + public int Connections; + + Socket holder = null!; + int port; + TcpListener listener = null!; + List ends = []; + + [GlobalSetup] + public void Setup() + { + holder = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ExclusiveAddressUse = true + }; + holder.Bind(new IPEndPoint(IPAddress.Loopback, 0)); + port = ((IPEndPoint) holder.LocalEndPoint!).Port; + + listener = new(IPAddress.Loopback, 0); + listener.Start(); + var target = ((IPEndPoint) listener.LocalEndpoint).Port; + for (var index = 0; index < Connections; index++) + { + var client = new TcpClient(); + client.Connect(IPAddress.Loopback, target); + ends.Add(client); + ends.Add(listener.AcceptTcpClient()); + } + } + + [GlobalCleanup] + public void Cleanup() + { + foreach (var end in ends) + { + end.Dispose(); + } + + ends.Clear(); + listener.Stop(); + holder.Dispose(); + } + + [Benchmark] + public bool NobodyListening() => + ListenerTable.IsHeld(port); +} From fac91723d2d8cf68316e0b6db3a5e73afcc133c8 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:50:52 +1100 Subject: [PATCH 22/50] Ask Windows for its listeners alone Whether anything listens on a port was read out of what .NET lists, which on Windows is every TCP row the machine has, marshalled into objects and then filtered to the listening ones. So it grew with the machine's connections, and PiperClient reads it on every move and delete. ListenerTable now calls GetExtendedTcpTable for the listener class, once per address family, into a byte buffer it reads the ports out of. No rows for connections cross into the process. Wherever that has no answer - off Windows, the call missing or failing, a table not laid out as expected - it reads what it read before, and a table that cannot be read at all still leaves the connect to decide. ListenerTableBenchmarks, a port nobody listens on, same machine and run: connections added listeners alone out of every row 0 0.13 ms, 8 KB 0.34 ms, 18 KB 1,500 (3,000 rows) 0.32 ms, 8 KB 13.1 ms, 952 KB It still grows a little, because Windows passes over the connections to find the listeners; what went is the cost of handing them over. ListenerTableTests holds the hand read rows to the truth on Windows, on net10.0 and net48: an IPv4 and an IPv6 listener are found on their ports, a port bound and not listening is answered no by both tables, and two hundred listeners, more than the first buffer holds, are all found. --- .../ListenerTableBenchmarks.cs | 6 + src/DiffEngine.Tests/ListenerTableTests.cs | 116 ++++++++++++++++ src/DiffEngine/Protocol/ListenerTable.cs | 125 +++++++++++++++++- 3 files changed, 243 insertions(+), 4 deletions(-) create mode 100644 src/DiffEngine.Tests/ListenerTableTests.cs diff --git a/src/DiffEngine.Benchmarks/ListenerTableBenchmarks.cs b/src/DiffEngine.Benchmarks/ListenerTableBenchmarks.cs index 39815b26..c6bac7a1 100644 --- a/src/DiffEngine.Benchmarks/ListenerTableBenchmarks.cs +++ b/src/DiffEngine.Benchmarks/ListenerTableBenchmarks.cs @@ -63,4 +63,10 @@ public void Cleanup() [Benchmark] public bool NobodyListening() => ListenerTable.IsHeld(port); + + // What IsHeld read before the listeners were asked for alone, and still reads where they + // cannot be + [Benchmark] + public bool NobodyListeningOutOfEveryRow() => + ListenerTable.Enumerated(port); } diff --git a/src/DiffEngine.Tests/ListenerTableTests.cs b/src/DiffEngine.Tests/ListenerTableTests.cs new file mode 100644 index 00000000..14103e42 --- /dev/null +++ b/src/DiffEngine.Tests/ListenerTableTests.cs @@ -0,0 +1,116 @@ +/// +/// Windows' table of listeners, read by a call of this library's own rather than out of what .NET +/// lists. The rows are picked apart by hand, so what is held to here is that they are picked +/// apart correctly: a listener of either family is found on its port, and a port with no +/// listener is answered no, rather than not answered. +/// +/// Each test asks about a port it holds itself, so nothing here depends on what else the machine +/// or the tests beside it are listening on. +/// +/// +public class ListenerTableTests +{ + [Test] + [RunOn(TUnit.Core.Enums.OS.Windows)] + public async Task AListenerIsFoundOnItsPort() + { + var listener = new TcpListener(IPAddress.Loopback, 0); + listener.Start(); + var port = ((IPEndPoint) listener.LocalEndpoint).Port; + try + { + await Assert.That(ListenerTable.Listeners(port)).IsTrue(); + await Assert.That(ListenerTable.Enumerated(port)).IsTrue(); + await Assert.That(ListenerTable.IsHeld(port)).IsTrue(); + } + finally + { + listener.Stop(); + } + } + + /// + /// The second table, whose rows are laid out another way. A viewer listens on IPv4's loopback, + /// but the table is asked by port alone, and something else on the port is a reason to connect + /// and find out what. + /// + [Test] + [RunOn(TUnit.Core.Enums.OS.Windows)] + public async Task AnIPv6ListenerIsFoundOnItsPort() + { + if (!Socket.OSSupportsIPv6) + { + return; + } + + var listener = new TcpListener(IPAddress.IPv6Loopback, 0); + listener.Start(); + var port = ((IPEndPoint) listener.LocalEndpoint).Port; + try + { + await Assert.That(ListenerTable.Listeners(port)).IsTrue(); + await Assert.That(ListenerTable.IsHeld(port)).IsTrue(); + } + finally + { + listener.Stop(); + } + } + + /// + /// A port that is bound and not listening has nobody to accept a connection, which is the + /// answer the caller is spared two seconds by, and it takes both tables being read to their + /// ends to give it. Bound rather than free, so that nothing else can start listening on it + /// while the test asks. + /// + [Test] + [RunOn(TUnit.Core.Enums.OS.Windows)] + public async Task ABoundPortThatIsNotListeningIsNotHeld() + { + using var holder = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) + { + ExclusiveAddressUse = true + }; + holder.Bind(new IPEndPoint(IPAddress.Loopback, 0)); + var port = ((IPEndPoint) holder.LocalEndPoint!).Port; + + await Assert.That(ListenerTable.Listeners(port)).IsFalse(); + await Assert.That(ListenerTable.Enumerated(port)).IsFalse(); + await Assert.That(ListenerTable.IsHeld(port)).IsFalse(); + } + + /// + /// More listeners than the first buffer has room for, which is the path that asks again with + /// the size it was told. The last one opened is the one asked about, since a table cut short + /// would be missing its end. + /// + [Test] + [RunOn(TUnit.Core.Enums.OS.Windows)] + public async Task ATableLargerThanTheFirstBufferIsReadWhole() + { + var listeners = new List(); + try + { + // 4096 bytes are 170 rows of 24 + for (var index = 0; index < 200; index++) + { + var listener = new TcpListener(IPAddress.Loopback, 0); + listener.Start(); + listeners.Add(listener); + } + + foreach (var listener in listeners) + { + var port = ((IPEndPoint) listener.LocalEndpoint).Port; + await Assert.That(ListenerTable.Listeners(port)).IsTrue(); + } + } + finally + { + foreach (var listener in listeners) + { + listener.Stop(); + } + } + } +} diff --git a/src/DiffEngine/Protocol/ListenerTable.cs b/src/DiffEngine/Protocol/ListenerTable.cs index 557b9bb5..8c9d4c62 100644 --- a/src/DiffEngine/Protocol/ListenerTable.cs +++ b/src/DiffEngine/Protocol/ListenerTable.cs @@ -7,10 +7,17 @@ namespace DiffEngine; /// /// For a caller about to connect to a local port that may have nobody on it. Such a connect is not /// refused at once everywhere: where the reset a closed port answers with is dropped, as Windows -/// Firewall's stealth mode drops it, the connect runs for two seconds. Reading the table takes a -/// third of a millisecond on a machine with a few dozen connections open. It is filtered out of -/// every connection the machine has, so that grows with them, and a caller with a cheaper way of -/// knowing somebody is there should use it first. +/// Firewall's stealth mode drops it, the connect runs for two seconds. +/// +/// +/// On Windows the listeners are asked for by themselves (): a tenth of a +/// millisecond, and three tenths with three thousand connections open beside them, since Windows +/// still passes over those to find the listeners. What .NET offers is every connection the +/// machine has, handed across and made into objects, with the listeners then picked out: a third +/// of a millisecond at its quietest and thirteen with those three thousand. That is still what is +/// read wherever the listeners cannot be had alone: off Windows, and on a Windows that will not +/// answer the call. So a caller with a cheaper way of knowing somebody is there should still use +/// it first. /// /// /// By port alone, whichever address the listener is bound to. The table is only ever believed @@ -49,6 +56,21 @@ public static bool IsHeld(int port) internal static Func Lookup { get; set; } = Listed; static bool Listed(int port) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && + Listeners(port) is { } held) + { + return held; + } + + return Enumerated(port); + } + + /// + /// The answer out of everything .NET lists, which on Windows is every TCP row the machine has + /// with the listening ones kept. What is asked wherever has no answer. + /// + internal static bool Enumerated(int port) { foreach (var listener in IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()) { @@ -60,4 +82,99 @@ static bool Listed(int port) return false; } + + /// + /// The answer out of Windows' own table of listeners, which holds a row for each listening + /// socket and none for a connection, so what is handed over and looked through does not grow + /// with what the machine is doing. Null when it could not be had, for whatever reason: the + /// call is missing, it failed, or what came back is not laid out as expected. + /// + /// Both families, since which one a listener is listed under follows how it was bound, and a + /// loopback connect can reach either. A machine with IPv6 off has no second table to ask for. + /// + /// + internal static bool? Listeners(int port) + { + try + { + // MIB_TCPROW_OWNER_PID, whose third field is the local port + var held = Read(port, interNetwork, 24, 8); + if (held != false || + !Socket.OSSupportsIPv6) + { + return held; + } + + // MIB_TCP6ROW_OWNER_PID, where the port follows the address and its scope + return Read(port, interNetworkV6, 56, 20); + } + catch (Exception exception) + when (exception is DllNotFoundException or EntryPointNotFoundException or MarshalDirectiveException) + { + return null; + } + } + + static bool? Read(int port, int family, int rowSize, int portOffset) + { + var size = 4096; + // A table that outgrew the buffer says how much it needs, and can have grown again by + // the time it is asked for with that. Not for ever: a call that keeps saying so is one + // that is not going to answer + for (var attempt = 0; attempt < 4; attempt++) + { + var table = new byte[size]; + var result = GetExtendedTcpTable(table, ref size, 0, family, ownerPidListener, 0); + if (result == insufficientBuffer) + { + size = Math.Max(size, table.Length * 2); + continue; + } + + if (result != 0) + { + return null; + } + + // The count, and then the rows + var count = BitConverter.ToInt32(table, 0); + if (count < 0 || + 4 + (long) count * rowSize > table.Length) + { + return null; + } + + for (var index = 0; index < count; index++) + { + // Network byte order, in the low half of a field twice the size + var at = 4 + index * rowSize + portOffset; + if (((table[at] << 8) | table[at + 1]) == port) + { + return true; + } + } + + return false; + } + + return null; + } + + const int interNetwork = 2; + const int interNetworkV6 = 23; + + // TCP_TABLE_OWNER_PID_LISTENER. The basic class has rows that are four bytes shorter, and is + // not documented for IPv6 + const int ownerPidListener = 3; + + const uint insufficientBuffer = 122; + + [DllImport("iphlpapi.dll")] + static extern uint GetExtendedTcpTable( + [Out] byte[] table, + ref int size, + int order, + int family, + int tableClass, + int reserved); } From 6b36fa648a7e8e37a7f6d40d2b1037ed573330f7 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:55:04 +1100 Subject: [PATCH 23/50] Ask again after a second about a port the listener table found empty A port found with nobody on it is not connected to again by the telling sends for ten minutes, which was set when finding out meant two seconds waiting to be refused. On Windows it is now a read of the listener table, a tenth of a millisecond, and the ten minutes were only how long a tray or a viewer started after the test process heard nothing of its settles and moves. The memory now records how a port was found empty. What the table said stands for a second (RecheckUnlistedAfter). What a connect found stands for the ten minutes it did, since asking again is the connect again: off Windows, where the table could not be read, and for a port held by something that is not a viewer. A second rather than nothing, because settles come as fast as tests pass and each would otherwise read the table: ten thousand of them are over a second of reads, and at one read a second it is a ten thousandth of the run. It is also the second an owner that answered is trusted for. AnOwnerStartedLaterIsFoundByTheTellingSends runs with the shipped values and waits for a telling send to reach an owner bound after the first one found the port empty. With the ten minutes back it failed at its sixty second limit. APortAConnectFoundEmptyIsNotAskedAboutAgainSoSoon holds the other half. The rest of ViewerClientUnownedTests are about there being a memory, so they give the table's answer the connect's ten minutes rather than race a second. --- .../ViewerClientUnownedTests.cs | 74 +++++++++++++++++- src/DiffEngine/DiffRunner_Inline.cs | 5 +- src/DiffEngine/Protocol/ViewerClient.cs | 77 ++++++++++++++----- 3 files changed, 131 insertions(+), 25 deletions(-) diff --git a/src/DiffEngine.Tests/ViewerClientUnownedTests.cs b/src/DiffEngine.Tests/ViewerClientUnownedTests.cs index 945400d8..2f11e054 100644 --- a/src/DiffEngine.Tests/ViewerClientUnownedTests.cs +++ b/src/DiffEngine.Tests/ViewerClientUnownedTests.cs @@ -17,19 +17,32 @@ public class ViewerClientUnownedTests // static constructor that runs on first touching a static field, and TheMemoryExpires sets the // value before it touches one, so running first it captured Zero for every test after it. static TimeSpan recheckUnownedAfter; + static TimeSpan recheckUnlistedAfter; [Before(Class)] - public static void Remember() => + public static void Remember() + { recheckUnownedAfter = ViewerClient.RecheckUnownedAfter; + recheckUnlistedAfter = ViewerClient.RecheckUnlistedAfter; + } + /// + /// What the listener table found stands for a second, which a loaded machine can spend + /// between two lines of a test. Most of these are about there being a memory at all, so for + /// them it stands as long as a connect's answer does, and the ones about how long say so. + /// [Before(Test)] - public void Forget() => + public void Forget() + { + ViewerClient.RecheckUnlistedAfter = recheckUnownedAfter; ViewerClient.ForgetUnowned(); + } [After(Test)] public void Restore() { ViewerClient.RecheckUnownedAfter = recheckUnownedAfter; + ViewerClient.RecheckUnlistedAfter = recheckUnlistedAfter; ViewerClient.ForgetUnowned(); } @@ -102,6 +115,7 @@ public async Task AProbeFindingNobodyIsRemembered() public async Task TheMemoryExpires() { ViewerClient.RecheckUnownedAfter = TimeSpan.Zero; + ViewerClient.RecheckUnlistedAfter = TimeSpan.Zero; var port = FreePort(); await Assert.That(ViewerClient.TrySend(settle, out _, port, skipIfUnowned: true)).IsFalse(); @@ -110,6 +124,62 @@ public async Task TheMemoryExpires() await Assert.That(owner.Heard.Count).IsEqualTo(1); } + /// + /// A tray started after the test process, with everything as shipped: the telling sends find + /// it within moments, with nothing asking on their behalf. Where the listener table is what + /// said the port was empty, asking it again costs a tenth of a millisecond, so there is no + /// reason to go ten minutes on the old answer - which is how long the tray used to hear + /// nothing of the run's settles and moves. + /// + /// Waited for rather than timed. What is held to is that it happens while a test would still + /// be running, and the limit is far short of the ten minutes it replaces. + /// + /// + [Test] + [RunOn(TUnit.Core.Enums.OS.Windows)] + public async Task AnOwnerStartedLaterIsFoundByTheTellingSends() + { + ViewerClient.RecheckUnlistedAfter = recheckUnlistedAfter; + var port = FreePort(); + await Assert.That(ViewerClient.TrySend(settle, out _, port, skipIfUnowned: true)).IsFalse(); + + using var owner = new Owner(port); + var elapsed = Stopwatch.StartNew(); + var found = false; + while (!found && + elapsed.Elapsed < TimeSpan.FromSeconds(60)) + { + found = ViewerClient.TrySend(settle, out _, port, skipIfUnowned: true); + if (!found) + { + await Task.Delay(50); + } + } + + await Assert.That(found).IsTrue(); + } + + /// + /// The shorter wait is only for what the table said. A port a connect found nobody on - here + /// because the table could not be read - is one where asking again is the connect again, two + /// seconds of it on Windows, so that answer stands as it always did. + /// + [Test] + public async Task APortAConnectFoundEmptyIsNotAskedAboutAgainSoSoon() + { + ViewerClient.RecheckUnlistedAfter = TimeSpan.Zero; + var port = FreePort(); + using var unreadable = new Lookup(port) + { + Unreadable = true + }; + await Assert.That(ViewerClient.TrySend(settle, out _, port, skipIfUnowned: true)).IsFalse(); + + using var owner = new Owner(port); + await Assert.That(ViewerClient.TrySend(settle, out _, port, skipIfUnowned: true)).IsFalse(); + await Assert.That(owner.Heard).IsEmpty(); + } + /// /// Per port, or a test suite's dead ephemeral port would silence the sends to its live one. /// diff --git a/src/DiffEngine/DiffRunner_Inline.cs b/src/DiffEngine/DiffRunner_Inline.cs index 4b135735..62537248 100644 --- a/src/DiffEngine/DiffRunner_Inline.cs +++ b/src/DiffEngine/DiffRunner_Inline.cs @@ -127,9 +127,10 @@ internal static InlineResult InlineResultFor(ViewerLaunchOutcome outcome) => /// Drops a pending inline snapshot from the viewer's queue, for when a previously failing test /// starts passing. Does nothing when no viewer is running - and cheaply, since this is called /// once per passing inline verification: a port found with nothing listening is taken as - /// still unowned for ten minutes rather than connected to again, because on Windows a refused + /// still unowned for a while rather than connected to again, because on Windows a refused /// loopback connection takes two seconds rather than none, and a green run of a few hundred - /// inline tests was spending minutes on refusals. + /// inline tests was spending minutes on refusals. A second where the operating system's table + /// of listeners is what said so, and ten minutes where it took a connect to find out. /// /// Carries this process's framework so a multi-targeted run only settles its own variant of a /// conflicted entry; the other framework's differing content stays pending. diff --git a/src/DiffEngine/Protocol/ViewerClient.cs b/src/DiffEngine/Protocol/ViewerClient.cs index 46f317c7..402d6f7a 100644 --- a/src/DiffEngine/Protocol/ViewerClient.cs +++ b/src/DiffEngine/Protocol/ViewerClient.cs @@ -83,8 +83,9 @@ public static int Port public static readonly TimeSpan ShortTimeout = TimeSpan.FromMilliseconds(500); /// - /// How long a port found with nothing listening stands as unowned, during which the sends - /// that only tell the owner something return without connecting. + /// How long a port a connect found nobody on stands as unowned, during which the sends that + /// only tell the owner something return without connecting. For a port the listener table + /// found empty it is . /// /// A refused loopback connection is not free everywhere. Windows Firewall's stealth mode, on /// by default, drops the reset a closed port would answer with, so the connect sits through @@ -94,27 +95,50 @@ public static int Port /// connecting to nobody, and the same run took under a second with a tray answering. /// /// - /// Long, because a recheck buys almost nothing and is not free: those two seconds again where - /// it has to connect, and a read of the listener table where the operating system can be asked - /// instead (). What the memory can delay is only a message the - /// owner did not have to receive: an entry to settle in a queue that did not exist when the - /// test failed, or a move to track in a tray that was not there to track it. Anything that has - /// to reach an owner - a patch, a delete, a pair - goes through the launch gate, whose - /// probe always asks and corrects the memory with what it finds. Not the - /// life of the process only for a long lived consumer that is not a test host, launching diff - /// tools all day, where a tray started later would otherwise never see its moves until a - /// restart. + /// Long, because a recheck that has to connect buys almost nothing for those two seconds + /// again. What the memory can delay is only a message the owner did not have to receive: an + /// entry to settle in a queue that did not exist when the test failed, or a move to track in + /// a tray that was not there to track it. Anything that has to reach an owner - a patch, a + /// delete, a pair - goes through the launch gate, whose probe always + /// asks and corrects the memory with what it finds. Not the life of the process only for a + /// long lived consumer that is not a test host, launching diff tools all day, where a tray + /// started later would otherwise never see its moves until a restart. + /// + /// + /// This is the wait wherever the connect is what answered: off Windows, on a Windows whose + /// listener table could not be read, and for a port held by something that is not a viewer. /// /// internal static TimeSpan RecheckUnownedAfter { get; set; } = TimeSpan.FromMinutes(10); + /// + /// How long a port stands as unowned when it was the listener table that said nobody is + /// there (), which is how Windows is asked wherever it can be. + /// + /// A second, where the connect's answer stands for ten minutes, because asking again is a + /// read of the table, a tenth of a millisecond, rather than two seconds waiting to be + /// refused. So a tray or a viewer started after the test process is told of the settles and + /// moves that come a second after it is listening, where it was told of none for ten minutes. + /// + /// + /// Not nothing, because a green run settles once per verification, as fast as the tests + /// pass, and each would then read the table to learn what the one before it had: ten + /// thousand settles are over a second of that. At a second the reads are one a second however + /// many settles there are, a ten thousandth of the run. It is the same second an owner that + /// answered is trusted for (), so what was found about a port is + /// believed for as long whichever way it went. + /// + /// + internal static TimeSpan RecheckUnlistedAfter { get; set; } = TimeSpan.FromSeconds(1); + /// /// How long a port that accepted a connection is connected to again without first asking the /// operating system whether anyone is there: see . /// /// For a run of settles to an owner that is there, which is a connection every third of a - /// millisecond. Each renews this, so none of them reads the listener table, which costs more - /// than the connect does. Short, because a send that comes a while after the last is the one + /// millisecond. Each renews this, so none of them reads the listener table, which costs as + /// much as the connect does, and several times that where the listeners cannot be asked for + /// alone. Short, because a send that comes a while after the last is the one /// most likely to find its owner gone, and asking is what spares that send its two seconds. /// /// @@ -124,13 +148,17 @@ public static int Port /// What was last found on each port, and when, as a timestamp. Per /// port because tests talk to ephemeral ports of their own, in parallel, and what happened on /// those says nothing about the one live port on a developer machine. + /// + /// And how it was found, for a port with nobody on it: by the listener table, which is cheap + /// to ask again, or by a connect, which is not. + /// /// - static ConcurrentDictionary lastFound = new(); + static ConcurrentDictionary lastFound = new(); static bool RecentlyUnowned(int port) => lastFound.TryGetValue(port, out var found) && !found.Owned && - Since(found.At) < RecheckUnownedAfter; + Since(found.At) < (found.Unlisted ? RecheckUnlistedAfter : RecheckUnownedAfter); static bool AnsweredLately(int port) => lastFound.TryGetValue(port, out var found) && @@ -146,7 +174,14 @@ static TimeSpan Since(long timestamp) => /// can talk to, and a port any of them found empty is what the memory is for. /// static void Found(int port, bool owned) => - lastFound[port] = (owned, Stopwatch.GetTimestamp()); + lastFound[port] = (owned, Stopwatch.GetTimestamp(), false); + + /// + /// for a port the listener table has nobody on, which stands for less + /// long: see . + /// + static void FoundUnlisted(int port) => + lastFound[port] = (false, Stopwatch.GetTimestamp(), true); /// /// Whether a connect to would only be a wait to be refused: the @@ -167,7 +202,7 @@ static void Found(int port, bool owned) => /// Only on Windows, which is where the refusal is slow. Elsewhere it arrives at once, so the /// connect is the cheaper question as well as the one whose answer cannot be wrong. And not /// for a port that accepted a connection within , where the table - /// would cost more than the connect it stands in front of. + /// would cost as much as the connect it stands in front of. /// /// static bool NothingListening(int port) => @@ -260,7 +295,7 @@ public static bool IsOwned(int? port = null) var endpointPort = port ?? Port; if (NothingListening(endpointPort)) { - Found(endpointPort, false); + FoundUnlisted(endpointPort); return false; } @@ -521,7 +556,7 @@ static bool Exchange( if (NothingListening(endpointPort)) { - Found(endpointPort, false); + FoundUnlisted(endpointPort); return false; } @@ -621,7 +656,7 @@ public static async Task SendAsync( if (NothingListening(endpointPort)) { - Found(endpointPort, false); + FoundUnlisted(endpointPort); return SendOutcome.NoOwner; } From a4d44ddbc92d9c75bda83a4ac043d8b1010b5626 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:56:19 +1100 Subject: [PATCH 24/50] Show a port nobody holds is not connected to without timing the send APortNobodyHoldsIsNotWaitedOn and its async twin sent to a free port and asserted the send returned inside a second, where the refusal it avoids takes two. That is a fixed short wait around a real clock, which a two core runner under load does not promise, and it could only tell the two apart by time. They now put an owner on the port and make the table say nobody listens there. A send that connected is answered and heard; one that took the table's word returns no owner, the owner hears nothing and accepts no connection. Nothing is timed. APortNobodyHoldsIsNotProbed does the same for IsOwned, which the launch gate polls. That the real table says no of a real port with no listener is ListenerTableTests.ABoundPortThatIsNotListeningIsNotHeld. Run with the table check in NothingListening turned off, all three fail: the send is accepted and the probe finds the owner. --- .../ViewerClientUnownedTests.cs | 72 ++++++++++++++----- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/src/DiffEngine.Tests/ViewerClientUnownedTests.cs b/src/DiffEngine.Tests/ViewerClientUnownedTests.cs index 2f11e054..f7966d6b 100644 --- a/src/DiffEngine.Tests/ViewerClientUnownedTests.cs +++ b/src/DiffEngine.Tests/ViewerClientUnownedTests.cs @@ -233,23 +233,30 @@ public async Task AskingIsTheDefault() /// operating system knows nobody is listening without anything being connected, so where that /// refusal is slow it is asked first. /// - /// A bound of half what the connect takes to be refused, around something that takes well - /// under a millisecond. + /// Shown by what the send does rather than by how long it takes, which on a loaded two core + /// machine is whatever the machine says. An owner is listening on the port and the table is + /// made to say nobody is: a send that connected would be answered, and heard, and one that + /// took the table's word is neither. That the real table says so of a port nobody listens on + /// is ListenerTableTests' half. /// /// [Test] [RunOn(TUnit.Core.Enums.OS.Windows)] public async Task APortNobodyHoldsIsNotWaitedOn() { - var port = FreePort(); + using var owner = new Owner(); + using var unlisted = new Lookup(owner.Port) + { + Unlisted = true + }; - var elapsed = Stopwatch.StartNew(); - var sent = ViewerClient.TrySend(settle, out _, port, skipIfUnowned: true); - elapsed.Stop(); + var sent = ViewerClient.TrySend(settle, out _, owner.Port, skipIfUnowned: true); await Assert.That(sent).IsFalse(); - await Assert.That(elapsed.Elapsed).IsLessThan(TimeSpan.FromSeconds(1)); - await Assert.That(ViewerClient.FoundUnowned(port)).IsTrue(); + await Assert.That(unlisted.Asked).IsEqualTo(1); + await Assert.That(owner.Heard).IsEmpty(); + await Assert.That(owner.Accepted).IsEqualTo(0); + await Assert.That(ViewerClient.FoundUnowned(owner.Port)).IsTrue(); } /// @@ -257,15 +264,34 @@ public async Task APortNobodyHoldsIsNotWaitedOn() [RunOn(TUnit.Core.Enums.OS.Windows)] public async Task APortNobodyHoldsIsNotWaitedOnAsync() { - var port = FreePort(); + using var owner = new Owner(); + using var unlisted = new Lookup(owner.Port) + { + Unlisted = true + }; - var elapsed = Stopwatch.StartNew(); - var outcome = await ViewerClient.SendAsync(settle, Cancel.None, port, skipIfUnowned: true); - elapsed.Stop(); + var outcome = await ViewerClient.SendAsync(settle, Cancel.None, owner.Port, skipIfUnowned: true); await Assert.That(outcome).IsEqualTo(SendOutcome.NoOwner); - await Assert.That(elapsed.Elapsed).IsLessThan(TimeSpan.FromSeconds(1)); - await Assert.That(ViewerClient.FoundUnowned(port)).IsTrue(); + await Assert.That(unlisted.Asked).IsEqualTo(1); + await Assert.That(owner.Heard).IsEmpty(); + await Assert.That(owner.Accepted).IsEqualTo(0); + await Assert.That(ViewerClient.FoundUnowned(owner.Port)).IsTrue(); + } + + /// + [Test] + [RunOn(TUnit.Core.Enums.OS.Windows)] + public async Task APortNobodyHoldsIsNotProbed() + { + using var owner = new Owner(); + using var unlisted = new Lookup(owner.Port) + { + Unlisted = true + }; + + await Assert.That(ViewerClient.IsOwned(owner.Port)).IsFalse(); + await Assert.That(owner.Accepted).IsEqualTo(0); } /// @@ -376,9 +402,9 @@ await Assert.That(async () => await ViewerClient.SendAsync(settle, cancel.Token, /// /// Stands in front of the listener table for the ports a test names, counting how often each - /// was asked about and, when told to, failing the way a table that cannot be read does. Every - /// other port goes through untouched, since the tests beside this one are asking about theirs - /// at the same time. + /// was asked about and, when told to, failing the way a table that cannot be read does, or + /// saying nobody listens there whoever does. Every other port goes through untouched, since + /// the tests beside this one are asking about theirs at the same time. /// sealed class Lookup : IDisposable { @@ -394,6 +420,8 @@ public Lookup(params int[] ports) public bool Unreadable { get; init; } + public bool Unlisted { get; init; } + public int Asked => Volatile.Read(ref asked); bool Answer(int port) @@ -409,6 +437,11 @@ bool Answer(int port) throw new System.Net.NetworkInformation.NetworkInformationException(); } + if (Unlisted) + { + return false; + } + return previous(port); } @@ -466,6 +499,11 @@ public Owner(int port = 0) public int Port => server.Port; + /// + /// How many connections were made, which a probe is and says nothing down. + /// + public int Accepted => server.Accepted; + public IReadOnlyList Heard { get From 7ae536529256194f0aec102b8a2239b8f5997a9c Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:58:09 +1100 Subject: [PATCH 25/50] Remember a port as unowned only when the connect was refused Any connect that failed was recorded as a port with nobody on it. A machine with no ports left to connect from fails every connect as well, with the owner listening throughout, and from then on every settle and move was skipped for ten minutes: on exactly the machine the kept connection was added for. Which error Windows gives when it runs out was never established, and this does not need it. ViewerClient.NobodyThere names the two failures that do say nobody is there, a refusal and a connect that was never answered, and anything else leaves the memory as it was. The send still reports no owner; it is only not remembered, so the next one asks again. A connect given up on at this library's own deadline is still recorded, as before. OnlyARefusalSaysNobodyIsThere holds the rule. For a real connect that fails without being refused, AConnectThatCouldNotBeMadeSaysNothingAboutThePort connects to port zero, which Windows fails at once as an address that is not valid: with the rule taken out it fails, FoundUnowned being true, on net10.0 and net48. No machine was run out of ports to check the case itself. --- .../ViewerClientUnownedTests.cs | 53 +++++++++++++++++++ src/DiffEngine/Protocol/ViewerClient.cs | 43 ++++++++++++--- 2 files changed, 89 insertions(+), 7 deletions(-) diff --git a/src/DiffEngine.Tests/ViewerClientUnownedTests.cs b/src/DiffEngine.Tests/ViewerClientUnownedTests.cs index f7966d6b..7e1bc496 100644 --- a/src/DiffEngine.Tests/ViewerClientUnownedTests.cs +++ b/src/DiffEngine.Tests/ViewerClientUnownedTests.cs @@ -400,6 +400,59 @@ await Assert.That(async () => await ViewerClient.SendAsync(settle, cancel.Token, await Assert.That(ViewerClient.FoundUnowned(port)).IsFalse(); } + /// + /// The memory is of ports nobody is on, and only two failures of a connect say that: it was + /// refused, or it was never answered. A machine with no ports left to connect from fails + /// every connect too, with an owner listening the whole time, and remembering that as an + /// empty port silenced every settle and move for ten minutes. + /// + [Test] + public async Task OnlyARefusalSaysNobodyIsThere() + { + await Assert.That(ViewerClient.NobodyThere(Failed(SocketError.ConnectionRefused))).IsTrue(); + await Assert.That(ViewerClient.NobodyThere(Failed(SocketError.TimedOut))).IsTrue(); + // How the synchronous connect reports it, which waits on a task + await Assert.That(ViewerClient.NobodyThere(new AggregateException(Failed(SocketError.ConnectionRefused)))).IsTrue(); + + // What running out looks like: the first two on Windows, the third on Linux + await Assert.That(ViewerClient.NobodyThere(Failed(SocketError.NoBufferSpaceAvailable))).IsFalse(); + await Assert.That(ViewerClient.NobodyThere(Failed(SocketError.AddressAlreadyInUse))).IsFalse(); + await Assert.That(ViewerClient.NobodyThere(Failed(SocketError.AddressNotAvailable))).IsFalse(); + await Assert.That(ViewerClient.NobodyThere(Failed(SocketError.TooManyOpenSockets))).IsFalse(); + await Assert.That(ViewerClient.NobodyThere(new AggregateException(Failed(SocketError.NoBufferSpaceAvailable)))).IsFalse(); + await Assert.That(ViewerClient.NobodyThere(new ObjectDisposedException("socket"))).IsFalse(); + + static SocketException Failed(SocketError error) => + new((int) error); + } + + /// + /// The same through a real connect that fails without being refused, which a machine out of + /// ports cannot be made to give without running the machine out. Port zero does: Windows + /// fails a connect to it at once, as an address that is not valid, and that is no more a + /// statement about who is listening than a full port table is. The table is made unreadable + /// so that the connect is reached at all. + /// + [Test] + [RunOn(TUnit.Core.Enums.OS.Windows)] + public async Task AConnectThatCouldNotBeMadeSaysNothingAboutThePort() + { + using var unreadable = new Lookup(0) + { + Unreadable = true + }; + + await Assert.That(ViewerClient.TrySend(settle, out _, 0, skipIfUnowned: true)).IsFalse(); + await Assert.That(ViewerClient.FoundUnowned(0)).IsFalse(); + + await Assert.That(await ViewerClient.SendAsync(settle, Cancel.None, 0, skipIfUnowned: true)) + .IsEqualTo(SendOutcome.NoOwner); + await Assert.That(ViewerClient.FoundUnowned(0)).IsFalse(); + + await Assert.That(ViewerClient.IsOwned(0)).IsFalse(); + await Assert.That(ViewerClient.FoundUnowned(0)).IsFalse(); + } + /// /// Stands in front of the listener table for the ports a test names, counting how often each /// was asked about and, when told to, failing the way a table that cannot be read does, or diff --git a/src/DiffEngine/Protocol/ViewerClient.cs b/src/DiffEngine/Protocol/ViewerClient.cs index 402d6f7a..1c9e2e44 100644 --- a/src/DiffEngine/Protocol/ViewerClient.cs +++ b/src/DiffEngine/Protocol/ViewerClient.cs @@ -308,13 +308,38 @@ public static bool IsOwned(int? port = null) catch (Exception exception) when (Ignorable(exception)) { - owned = false; + if (NobodyThere(exception)) + { + Found(endpointPort, false); + } + + return false; } Found(endpointPort, owned); return owned; } + /// + /// Whether a connect that failed says nobody is on the port, which is the only failure the + /// memory of an unowned port is for: the port refused it, or never answered. + /// + /// A connect also fails when the machine cannot make one at all - it has no ports left to + /// connect from, or no buffers - and that says nothing of who is listening. Taken for an + /// empty port, it had every settle and move after it skipped for ten minutes with the owner + /// still there, on exactly the machine a kept connection was meant to help. Which error a + /// machine gives when it runs out differs by platform and was never pinned down for Windows, + /// so this names the two that do mean nobody and takes everything else as not known. + /// + /// + internal static bool NobodyThere(Exception exception) + { + var socket = exception as SocketException ?? + exception.InnerException as SocketException ?? + exception.InnerException?.InnerException as SocketException; + return socket?.SocketErrorCode is SocketError.ConnectionRefused or SocketError.TimedOut; + } + /// /// True when the owner acknowledged. A refused connection means nobody owns the queue. /// @@ -595,9 +620,11 @@ static bool Exchange( catch (Exception exception) when (Ignorable(exception)) { - // Only a connect that failed says the port is unowned. A connection that was accepted - // and then torn down is an owner behaving badly, which is not what the memory records - if (!connected) + // Only a connect that was refused says the port is unowned. A connection that was + // accepted and then torn down is an owner behaving badly, and a connect the machine + // could not make is no answer about the port, neither of which the memory records + if (!connected && + NobodyThere(exception)) { Found(endpointPort, false); } @@ -752,9 +779,11 @@ exception is not OperationCanceledException && catch (Exception exception) when (exception is not OperationCanceledException && Ignorable(exception)) { - // As on the synchronous overload: a connect that failed is an unowned port, and an - // accepted connection that fell over afterwards is not - if (!connected) + // As on the synchronous overload: a connect that was refused is an unowned port, and + // neither an accepted connection that fell over afterwards nor a connect the machine + // could not make is + if (!connected && + NobodyThere(exception)) { Found(endpointPort, false); } From f82ccc9e4e70a95af4da07afa4ebd39b357cd0e5 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:03:04 +1100 Subject: [PATCH 26/50] Keep the kept connection out of child processes on .NET Framework Read and never run, this turned out to be true. .NET Framework makes its sockets inheritable and a process started without ShellExecute is handed every inheritable handle, so a child a test started held the test process's kept connection to the queue's owner. Run outside the tests, on private ports, with a .NET Framework client that connected, started a child that lived eight seconds and went away without closing anything: client exited owner saw the connection close 5.8 s later client killed 8.1 s later, when the child exited .NET 10 client killed at once, child still running Framework, flag cleared at once, child still running What that costs the owner is a connection and a pending read it keeps for a process that has gone, for as long as the child lives. The kept connection's socket now has its inherit flag cleared, under NETFRAMEWORK only, on the socket the client's constructor has already made and before it connects. Only the kept one: an exchange on a connection of its own ends by shutting down its sending half, which reaches the owner whoever else holds the handle. TheKeptConnectionIsNotOneAChildProcessIsGiven reads the flag off the kept socket. Without the call it fails on net48, the flag being set, and passes on net10.0 either way. It asks about the handle rather than starting a child, because closing the connection in the test shuts it down, which the owner sees whoever holds it; the case needs the host to go without closing, and a test cannot do that to its own process. --- src/DiffEngine.Tests/KeptConnectionTests.cs | 30 +++++++++++ src/DiffEngine/Protocol/ViewerClient.cs | 58 +++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/src/DiffEngine.Tests/KeptConnectionTests.cs b/src/DiffEngine.Tests/KeptConnectionTests.cs index aab1ecae..05976afb 100644 --- a/src/DiffEngine.Tests/KeptConnectionTests.cs +++ b/src/DiffEngine.Tests/KeptConnectionTests.cs @@ -238,6 +238,36 @@ public async Task AnOwnerTooBusyToAnswerIsNotWaitedOnTwice() await Assert.That(ViewerClient.Tell(settle, owner.Port)).IsTrue(); } + /// + /// The kept connection is this process's alone. On .NET Framework a socket is inheritable and + /// a process started without ShellExecute is handed every inheritable handle, so a child a + /// test started held the connection too, and the owner went on keeping it until that child + /// exited, long after the test host had. + /// + /// What is asked is whether the handle is one a child would be given. What a child does with + /// it only shows once the host has gone without closing anything, which a test cannot do to + /// the process it runs in: closing the connection here shuts it down, and that reaches the + /// owner whoever else holds the handle. + /// + /// + [Test] + [RunOn(TUnit.Core.Enums.OS.Windows)] + public async Task TheKeptConnectionIsNotOneAChildProcessIsGiven() + { + using var owner = new Owner(); + ViewerClient.Tell(settle, owner.Port); + await Assert.That(ViewerClient.Tell(settle, owner.Port)).IsTrue(); + + var handle = ViewerClient.KeptHandle; + await Assert.That(handle).IsNotNull(); + await Assert.That(GetHandleInformation(handle!.Value, out var flags)).IsTrue(); + // HANDLE_FLAG_INHERIT + await Assert.That(flags & 1).IsEqualTo(0); + } + + [DllImport("kernel32.dll")] + static extern bool GetHandleInformation(IntPtr handle, out int flags); + /// /// A queue owner on a port of the test's choosing, recording what it was sent. /// diff --git a/src/DiffEngine/Protocol/ViewerClient.cs b/src/DiffEngine/Protocol/ViewerClient.cs index 1c9e2e44..c4e4f37f 100644 --- a/src/DiffEngine/Protocol/ViewerClient.cs +++ b/src/DiffEngine/Protocol/ViewerClient.cs @@ -405,6 +405,7 @@ sealed class KeptConnection(TcpClient client, int port) : IDisposable { public int Port { get; } = port; + public IntPtr Handle => client.Client.Handle; public NetworkStream Stream { get; } = client.GetStream(); public StreamReader Reader { get; } = new(client.GetStream(), Encoding.UTF8); @@ -421,6 +422,22 @@ public void Dispose() => static KeptConnection? kept; + /// + /// The socket of the kept connection, or null with none kept. For the test of whether a + /// child process would be handed it, which is a property of the handle and of nothing an + /// exchange shows. + /// + internal static IntPtr? KeptHandle + { + get + { + lock (keptGate) + { + return kept?.Handle; + } + } + } + static KeptSend SendKept(ViewerMessage message, int port, out bool ok) { ok = false; @@ -503,6 +520,9 @@ static void KeepConnection(int port) var client = new TcpClient(); try { +#if NETFRAMEWORK + KeepFromChildren(client); +#endif if (!Connect(client, port, ShortTimeout)) { client.Close(); @@ -533,6 +553,44 @@ static void DropKept() kept = null; } +#if NETFRAMEWORK + /// + /// Marks the socket of a connection about to be kept as one a child process does not get. + /// + /// .NET Framework makes its sockets inheritable, and a process started without ShellExecute + /// is given every inheritable handle its parent has. The kept connection is open for as long + /// as the test process is, so any child a test started that way - a server under test, a + /// tool - took a handle to it, and the connection then stayed open in the owner until that + /// child had exited too, however the test host ended. Run with a child that lived eight + /// seconds, the owner saw the connection close eight seconds after the host was gone, and at + /// once with the flag cleared. Later runtimes make their sockets uninheritable themselves. + /// + /// + /// Before the connect, on the socket the parameterless constructor has already made here, so + /// that the moment a child could still take it is the few instructions in between. Only the + /// kept connection: an exchange on a connection of its own ends by shutting down its sending + /// half, which reaches the owner whoever else holds the handle. + /// + /// + static void KeepFromChildren(TcpClient client) + { + try + { + SetHandleInformation(client.Client.Handle, handleFlagInherit, 0); + } + catch (Exception exception) + // .NET Framework's shape on another runtime, with no kernel32 to ask + when (exception is DllNotFoundException or EntryPointNotFoundException) + { + } + } + + const int handleFlagInherit = 1; + + [DllImport("kernel32.dll")] + static extern bool SetHandleInformation(IntPtr handle, int mask, int flags); +#endif + /// /// True when a reply arrived and parsed, whatever it says. Callers that need the body, such as /// the tray listing pending snapshots, use this rather than . From 1d1245ac02af8a8815410652d8d7303724ca568b Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:13:43 +1100 Subject: [PATCH 27/50] Send listings down a kept connection of their own Every asking send was a connection each. The ones there are many of are the listings: a window showing an owner's queue lists five times a second for as long as it is open, and a tray driving a viewer lists on a timer, each leaving a port in TIME_WAIT. List and ListFull now go down a kept connection, as the telling sends do, where the owner's reply says it keeps one. Nothing changes on the wire: an owner already answers any verb on a kept connection, an older owner never says it keeps one, and an older client never asks. It is a second connection, not the settles'. An owner answers one connection's requests in turn, so a listing it is slow over would otherwise stand in front of every settle behind it. And a listing does not wait for it: the callers list on their own clocks with waits of their own, from half a second to fifteen, so one that finds another in flight is a connection each, as before. The wait a caller gives is set on the connection for its send. Only the listings. A request written to a kept connection whose owner has just gone is sent again as an ordinary exchange, since nothing says whether the first was acted on. That is harmless for a listing and not for an accept or a discard, so what changes the queue is still a connection each. So is the async send, which would have to block a pool thread on a connection it shares, or be given an async twin of the whole kept exchange. KeptConnectionTests: ListingsShareAConnectionOfTheirOwn (four connections for twenty listings and twenty settles; twenty two without the change), AListingArrivesWhole, ASlowListingHoldsUpNeitherASettleNorAnotherListing (nothing timed: the owner holds the listing until the others are back), ACommandIsStillAConnectionEach, AnOwnerThatPredatesItIsListedAConnectionEach and AListingFindsItsOwnerGoneAndTheNextOne. The viewer's and the tray's tests, which list through this file, pass as they were, on two cores too. --- src/DiffEngine.Tests/KeptConnectionTests.cs | 171 +++++++++++++++ src/DiffEngine/Protocol/ViewerClient.cs | 220 ++++++++++++++++---- src/DiffEngine/Protocol/ViewerServer.cs | 3 +- 3 files changed, 353 insertions(+), 41 deletions(-) diff --git a/src/DiffEngine.Tests/KeptConnectionTests.cs b/src/DiffEngine.Tests/KeptConnectionTests.cs index 05976afb..cf136f41 100644 --- a/src/DiffEngine.Tests/KeptConnectionTests.cs +++ b/src/DiffEngine.Tests/KeptConnectionTests.cs @@ -238,6 +238,177 @@ public async Task AnOwnerTooBusyToAnswerIsNotWaitedOnTwice() await Assert.That(ViewerClient.Tell(settle, owner.Port)).IsTrue(); } + static readonly ViewerMessage list = new(ViewerVerb.ListFull); + + /// + /// A window showing an owner's queue lists five times a second, and each was a connection. + /// They share one as the settles do, and it is not the settles' one: four connections for + /// twenty of each, the first of each kind being the ordinary exchange whose reply says the + /// owner keeps one. + /// + [Test] + public async Task ListingsShareAConnectionOfTheirOwn() + { + using var owner = new Owner(); + + for (var index = 0; index < 20; index++) + { + await Assert.That(ViewerClient.TrySend(list, out _, owner.Port)).IsTrue(); + await Assert.That(ViewerClient.Tell(settle, owner.Port)).IsTrue(); + } + + await Assert.That(owner.Heard.Count).IsEqualTo(40); + await Assert.That(owner.Accepted).IsEqualTo(4); + } + + /// + /// What a listing carries is the whole queue, and it arrives down the kept connection as it + /// does down its own, whatever is in it. + /// + [Test] + public async Task AListingArrivesWhole() + { + var patch = "a patch\n\nwith an empty line"; + using var owner = new Owner(_ => ViewerResponse.Listing( + [new("key\nwith a break", "name", "status", patch), new("second", "name", null, patch)])); + + await Assert.That(ViewerClient.TrySend(list, out var first, owner.Port)).IsTrue(); + await Assert.That(ViewerClient.TrySend(list, out _, owner.Port)).IsTrue(); + await Assert.That(ViewerClient.TrySend(list, out var second, owner.Port)).IsTrue(); + + // The first on a connection of its own, and the one it opened for the two after it + await Assert.That(owner.Accepted).IsEqualTo(2); + await Assert.That(second!.Build()).IsEqualTo(first!.Build()); + await Assert.That(second.Items.Count).IsEqualTo(2); + await Assert.That(second.Items[0].Key).IsEqualTo("key\nwith a break"); + await Assert.That(second.Items[1].Patch).IsEqualTo(patch); + } + + /// + /// An owner answers the requests of one connection in turn, so a listing it is slow over + /// must not be on the connection the settles use, and is not: a settle sent while a listing + /// is still waiting for its answer is answered. And a second listing sent then does not wait + /// for the first either. It goes on a connection of its own, as every listing used to. + /// + /// Nothing is timed. The listing is held by the owner until the settle and the second + /// listing have both come back, so either of them waiting behind it would be this test + /// hanging until the listing's own wait ran out, and the listing then failing. + /// + /// + [Test] + public async Task ASlowListingHoldsUpNeitherASettleNorAnotherListing() + { + using var release = new ManualResetEventSlim(); + using var arrived = new ManualResetEventSlim(); + using var owner = new Owner(_ => + { + if (_ is { Verb: ViewerVerb.List, Key: "slow" }) + { + arrived.Set(); + release.Wait(TimeSpan.FromMinutes(2)); + } + + return ViewerResponse.Success(); + }); + ViewerClient.Tell(settle, owner.Port); + ViewerClient.Tell(settle, owner.Port); + ViewerClient.TrySend(list, out _, owner.Port); + ViewerClient.TrySend(list, out _, owner.Port); + await Assert.That(owner.Accepted).IsEqualTo(4); + + // A thread of its own: it blocks until the owner answers, and the owner answers from the + // pool, being in this process + var slow = Task.Factory.StartNew( + () => ViewerClient.TrySend(new(ViewerVerb.List, "slow"), out _, owner.Port, TimeSpan.FromMinutes(1)), + Cancel.None, + TaskCreationOptions.LongRunning, + TaskScheduler.Default); + try + { + await Assert.That(arrived.Wait(TimeSpan.FromMinutes(1))).IsTrue(); + // Down the kept connection, or there would be a fifth + await Assert.That(owner.Accepted).IsEqualTo(4); + + await Assert.That(ViewerClient.Tell(settle, owner.Port)).IsTrue(); + await Assert.That(ViewerClient.TrySend(list, out _, owner.Port)).IsTrue(); + + await Assert.That(slow.IsCompleted).IsFalse(); + await Assert.That(owner.Accepted).IsEqualTo(5); + } + finally + { + release.Set(); + } + + await Assert.That(await slow).IsTrue(); + } + + /// + /// Only the listings. An accept written to a kept connection whose owner had just gone + /// would have to be sent again without knowing whether the first was carried out, so + /// whatever changes the queue is still a connection each. + /// + [Test] + public async Task ACommandIsStillAConnectionEach() + { + using var owner = new Owner(); + ViewerClient.TrySend(list, out _, owner.Port); + ViewerClient.TrySend(list, out _, owner.Port); + + for (var index = 0; index < 3; index++) + { + await Assert.That(ViewerClient.TrySend(new(ViewerVerb.Accept, "key"), out _, owner.Port)).IsTrue(); + await Assert.That(ViewerClient.TrySend(new(ViewerVerb.Discard, "key"), out _, owner.Port)).IsTrue(); + } + + await Assert.That(owner.Accepted).IsEqualTo(8); + } + + /// + /// An owner from before any of this is listed a connection each, as it is told. + /// + [Test] + public async Task AnOwnerThatPredatesItIsListedAConnectionEach() + { + using var owner = new OlderOwner(); + + for (var index = 0; index < 5; index++) + { + await Assert.That(ViewerClient.TrySend(list, out _, owner.Port)).IsTrue(); + } + + var requests = owner.Requests; + await Assert.That(requests.Count).IsEqualTo(5); + foreach (var request in requests) + { + await Assert.That(request).IsEqualTo(list.Build()); + } + } + + /// + /// A listing is how a window learns its owner has gone, so one sent down a connection the + /// owner closed has to come back saying so, and the one after an owner has taken the port + /// again has to reach it. + /// + [Test] + public async Task AListingFindsItsOwnerGoneAndTheNextOne() + { + int port; + using (var owner = new Owner()) + { + port = owner.Port; + ViewerClient.TrySend(list, out _, port); + await Assert.That(ViewerClient.TrySend(list, out _, port)).IsTrue(); + } + + await Assert.That(ViewerClient.TrySend(list, out _, port)).IsFalse(); + + using var next = new Owner(port: port); + await Assert.That(ViewerClient.TrySend(list, out _, port)).IsTrue(); + await Assert.That(ViewerClient.TrySend(list, out _, port)).IsTrue(); + await Assert.That(next.Heard.Count).IsEqualTo(2); + } + /// /// The kept connection is this process's alone. On .NET Framework a socket is inheritable and /// a process started without ShellExecute is handed every inheritable handle, so a child a diff --git a/src/DiffEngine/Protocol/ViewerClient.cs b/src/DiffEngine/Protocol/ViewerClient.cs index c4e4f37f..ddcc74c1 100644 --- a/src/DiffEngine/Protocol/ViewerClient.cs +++ b/src/DiffEngine/Protocol/ViewerClient.cs @@ -226,9 +226,14 @@ internal static void ForgetUnowned() { lastFound.Clear(); reportedForeign.Clear(); - lock (keptGate) + lock (telling.Gate) { - DropKept(); + telling.Drop(); + } + + lock (listing.Gate) + { + listing.Drop(); } } @@ -363,22 +368,22 @@ public static bool TrySend(ViewerMessage message) => /// internal static bool Tell(ViewerMessage message, int port) { - switch (SendKept(message, port, out var ok)) + switch (SendKept(telling, message, port, timeout, out var response)) { case KeptSend.Answered: - return ok; + return response!.Ok; case KeptSend.Unanswered: return false; } - if (!Exchange(message, out var response, out var keeps, port, null, skipIfUnowned: true)) + if (!Exchange(message, out response, out var keeps, port, null, skipIfUnowned: true)) { return false; } if (keeps) { - KeepConnection(port); + KeepConnection(telling, port); } return response.Ok; @@ -388,7 +393,8 @@ enum KeptSend { /// /// No connection is kept to that port, or the one that was has gone, as it does when its - /// owner exits. The ordinary exchange is what finds out who is there now. + /// owner exits. The ordinary exchange is what finds out who is there now. Or the one + /// kept is in the middle of someone else's exchange and this send does not wait for it. /// NotKept, @@ -409,40 +415,104 @@ sealed class KeptConnection(TcpClient client, int port) : public NetworkStream Stream { get; } = client.GetStream(); public StreamReader Reader { get; } = new(client.GetStream(), Encoding.UTF8); + /// + /// How long the next request waits to be written and answered, which is its caller's to + /// say: a tray's timer asks with half a second and a window's listing with fifteen. + /// + public void Allow(TimeSpan wait) => + Configure(client, wait); + public void Dispose() => client.Close(); } /// - /// Held for the whole of an exchange on the kept connection, which is one request and its - /// answer at a time. A parallel run's settles take turns at it, each for about as long as - /// the owner takes to answer. + /// A connection that is kept, and whose turn it is on it. + /// + /// The gate is held for the whole of an exchange on the connection, which is one request and + /// its answer at a time. is what a send does when it finds the gate held. + /// /// - static readonly object keptGate = new(); + sealed class KeptSlot(bool queues) + { + public readonly object Gate = new(); - static KeptConnection? kept; + public KeptConnection? Connection; + + /// + /// Whether a send waits its turn, or leaves the connection to whoever has it and makes + /// one of its own. + /// + public bool Queues { get; } = queues; + + /// + /// Called with the gate held. + /// + public void Drop() + { + Connection?.Dispose(); + Connection = null; + } + } + + /// + /// The connection the telling sends go down. A parallel run's settles take turns at it, each + /// for about as long as the owner takes to answer. + /// + static readonly KeptSlot telling = new(queues: true); /// - /// The socket of the kept connection, or null with none kept. For the test of whether a - /// child process would be handed it, which is a property of the handle and of nothing an + /// The connection the listings go down: see . One of its own, because the + /// owner answers a connection's requests in turn, and a listing an owner is slow to answer + /// would otherwise stand in front of every settle the process sent behind it. And not waited + /// for, because the callers are a timer and a window that each list on their own clock, with + /// waits of their own: a listing that finds another in flight is a connection each, as every + /// listing used to be. + /// + static readonly KeptSlot listing = new(queues: false); + + /// + /// The socket of the kept telling connection, or null with none kept. For the test of whether + /// a child process would be handed it, which is a property of the handle and of nothing an /// exchange shows. /// internal static IntPtr? KeptHandle { get { - lock (keptGate) + lock (telling.Gate) { - return kept?.Handle; + return telling.Connection?.Handle; } } } - static KeptSend SendKept(ViewerMessage message, int port, out bool ok) + static KeptSend SendKept( + KeptSlot slot, + ViewerMessage message, + int port, + TimeSpan wait, + out ViewerResponse? response) { - ok = false; - lock (keptGate) + response = null; + var entered = false; + try { + if (slot.Queues) + { + Monitor.Enter(slot.Gate, ref entered); + } + else + { + Monitor.TryEnter(slot.Gate, ref entered); + } + + if (!entered) + { + return KeptSend.NotKept; + } + + var kept = slot.Connection; if (kept is null) { return KeptSend.NotKept; @@ -450,12 +520,13 @@ static KeptSend SendKept(ViewerMessage message, int port, out bool ok) if (kept.Port != port) { - DropKept(); + slot.Drop(); return KeptSend.NotKept; } try { + kept.Allow(wait); var bytes = Encoding.UTF8.GetBytes($"{message.Build()}\n"); kept.Stream.Write(bytes, 0, bytes.Length); kept.Stream.Flush(); @@ -468,25 +539,31 @@ static KeptSend SendKept(ViewerMessage message, int port, out bool ok) } if (line is not null && - ViewerResponse.TryParse(reply.ToString(), out var response)) + ViewerResponse.TryParse(reply.ToString(), out response)) { Found(port, true); - ok = response.Ok; return KeptSend.Answered; } // Closed by the owner, which is an owner that stopped or exited since the last // send. Whoever holds the port now is for the ordinary exchange to find - DropKept(); + slot.Drop(); return KeptSend.NotKept; } catch (Exception exception) when (Ignorable(exception)) { - DropKept(); + slot.Drop(); return TimedOut(exception) ? KeptSend.Unanswered : KeptSend.NotKept; } } + finally + { + if (entered) + { + Monitor.Exit(slot.Gate); + } + } } static bool TimedOut(Exception exception) => @@ -499,22 +576,38 @@ exception is IOException }; /// - /// Opens the connection the telling sends after this one go down, to an owner whose reply - /// has just said it keeps one. Failing to is nothing: the next send is an ordinary exchange, - /// and tries again on the strength of its own reply. + /// Opens the connection the sends after this one go down, to an owner whose reply has just + /// said it keeps one. Failing to is nothing: the next send is an ordinary exchange, and + /// tries again on the strength of its own reply. So is finding the gate held, on a slot + /// nothing waits for: whoever holds it has the connection, or is opening it. /// - static void KeepConnection(int port) + static void KeepConnection(KeptSlot slot, int port) { - lock (keptGate) + var entered = false; + try { - if (kept is not null) + if (slot.Queues) { - if (kept.Port == port) + Monitor.Enter(slot.Gate, ref entered); + } + else + { + Monitor.TryEnter(slot.Gate, ref entered); + } + + if (!entered) + { + return; + } + + if (slot.Connection is not null) + { + if (slot.Connection.Port == port) { return; } - DropKept(); + slot.Drop(); } var client = new TcpClient(); @@ -537,7 +630,7 @@ static void KeepConnection(int port) var bytes = Encoding.UTF8.GetBytes($"{ViewerServer.Keep}\n"); connection.Stream.Write(bytes, 0, bytes.Length); connection.Stream.Flush(); - kept = connection; + slot.Connection = connection; } catch (Exception exception) when (Ignorable(exception)) @@ -545,13 +638,30 @@ static void KeepConnection(int port) client.Close(); } } + finally + { + if (entered) + { + Monitor.Exit(slot.Gate); + } + } } - static void DropKept() - { - kept?.Dispose(); - kept = null; - } + /// + /// Whether a message only reads the queue, so that it can go down a kept connection as the + /// telling sends do. + /// + /// The listings are the asking sends there are many of: a window showing an owner's queue + /// lists five times a second for as long as it is open, and a tray driving one lists on a + /// timer, each a connection whose port then waited out TIME_WAIT. And they are the ones that + /// can be asked again. A request written to a kept connection whose owner has just gone is + /// sent a second time as an ordinary exchange, since nothing says whether the first was + /// acted on, and for a listing that is harmless. An accept or a discard asked twice is not, + /// so everything that changes the queue, and the async send, is still a connection each. + /// + /// + static bool Lists(ViewerMessage message) => + message.Verb is ViewerVerb.List or ViewerVerb.ListFull; #if NETFRAMEWORK /// @@ -605,14 +715,44 @@ static void KeepFromChildren(TcpClient client) /// and a listing answered from what was found ten minutes ago is a listing that misses one. /// The library's own sends pass true. /// + /// + /// A listing goes down a connection that is kept, where the owner keeps one and no other + /// listing is using it: see . Everything else is a connection of its own. + /// /// public static bool TrySend( ViewerMessage message, [NotNullWhen(true)] out ViewerResponse? response, int? port = null, TimeSpan? wait = null, - bool skipIfUnowned = false) => - Exchange(message, out response, out _, port, wait, skipIfUnowned); + bool skipIfUnowned = false) + { + if (!Lists(message)) + { + return Exchange(message, out response, out _, port, wait, skipIfUnowned); + } + + var endpointPort = port ?? Port; + switch (SendKept(listing, message, endpointPort, wait ?? timeout, out response)) + { + case KeptSend.Answered: + return response is not null; + case KeptSend.Unanswered: + return false; + } + + if (!Exchange(message, out response, out var keeps, port, wait, skipIfUnowned)) + { + return false; + } + + if (keeps) + { + KeepConnection(listing, endpointPort); + } + + return true; + } /// /// The ordinary exchange: a connection of its own, the request ended by closing the sending diff --git a/src/DiffEngine/Protocol/ViewerServer.cs b/src/DiffEngine/Protocol/ViewerServer.cs index 14cfc07c..ea5f2e42 100644 --- a/src/DiffEngine/Protocol/ViewerServer.cs +++ b/src/DiffEngine/Protocol/ViewerServer.cs @@ -190,7 +190,8 @@ async Task Accept(Cancel cancel) /// 16,000 ports to give out and keeps each for two minutes, a passing inline verification /// settles once, and so a large enough green run with a tray answering used up the machine's /// ports on telling the tray nothing. A client that has many of them to send keeps one - /// connection instead: see . + /// connection instead: see . And a second + /// for its listings, which a window showing this owner's queue sends five times a second. /// /// /// No request starts with this line, since every one starts with its version, so an owner From fc74790867e65063db814a74464df08f5f70a7c8 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:53:48 +1100 Subject: [PATCH 28/50] Describe only the queue rows that fit A screen is built whenever the state is another one, which a scroll or a drag makes it on every frame, and the queue column described every row of the queue - label, tooltip, a header's members - to draw the forty that fit: 0.75 ms and 1.1 MB a screen at 2,000 entries. QueueProjection now walks the queue into slots that say where each row is and nothing about it, slices those, and describes the slice. The same walk answers VisibleEntries, which had its own undescribed rows. A label is grown by collisions anywhere in the queue, so labels are still decided over all of it, but once a queue: they are kept, weakly, against the queue's list, which is replaced and never changed. FrameBenchmarks, 2,000 entries: 745 us and 1,077 KB before, 33 us and 49 KB after for a state whose queue is the list it was, and 222 us and 358 KB for the first screen of a changed queue, which the benchmark now measures too. QueueSliceTests holds the slice to the rows of the whole list for every selection and fold of forty random queues, a label to a collision that is off screen, and the allocation of a screen after a scroll, which failed at 967,760 bytes against the old projection. --- .../FrameBenchmarks.cs | 9 +- src/DiffEngineViewer.Tests/QueueSliceTests.cs | 126 +++++++++ src/DiffEngineViewer/QueueProjection.cs | 240 +++++++++++------- 3 files changed, 286 insertions(+), 89 deletions(-) create mode 100644 src/DiffEngineViewer.Tests/QueueSliceTests.cs diff --git a/src/DiffEngineViewer.Benchmarks/FrameBenchmarks.cs b/src/DiffEngineViewer.Benchmarks/FrameBenchmarks.cs index a9bab873..0031b4d7 100644 --- a/src/DiffEngineViewer.Benchmarks/FrameBenchmarks.cs +++ b/src/DiffEngineViewer.Benchmarks/FrameBenchmarks.cs @@ -36,11 +36,18 @@ public void Setup() readonly ScreenCache screens = new(); - // One screen from one state: what every frame paid, and what a change to the state still does. + // One screen from one state: what every frame paid, and what a change to the state that leaves + // the queue the list it was still does. A scroll and a drag are that, every frame they last. [Benchmark(Baseline = true)] public object BuildScreen() => ScreenBuilder.Build(state); + // And the screen of a queue that is another list, which is what an arrival, an accept or a + // settle leaves: the labels are worked out again, over every entry. + [Benchmark] + public object BuildScreenOfAChangedQueue() => + ScreenBuilder.Build(state with { Queue = [..state.Queue] }); + // What the loop asks for each frame now: the screen of the state, which is the one in hand // whenever the state is the one the last frame had. [Benchmark] diff --git a/src/DiffEngineViewer.Tests/QueueSliceTests.cs b/src/DiffEngineViewer.Tests/QueueSliceTests.cs new file mode 100644 index 00000000..947bafa7 --- /dev/null +++ b/src/DiffEngineViewer.Tests/QueueSliceTests.cs @@ -0,0 +1,126 @@ +/// +/// The queue column is sliced to the rows that fit before any of them is described. Every frame +/// of a scroll or a drag is another state and so another screen, and describing every row of the +/// queue to draw the forty that fit was half a millisecond and a megabyte a frame at 2,000 +/// entries. A row has to say what it said when every row was described. +/// +public class QueueSliceTests +{ + /// + /// Whichever entry is selected and whatever is folded, the rows on screen are the same rows of + /// the whole list, labels grown by a collision elsewhere in the queue included. + /// + [Test] + public async Task TheRowsOnScreenAreRowsOfTheWholeList() + { + var random = new Random(21); + for (var iteration = 0; iteration < 40; iteration++) + { + // Ten rows of window is two of queue, so nearly every queue here is longer than it + var state = ViewerSession.Resize(Mixed(random), Fixtures.Columns, 10 + random.Next(6)); + await EverySelection(state); + foreach (var header in QueueProjection.Rows(state).Where(_ => _.GroupKey is not null).ToList()) + { + await EverySelection(ViewerSession.ToggleGroup(state, header.GroupKey!)); + } + } + } + + static async Task EverySelection(SessionState state) + { + var body = ScreenBuilder.BodyRows(state); + for (var selected = 0; selected < state.Queue.Count; selected++) + { + var selecting = state with { Selected = selected }; + var rows = QueueProjection.Rows(selecting); + var visible = QueueProjection.Visible(selecting, body, out var top); + await Assert.That(visible.Count).IsEqualTo(Math.Min(body, rows.Count)); + await Assert.That(visible.SequenceEqual(rows.Skip(top).Take(body))).IsTrue(); + } + } + + /// + /// A label is grown to tell an entry from one it would otherwise read the same as, and the + /// other one need not be on screen. So the labels are decided over the whole queue, whichever + /// rows are described. + /// + [Test] + public async Task ALabelIsGrownByAnEntryThatIsNotOnScreen() + { + var patches = new List + { + Fixtures.Patch(Fixtures.SolutionFile("SolutionA", "First", "Tests.cs"), 10, testName: "Same name") + }; + for (var index = 0; index < 30; index++) + { + patches.Add(Fixtures.Patch(Fixtures.SolutionFile("SolutionA", "First", $"Other{index}.cs"), 10, testName: $"Test {index}")); + } + + patches.Add(Fixtures.Patch(Fixtures.SolutionFile("SolutionA", "Second", "Tests.cs"), 10, testName: "Same name")); + var state = Fixtures.Inline([.. patches]); + + var visible = QueueProjection.Visible(state, ScreenBuilder.BodyRows(state), out var top); + + await Assert.That(top).IsEqualTo(0); + await Assert.That(visible.Count).IsLessThan(state.Queue.Count); + await Assert.That(visible[0].Label).IsEqualTo("First/Same name"); + } + + /// + /// What the slicing is for, seen by what a screen allocates: a scroll leaves the queue the + /// list it was, and the screen built after one describes the rows that fit and no others. + /// + [Test] + public async Task AScrollDescribesOnlyTheRowsThatFit() + { + var state = SessionState.Start(ViewerMode.Inline, Fixtures.Columns, Fixtures.Rows); + for (var index = 0; index < 2000; index++) + { + state = ViewerSession.EnqueueInline( + state, + Fixtures.Patch($"Sample{index % 40}Tests.cs", 10 + index, "\"old\"", $"new {index}\nand more\nand more", testName: $"Test{index}")); + } + + // The first screen of a queue works out its labels, which is once a queue + ScreenBuilder.Build(state); + var scrolled = ViewerSession.Apply(state, CommandKind.ScrollDown); + await Assert.That(scrolled).IsNotSameReferenceAs(state); + + var before = GC.GetAllocatedBytesForCurrentThread(); + var screen = ScreenBuilder.Build(scrolled); + var allocated = GC.GetAllocatedBytesForCurrentThread() - before; + + await Assert.That(screen.Queue.Count).IsEqualTo(ScreenBuilder.BodyRows(state)); + // Every row described was over a megabyte. What is left is the walk, a few bytes an entry + await Assert.That(allocated).IsLessThan(150_000); + } + + /// + /// Snapshots across two solutions and outside any, some sharing a test and some sharing only + /// a test's name across projects, so there are headers of both kinds and labels that collide. + /// + static SessionState Mixed(Random random) + { + string[] solutions = ["SolutionA", "SolutionB"]; + string[] projects = ["First", "Second"]; + var patches = new List(); + for (var index = random.Next(6, 24); index > 0; index--) + { + var file = $"Tests{random.Next(3)}.cs"; + var source = random.Next(4) == 0 + ? file + : Fixtures.SolutionFile(solutions[random.Next(2)], projects[random.Next(2)], file); + patches.Add( + Fixtures.Patch( + source, + 10 + patches.Count, + $"\"old{patches.Count}\"", + $"new {patches.Count}", + testName: random.Next(3) == 0 ? null : $"Test{random.Next(4)}")); + } + + var state = Fixtures.Inline([.. patches]); + state = ViewerSession.EnqueueTracked(state, Fixtures.Move(solution: "SolutionA")); + return ViewerSession.EnqueueTracked(state, Fixtures.Delete(solution: "SolutionB")); + } +} diff --git a/src/DiffEngineViewer/QueueProjection.cs b/src/DiffEngineViewer/QueueProjection.cs index cd7dc246..a8e78ee7 100644 --- a/src/DiffEngineViewer/QueueProjection.cs +++ b/src/DiffEngineViewer/QueueProjection.cs @@ -99,21 +99,44 @@ public static IReadOnlyList Order(IReadOnlyList entries) /// The full row list: headers inserted, labels indented, collisions disambiguated, conflicts /// marked. Assumes the queue is already ed, which every mutation ensures. /// - public static IReadOnlyList Rows(SessionState state) => - Rows(state, described: true); + public static IReadOnlyList Rows(SessionState state) + { + var slots = Walk(state); + return Describe(state, slots, 0, slots.Count); + } + + /// + /// Where a row is, before anything is said about it: which entry it is, or which run of + /// entries its header stands over. + /// + /// What the row is. + /// The entry, or the first of a header's. + /// One past the last of a header's entries. + /// Whether the row sits under a solution's header. + /// For a header, whether its entries are hidden. + readonly record struct Slot(SlotKind Kind, int Start, int End, bool Indented, bool Folded); + + enum SlotKind : byte + { + Solution, + Test, + Entry, + // An entry under a test's header + Member + } /// /// The one walk that decides which rows there are: what gets a header, and what a fold hides. + /// + /// It says where each row is and nothing about it. A label, a tooltip and a header's members + /// are a kilobyte and more an entry, and two things ask for the rows without wanting them: + /// , which is asked on every step through the queue and after + /// every entry a batch records, and , which draws the forty rows that fit + /// out of however many there are. The same walk for all of them, so what is visible cannot be + /// decided twice. + /// /// - /// The state whose queue is projected. - /// - /// Whether the rows are to be drawn, and so want their labels, tooltips and group members. Not - /// for , which asks only which entries have a row: that is asked - /// on every step through the queue and after every entry a batch records, and describing every - /// row to answer it was a kilobyte and more an entry each time. The same walk either way, so - /// what is visible cannot be decided twice. - /// - static IReadOnlyList Rows(SessionState state, bool described) + static List Walk(SessionState state) { var entries = state.Queue; if (state.Mode == ViewerMode.File || @@ -122,24 +145,25 @@ static IReadOnlyList Rows(SessionState state, bool described) return []; } - var solutions = new List(); - foreach (var entry in entries) + // The queue is in order, so a second solution is wherever the first one's run ends + var showSolutions = false; + for (var index = 1; index < entries.Count; index++) { - if (!solutions.Contains(entry.Solution)) + if (entries[index].Solution != entries[0].Solution) { - solutions.Add(entry.Solution); + showSolutions = true; + break; } } - var showSolutions = solutions.Count >= 2; - var labels = described ? Labels(entries) : null; - - var rows = new List(); - var index = 0; - while (index < entries.Count) + // Nothing folded is nearly every queue, and then no header's key needs making to ask + var folds = state.Collapsed.Count > 0; + var slots = new List(entries.Count + 1); + var position = 0; + while (position < entries.Count) { - var bucket = entries[index].Solution; - var bucketEnd = index; + var bucket = entries[position].Solution; + var bucketEnd = position; while (bucketEnd < entries.Count && entries[bucketEnd].Solution == bucket) { @@ -147,33 +171,21 @@ static IReadOnlyList Rows(SessionState state, bool described) } var header = showSolutions && bucket is not null; - var bucketKey = $"solution|{bucket}"; if (header) { - var folded = state.Collapsed.Contains(bucketKey); - rows.Add( - described - ? new($"{Marker(folded)} {bucket} ({bucketEnd - index})", false, null, QueueRowKind.Header) - { - GroupName = bucket, - GroupKey = bucketKey, - GroupMembers = Enumerable.Range(index, bucketEnd - index).ToList() - } - : undescribedHeader); - + var folded = folds && state.Collapsed.Contains(SolutionKey(bucket)); + slots.Add(new(SlotKind.Solution, position, bucketEnd, false, folded)); if (folded) { - index = bucketEnd; + position = bucketEnd; continue; } } - // Two, so an entry sits under its header's text rather than under the header's marker. - var indent = header ? " " : ""; - while (index < bucketEnd) + while (position < bucketEnd) { - var group = TestGroup(entries[index]); - var groupEnd = index; + var group = TestGroup(entries[position]); + var groupEnd = position; while (group is not null && groupEnd < bucketEnd && TestGroup(entries[groupEnd]) == group) @@ -181,55 +193,92 @@ static IReadOnlyList Rows(SessionState state, bool described) groupEnd++; } - if (groupEnd - index >= 2) + if (groupEnd - position >= 2) { - var groupKey = $"test|{group}"; - var folded = state.Collapsed.Contains(groupKey); - rows.Add( - described - ? new($"{indent}{Marker(folded)} {entries[index].TestName} ({groupEnd - index})", false, null, QueueRowKind.Header) - { - GroupName = entries[index].TestName, - GroupKey = groupKey, - GroupMembers = Enumerable.Range(index, groupEnd - index).ToList() - } - : undescribedHeader); + var folded = folds && state.Collapsed.Contains(TestKey(group)); + slots.Add(new(SlotKind.Test, position, groupEnd, header, folded)); if (folded) { - index = groupEnd; + position = groupEnd; continue; } - for (; index < groupEnd; index++) + for (; position < groupEnd; position++) { - // Under a test header the test name would repeat, so the entry falls back - // to its call site — and its tip leaves the name out for the same reason. - rows.Add( - labels is null - ? Undescribed(index) - : EntryRow(entries[index], index, $"{indent} ", entries[index].Name, state, true)); + slots.Add(new(SlotKind.Member, position, position + 1, header, false)); } continue; } - rows.Add( - labels is null - ? Undescribed(index) - : EntryRow(entries[index], index, indent, labels[index], state)); - index++; + slots.Add(new(SlotKind.Entry, position, position + 1, header, false)); + position++; } } - return rows; + return slots; } - // What a walk that is not to be drawn puts where a row would be: that there is one, and for - // an entry which. - static readonly QueueItem undescribedHeader = new("", false, null, QueueRowKind.Header); + static string SolutionKey(string? solution) => + $"solution|{solution}"; - static QueueItem Undescribed(int index) => - new("", false, null, QueueRowKind.Entry, index); + static string TestKey(string? group) => + $"test|{group}"; + + /// + /// The rows for a run of slots: headers with their counts and members, entries with their + /// labels, tooltips and marks. + /// + /// A row says the same thing whether it is described with every other row or with the few on + /// screen. What a label grows to tell it from another is decided over the whole queue either + /// way (), and nothing else a row says depends on any row but its own. + /// + /// + static List Describe(SessionState state, List slots, int from, int to) + { + var entries = state.Queue; + var rows = new List(Math.Max(0, to - from)); + string[]? labels = null; + for (var index = from; index < to; index++) + { + var slot = slots[index]; + // Two, so an entry sits under its header's text rather than under the header's marker. + var indent = slot.Indented ? " " : ""; + var entry = entries[slot.Start]; + switch (slot.Kind) + { + case SlotKind.Solution: + rows.Add( + new($"{Marker(slot.Folded)} {entry.Solution} ({slot.End - slot.Start})", false, null, QueueRowKind.Header) + { + GroupName = entry.Solution, + GroupKey = SolutionKey(entry.Solution), + GroupMembers = Enumerable.Range(slot.Start, slot.End - slot.Start).ToList() + }); + break; + case SlotKind.Test: + rows.Add( + new($"{indent}{Marker(slot.Folded)} {entry.TestName} ({slot.End - slot.Start})", false, null, QueueRowKind.Header) + { + GroupName = entry.TestName, + GroupKey = TestKey(TestGroup(entry)), + GroupMembers = Enumerable.Range(slot.Start, slot.End - slot.Start).ToList() + }); + break; + case SlotKind.Member: + // Under a test header the test name would repeat, so the entry falls back to + // its call site — and its tip leaves the name out for the same reason. + rows.Add(EntryRow(entry, slot.Start, $"{indent} ", entry.Name, state, true)); + break; + default: + labels ??= LabelsOf(entries); + rows.Add(EntryRow(entry, slot.Start, indent, labels[slot.Start], state)); + break; + } + } + + return rows; + } /// /// A disclosure marker, in both states. One that appeared only when folded would leave nothing @@ -250,11 +299,11 @@ static string Marker(bool collapsed) => public static List VisibleEntries(SessionState state) { var visible = new List(); - foreach (var row in Rows(state, described: false)) + foreach (var slot in Walk(state)) { - if (row.EntryIndex >= 0) + if (slot.Kind is SlotKind.Entry or SlotKind.Member) { - visible.Add(row.EntryIndex); + visible.Add(slot.Start); } } @@ -266,20 +315,26 @@ public static List VisibleEntries(SessionState state) /// stay visible, until the selection walks below the fold, then shifted to keep the selected /// row second from the bottom. is where the slice starts in the full /// projection, which is what maps a full-row anchor — the open menu's — into the slice. + /// + /// Sliced before anything is described. A state is another one on every frame of a scroll or + /// a drag, each of which builds a screen, and describing every row of the queue to draw the + /// ones that fit was half a millisecond and a megabyte a frame at 2,000 entries. + /// /// public static IReadOnlyList Visible(SessionState state, int body, out int top) { - var rows = Rows(state); + var slots = Walk(state); top = 0; - if (rows.Count <= body) + if (slots.Count <= body) { - return rows; + return Describe(state, slots, 0, slots.Count); } var selected = 0; - for (var index = 0; index < rows.Count; index++) + for (var index = 0; index < slots.Count; index++) { - if (rows[index].Selected) + if (slots[index].Kind is SlotKind.Entry or SlotKind.Member && + slots[index].Start == state.Selected) { selected = index; break; @@ -288,14 +343,8 @@ public static IReadOnlyList Visible(SessionState state, int body, out top = selected < body ? 0 - : Math.Min(selected - (body - 2), rows.Count - body); - var slice = new List(body); - for (var index = top; index < top + body && index < rows.Count; index++) - { - slice.Add(rows[index]); - } - - return slice; + : Math.Min(selected - (body - 2), slots.Count - body); + return Describe(state, slots, top, Math.Min(top + body, slots.Count)); } // The conflict marker leads rather than trails, because trailing decorations are the first @@ -397,6 +446,21 @@ static QueueItem EntryRow( _ => null }; + /// + /// for a queue, worked out once for as long as the queue is that one. + /// + /// A label depends on every other entry's, so it cannot be had for the rows on screen alone: + /// the collisions are counted over the whole queue. But a queue is a list that is replaced and + /// never changed, and a scroll, a drag, a selection or a fold leaves it the list it was, so the + /// labels are kept against the list itself. Weakly, so they go when it does. + /// + /// + static string[] LabelsOf(IReadOnlyList entries) => + labelled.GetValue(entries, labelsOf); + + static readonly ConditionalWeakTable, string[]> labelled = new(); + static readonly ConditionalWeakTable, string[]>.CreateValueCallback labelsOf = Labels; + /// /// The label an entry shows when it stands alone: the test name when one is known, else the /// call site or the tracked file name. Collisions within a solution — the same file name and From 4cb92e2402135b13f2dddf2a49c196d57a6dc84f Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:58:59 +1100 Subject: [PATCH 29/50] Encode a row for the native heads as far as a pane can show it ScreenPayload cut a row at the window's width counted in characters, so a row of two cell characters was encoded four times as far as either pane could show it, a segment a character: 3.6 ms and 3 MB a changed frame for a 4K window of 300 character CJK lines. A row is now cut in cells, at Screen.PaneCells: half the window rounded up and one more. That is a bound rather than a pane's width, which is each head's to decide, but both native heads split the panes equally, so neither pane is wider, and the gutter in front of the text is room to spare. What is left out was never drawn, so the ABI and the captures are as they were. The cut is found by the walk that segments the row (CellGrid.Segments(text, cells, out end)) and that much of the row's own string is encoded, so a row costs no string of its own. A row much longer than a pane goes through RowText.Shown first, which reads it from the front: flattening all of a megabyte line was a copy of it a frame. ScreenPayloadBenchmarks, EncodeAChangedScreen: cjk 3,646 us and 3,069 KB before, 1,661 us and 808 KB after; box 266 us to 179 us; ascii unchanged at about 45 us and 15 KB. What is left for CJK is CellGrid classifying each cluster, about 60 ns each. ScreenPayloadTests.ARowIsEncodedAsFarAsAPaneCanShowIt failed against the old cut (200 characters encoded where 51 fit), and CellGridTests holds the new overload to Segments of the row cut at Index, for every cut of 300 random rows. --- .../ScreenPayloadBenchmarks.cs | 5 +- src/DiffEngineViewer.Tests/CellGridTests.cs | 28 ++++++++ .../ScreenPayloadTests.cs | 31 ++++++++- src/DiffEngineViewer/CellGrid.cs | 66 +++++++++++++++++++ src/DiffEngineViewer/Model/Screen.cs | 18 ++++- src/DiffEngineViewer/Native/ScreenPayload.cs | 34 ++++++---- 6 files changed, 166 insertions(+), 16 deletions(-) diff --git a/src/DiffEngineViewer.Benchmarks/ScreenPayloadBenchmarks.cs b/src/DiffEngineViewer.Benchmarks/ScreenPayloadBenchmarks.cs index e3b4de9e..613f3dc9 100644 --- a/src/DiffEngineViewer.Benchmarks/ScreenPayloadBenchmarks.cs +++ b/src/DiffEngineViewer.Benchmarks/ScreenPayloadBenchmarks.cs @@ -7,8 +7,9 @@ // the row's bytes again from its start, so such a row cost by the square of its length. // // A window the size of a 4K display: 426 cells across and 130 down at the 9 pixel cell. Lines of -// 300 characters, since a row is encoded as far as the window is wide rather than the pane, so a -// long line is where a row's length shows. +// 300 characters, which is past the end of a pane whatever the characters are: a row is encoded as +// far as a pane can show it, 214 cells here, where it was once encoded as far as the window is +// wide in characters, which for two cell characters was all 300 of them. [MemoryDiagnoser] public class ScreenPayloadBenchmarks { diff --git a/src/DiffEngineViewer.Tests/CellGridTests.cs b/src/DiffEngineViewer.Tests/CellGridTests.cs index c37ebdb0..80b4d204 100644 --- a/src/DiffEngineViewer.Tests/CellGridTests.cs +++ b/src/DiffEngineViewer.Tests/CellGridTests.cs @@ -204,6 +204,34 @@ public async Task SnapsToWholeCharacters(int cell, int snapped, int index) await Assert.That(CellGrid.Index(text, cell)).IsEqualTo(index); } + /// + /// The segments of the start of a row, found in one walk, are the segments of the row cut + /// where its first cells end: every kind of character, cut at every cell. + /// + [Test] + public async Task TheSegmentsOfTheStartOfARowAreThoseOfTheRowCutThere() + { + string[] pieces = ["a", "bc", " ", "中", "f", "é", "é̂", "\U0001D400", "\U0001F600", "\U0001F468‍\U0001F469‍\U0001F467", "─", "\uD800", "́", "→"]; + var random = new Random(31); + for (var iteration = 0; iteration < 300; iteration++) + { + var builder = new StringBuilder(); + for (var count = random.Next(0, 12); count > 0; count--) + { + builder.Append(pieces[random.Next(pieces.Length)]); + } + + var text = builder.ToString(); + for (var cells = -1; cells <= CellGrid.Cells(text) + 1; cells++) + { + var start = CellGrid.Segments(text, cells, out var end); + + await Assert.That(end).IsEqualTo(CellGrid.Index(text, cells)); + await Assert.That(start.SequenceEqual(CellGrid.Segments(text[..end]))).IsTrue(); + } + } + } + [Test] public async Task NeverSplitsACharacterFromItsMarks() { diff --git a/src/DiffEngineViewer.Tests/ScreenPayloadTests.cs b/src/DiffEngineViewer.Tests/ScreenPayloadTests.cs index b4993a6e..4a448f8f 100644 --- a/src/DiffEngineViewer.Tests/ScreenPayloadTests.cs +++ b/src/DiffEngineViewer.Tests/ScreenPayloadTests.cs @@ -31,7 +31,7 @@ public async Task ASegmentIsTheBytesOfItsOwnCharacters() var checkedSegments = 0; for (var index = 0; index < screen.Left.Rows.Count; index++) { - var text = RowText.Clip(RowText.Flatten(screen.Left.Rows[index].Text), screen.Columns); + var text = RowText.Shown(screen.Left.Rows[index].Text, screen.PaneCells); var row = payload.Rows[index]; var segments = CellGrid.Segments(text); await Assert.That(row.SegmentCount).IsEqualTo(segments.Count); @@ -55,6 +55,35 @@ public async Task ASegmentIsTheBytesOfItsOwnCharacters() await Assert.That(checkedSegments).IsGreaterThan(15); } + /// + /// A row is encoded as far as a pane can show it and no further. Neither pane is wider than + /// half the window, and a row of two cell characters cut at the window's width in characters + /// was encoded four times that far, a segment a character. + /// + [Test] + public async Task ARowIsEncodedAsFarAsAPaneCanShowIt() + { + var wide = new string('漢', 300); + var narrow = new string('a', 300); + var state = ViewerSession.Resize(Fixtures.File($"{wide}\n{narrow}\n\t{narrow}\nshort", "other"), 200, 30); + var screen = ScreenBuilder.Build(state); + var payload = new ScreenPayload(); + + payload.Build(screen); + + await Assert.That(screen.PaneCells).IsEqualTo(101); + // Fifty one characters are the first to reach a hundred and one cells, at two cells each + await Assert.That(Text(payload, 0)).IsEqualTo(new string('漢', 51)); + await Assert.That(payload.Rows[0].SegmentCount).IsEqualTo(51); + await Assert.That(Text(payload, 1)).IsEqualTo(new string('a', 101)); + // A tab is the four cells it is drawn as + await Assert.That(Text(payload, 2)).IsEqualTo(" " + new string('a', 97)); + await Assert.That(Text(payload, 3)).IsEqualTo("short"); + } + + static string Text(ScreenPayload payload, int row) => + Encoding.UTF8.GetString(payload.Strings.Slice(payload.Rows[row].TextOffset, payload.Rows[row].TextLength)); + /// /// The loop hands over the screen it handed over last frame for as long as nothing happens, /// and encoding that one again was most of what an idle frame cost these heads. Seen by what diff --git a/src/DiffEngineViewer/CellGrid.cs b/src/DiffEngineViewer/CellGrid.cs index f0ea57a1..1498a405 100644 --- a/src/DiffEngineViewer/CellGrid.cs +++ b/src/DiffEngineViewer/CellGrid.cs @@ -85,6 +85,72 @@ public static IReadOnlyList Segments(string flattened) return segments; } + /// + /// for the start of a row: as far as its first + /// cells, with where in + /// that is. The cut is 's, so these are the + /// segments of the row cut there, found in the one walk rather than by cutting the row and + /// walking what is left: a renderer that encodes every row on screen asks this of each, and a + /// row of two cell characters was walked once to find the cut and again to segment it. + /// + public static IReadOnlyList Segments(string flattened, int cells, out int end) + { + end = 0; + if (flattened.Length == 0 || + cells <= 0) + { + return []; + } + + if (IsPlain(flattened)) + { + end = Math.Min(cells, flattened.Length); + return [new(0, end, 0)]; + } + + end = flattened.Length; + var segments = new List(); + var column = 0; + var runStart = -1; + var runColumn = 0; + foreach (var cluster in Clusters(flattened)) + { + if (column >= cells) + { + end = cluster.Start; + break; + } + + if (cluster.Simple) + { + if (runStart < 0) + { + runStart = cluster.Start; + runColumn = column; + } + } + else + { + if (runStart >= 0) + { + segments.Add(new(runStart, cluster.Start - runStart, runColumn)); + runStart = -1; + } + + segments.Add(new(cluster.Start, cluster.Length, column)); + } + + column += cluster.Width; + } + + if (runStart >= 0) + { + segments.Add(new(runStart, end - runStart, runColumn)); + } + + return segments; + } + /// /// How many cells takes. /// diff --git a/src/DiffEngineViewer/Model/Screen.cs b/src/DiffEngineViewer/Model/Screen.cs index b33a1357..3742d473 100644 --- a/src/DiffEngineViewer/Model/Screen.cs +++ b/src/DiffEngineViewer/Model/Screen.cs @@ -22,4 +22,20 @@ record Screen( // selection-anchored slice. int PendingCount, // The open context menu, or null. Sliced to the visible rows like everything else. - MenuOverlay? Menu = null); + MenuOverlay? Menu = null) +{ + /// + /// The most cells of row text a pane can show, for a renderer that is handed a row's text + /// before it knows where its panes are: no more than this of a row is worth handing it. + /// + /// A bound rather than a pane's width, which is each head's to decide: its queue column can be + /// dragged, and its gutter is as wide as its line numbers. What every head agrees on is that + /// the two panes share the window equally, so neither is wider than half of it. Half of + /// rounded up, since the window's width in cells is rounded down, and + /// one more for the cell a pane's edge can cut through. The gutter in front of the text is + /// room to spare on top of that. + /// + /// + public int PaneCells => + (Columns + 1) / 2 + 1; +} diff --git a/src/DiffEngineViewer/Native/ScreenPayload.cs b/src/DiffEngineViewer/Native/ScreenPayload.cs index d48bbfc8..bfd88b57 100644 --- a/src/DiffEngineViewer/Native/ScreenPayload.cs +++ b/src/DiffEngineViewer/Native/ScreenPayload.cs @@ -58,8 +58,8 @@ public void Build(Screen screen) (subtitleOffset, subtitleLength) = Add(screen.Subtitle); (statusOffset, statusLength) = Add(screen.Status); - panes[0] = AddPane(screen.Left, screen.Columns); - panes[1] = AddPane(screen.Right, screen.Columns); + panes[0] = AddPane(screen.Left, screen.PaneCells); + panes[1] = AddPane(screen.Right, screen.PaneCells); foreach (var button in screen.Buttons) { @@ -188,19 +188,29 @@ unsafe DeviewScreen Native( MenuPane = menuPane }; - DeviewPane AddPane(Pane pane, int columns) + DeviewPane AddPane(Pane pane, int cells) { var (headerOffset, headerLength) = Add(pane.Header); var rowOffset = rows.Count; foreach (var row in pane.Rows) { - // Flattened, so a tab is drawn as the four cells a selection counts it as, and - // clipped to the window, for the reason RowText.Clip gives: marshalled and laid out - // whole every frame otherwise - var text = RowText.Clip(RowText.Flatten(row.Text), columns); - var (textOffset, textLength) = Add(text); + // Flattened, so a tab is drawn as the four cells a selection counts it as, and cut + // where a pane's cells end, for the reason RowText.Shown gives: marshalled and laid + // out whole every frame otherwise. In cells, and a pane's rather than the window's. + // Cut at the window's width in characters, a row of two cell characters was encoded + // four times as far as any pane could show it, a segment a character. + // + // The cut is found by the walk that segments the row, and what is encoded is that + // much of the string the row already is, so a row costs no string of its own. Only a + // row much longer than a pane is read from its front first, since flattening and + // measuring all of a megabyte line is what RowText.Shown is there to avoid + var text = row.Text.Length > cells * 2 + 2 + ? RowText.Shown(row.Text, cells) + : RowText.Flatten(row.Text); + var cut = CellGrid.Segments(text, cells, out var end); + var (textOffset, textLength) = Add(text.AsSpan(0, end)); var segmentOffset = segments.Count; - AddSegments(text, textOffset); + AddSegments(text, cut, textOffset); rows.Add( new() { @@ -247,11 +257,11 @@ DeviewPane AddPane(Pane pane, int columns) /// row's length squared. /// /// - void AddSegments(string text, int textOffset) + void AddSegments(string text, IReadOnlyList cut, int textOffset) { var measured = 0; var bytes = textOffset; - foreach (var segment in CellGrid.Segments(text)) + foreach (var segment in cut) { bytes += Encoding.UTF8.GetByteCount(text.AsSpan(measured, segment.Start - measured)); var length = Encoding.UTF8.GetByteCount(text.AsSpan(segment.Start, segment.Length)); @@ -267,7 +277,7 @@ void AddSegments(string text, int textOffset) } } - (int Offset, int Length) Add(string text) + (int Offset, int Length) Add(ReadOnlySpan text) { if (text.Length == 0) { From 879eb460d0839ce1f27fef222b757d98a85c29d8 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:02:03 +1100 Subject: [PATCH 30/50] Measure a diff of the same lines with runs of them moved TextDiffBenchmarks had the same lines reversed, where nothing is still in order and there is nothing for a diff to keep however it looks. Runs of fifty lines, one in four moved somewhere else, is the shape that sorting a list by another key leaves, and most of its order survives. Committed ahead of the change to what a search that settles does with it, so the earlier number can be had again: 48 ms at 10,000 lines and 311 ms at 40,000. --- src/DiffEngine.Benchmarks/TextDiffBenchmarks.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/DiffEngine.Benchmarks/TextDiffBenchmarks.cs b/src/DiffEngine.Benchmarks/TextDiffBenchmarks.cs index fe72b4e2..09c53efd 100644 --- a/src/DiffEngine.Benchmarks/TextDiffBenchmarks.cs +++ b/src/DiffEngine.Benchmarks/TextDiffBenchmarks.cs @@ -30,8 +30,25 @@ public void Setup() var lines = expected.Split('\n'); Array.Reverse(lines); reordered = string.Join('\n', lines); + // Every line survives, in runs of fifty, one run in four moved to somewhere else: what + // sorting a list by another key, or moving its sections about, leaves. Reversed, nothing + // is still in order, so there is nothing for a diff to find however it looks. Here most + // of an order survives, and a diff is as good as how much of it is kept. + var random = new Random(7); + var runs = expected.Split('\n').Chunk(50).ToArray(); + var places = Enumerable.Range(0, runs.Length) + .Select(_ => random.Next(4) == 0 ? random.Next(runs.Length) : _) + .ToArray(); + Array.Sort(places, runs); + runsMoved = string.Join('\n', runs.SelectMany(_ => _)); } + string runsMoved = ""; + + [Benchmark] + public int SameLinesWithRunsMoved() => + LineDiff.Build(expected, runsMoved).Entries.Count; + [Benchmark] public int OnePercentChanged() => LineDiff.Build(expected, onePercentChanged).Entries.Count; From 8ee249c30b10acab5e6239054fa478dbcf1ce8ee Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:10:07 +1100 Subject: [PATCH 31/50] Keep the longest run of lines still in order when a diff's search settles Past its budget a diff split wherever its search had got to, or where the start of one side was in the other. That finds one block moved whole. The same lines in another order are edits from end to end, so the search gets nowhere in them, and they came out as nearly all changed. A search that settles now asks first for the lines each side has once (LineAnchors), pairs them, and takes the longest run of the pairs still in order, by patience sorting: two sorts of the part and one of the pairs. The sequences are split at every line of the run at once, and each part between two of them is diffed with whatever budget is left. A run is used when it is at least sixteen long and longer than what the settled split had going for it, the lines its search passed or the run a displaced start led to. Only a search that has already given up on the smallest diff asks, so everything that was minimal is still minimal and costs what it did. Where every line is on both sides once, the run is the most that can be unchanged, so those diffs are minimal again at any length. A part is looked at for anchors once, then nothing inside one that had no run, and inside one that was split only parts of half its size or less, so the looking is a few sorts of the whole however often searches settle. Timed in one process, old against new, lowest of seven (the machine was busy, and the two were within noise of each other in time): 40,000 lines with one run of fifty in four moved kept 16,112 lines before and 28,800 after, 400,000 kept 164,732 and 299,400, in 364 ms and 195 ms; 400,000 lines shuffled kept 127 and 1,240, which is all that are still in order. TextDiffTests: LinesInAnotherOrderKeepTheLongestRunStillInOrder failed before at 29,872 of 31,200 and 133 of 328; the anchors are checked against the quadratic way of finding them, a diff that settles onto them is checked for correctness on 20,000 small random pairs, and the same elements in another order are minimal with nothing to spend. --- src/DiffEngine.Tests/TextDiffTests.cs | 139 ++++++++++++++++ src/DiffEngine/TextDiff/LineAnchors.cs | 215 +++++++++++++++++++++++++ src/DiffEngine/TextDiff/MyersDiff.cs | 155 ++++++++++++++++-- 3 files changed, 497 insertions(+), 12 deletions(-) create mode 100644 src/DiffEngine/TextDiff/LineAnchors.cs diff --git a/src/DiffEngine.Tests/TextDiffTests.cs b/src/DiffEngine.Tests/TextDiffTests.cs index d3ed7c63..f1489be7 100644 --- a/src/DiffEngine.Tests/TextDiffTests.cs +++ b/src/DiffEngine.Tests/TextDiffTests.cs @@ -377,6 +377,37 @@ public async Task AFewThousandLinesInAnotherOrderAreStillDiffedMinimally() await Assert.That(lines.Where(_ => _.Kind != DiffLineKind.Removed).Select(_ => _.Text).SequenceEqual(received)).IsTrue(); } + /// + /// Past what a diff may spend searching, lines that are each on both sides once are what it + /// goes by: the longest run of them still in order is kept, where the search alone left + /// nearly all of them changed. With every line on both sides once, as here, that run is the + /// most that can be unchanged, so the diff is minimal again however the lines were moved: + /// every line somewhere else, runs of them moved, and a few large blocks in another order. + /// + [Test] + [Arguments(30000, 1)] + [Arguments(40000, 50)] + [Arguments(60000, 3000)] + public async Task LinesInAnotherOrderKeepTheLongestRunStillInOrder(int count, int run) + { + var random = new Random(13); + var runs = Enumerable.Range(0, count).Chunk(run).ToArray(); + // One run in four somewhere else when there are many, and every run when there are few + var places = Enumerable.Range(0, runs.Length) + .Select(_ => run == 50 && random.Next(4) != 0 ? _ : random.Next(runs.Length)) + .ToArray(); + Array.Sort(places, runs); + var order = runs.SelectMany(_ => _).ToArray(); + var expected = Enumerable.Range(0, count).Select(_ => $"line {_}").ToList(); + var received = order.Select(_ => expected[_]).ToList(); + + var lines = TextDiff.Compute(string.Join("\n", expected), string.Join("\n", received)); + + await Assert.That(lines.Count(_ => _.Kind == DiffLineKind.Unchanged)).IsEqualTo(LongestIncreasingRun(order)); + await Assert.That(lines.Where(_ => _.Kind != DiffLineKind.Added).Select(_ => _.Text).SequenceEqual(expected)).IsTrue(); + await Assert.That(lines.Where(_ => _.Kind != DiffLineKind.Removed).Select(_ => _.Text).SequenceEqual(received)).IsTrue(); + } + // Patience sorting: the piles' tops stay sorted, and there are as many piles as the longest // increasing run is long. static int LongestIncreasingRun(int[] values) @@ -518,6 +549,114 @@ public void ASearchThatSettlesStillDiffsCorrectly() } } + /// + /// And searches that settle where there are elements to line up by, on sequences small enough + /// to check: some elements on each side once, some repeated, some on one side only, and a run + /// of any length taken as worth splitting by. What is left unchanged has to be the same + /// elements in the same order, whatever was split by an anchor and whatever by a search. + /// + [Test] + public void ASearchThatSettlesOnAnchorsStillDiffsCorrectly() + { + var random = new Random(14); + for (var iteration = 0; iteration < 20000; iteration++) + { + var alphabet = 2 + iteration % 80; + var a = RandomIds(random, random.Next(0, 60), alphabet); + var b = RandomIds(random, random.Next(0, 60), alphabet); + var budget = iteration % 40; + var minimumDepth = 1 + iteration % 5; + var anchorRun = 1 + iteration % 3; + var changedA = new bool[a.Length]; + var changedB = new bool[b.Length]; + + MyersDiff.Diff(a, b, changedA, changedB, budget, minimumDepth, anchorRun); + + var unchangedA = a.Where((_, index) => !changedA[index]); + var unchangedB = b.Where((_, index) => !changedB[index]); + if (!unchangedA.SequenceEqual(unchangedB)) + { + Assert.Fail($"budget: {budget} minimum: {minimumDepth} run: {anchorRun} a: {string.Join(",", a)} b: {string.Join(",", b)}"); + } + } + } + + /// + /// The same elements in another order, with nothing to spend on searching: every element is on + /// both sides once, so the longest run of them still in order is the most that can be + /// unchanged, and that is what is kept. + /// + [Test] + public void TheSameElementsInAnotherOrderKeepTheLongestRunWithNothingToSpend() + { + var random = new Random(15); + for (var iteration = 0; iteration < 5000; iteration++) + { + var a = Enumerable.Range(0, random.Next(2, 60)).ToArray(); + var b = a.OrderBy(_ => random.Next()).ToArray(); + var changedA = new bool[a.Length]; + var changedB = new bool[b.Length]; + + MyersDiff.Diff(a, b, changedA, changedB, 0, 1 + iteration % 5, 1); + + var unchangedA = a.Where((_, index) => !changedA[index]).ToList(); + var unchangedB = b.Where((_, index) => !changedB[index]); + if (!unchangedA.SequenceEqual(unchangedB) || + unchangedA.Count != LongestIncreasingRun(b)) + { + Assert.Fail($"kept {unchangedA.Count} of {LongestIncreasingRun(b)} a: {string.Join(",", a)} b: {string.Join(",", b)}"); + } + } + } + + /// + /// What the anchors are: elements on each side exactly once, in ascending places on both + /// sides, and as many of them as the longest such run has, checked against the quadratic way + /// of finding one. + /// + [Test] + public void AnchorsAreTheLongestRunOfUniqueElementsInOrder() + { + var random = new Random(16); + for (var iteration = 0; iteration < 5000; iteration++) + { + var alphabet = 2 + iteration % 80; + var a = RandomIds(random, random.Next(0, 60), alphabet); + var b = RandomIds(random, random.Next(0, 60), alphabet); + var unique = a + .Where(_ => a.Count(value => value == _) == 1 && b.Count(value => value == _) == 1) + .Select(_ => Array.IndexOf(b, _)) + .ToArray(); + var longest = LongestIncreasingRun(unique); + + var count = LineAnchors.Find(a, b, 1, out var xs, out var ys); + + if (count != longest) + { + Assert.Fail($"found {count} of {longest} a: {string.Join(",", a)} b: {string.Join(",", b)}"); + } + + for (var index = 0; index < count; index++) + { + var x = xs![index]; + var y = ys![index]; + if (a[x] != b[y] || + a.Count(_ => _ == a[x]) != 1 || + b.Count(_ => _ == a[x]) != 1 || + (index > 0 && (x <= xs[index - 1] || y <= ys[index - 1]))) + { + Assert.Fail($"anchor {index} at {x},{y} a: {string.Join(",", a)} b: {string.Join(",", b)}"); + } + } + + // One more than the longest is not there to find, which comes back as none + if (LineAnchors.Find(a, b, longest + 1, out _, out _) != 0) + { + Assert.Fail($"a run longer than {longest} a: {string.Join(",", a)} b: {string.Join(",", b)}"); + } + } + } + /// /// The same sequences with more to spend than any of them needs are diffed as they always /// were, so the budget costs nothing where it does not apply. diff --git a/src/DiffEngine/TextDiff/LineAnchors.cs b/src/DiffEngine/TextDiff/LineAnchors.cs new file mode 100644 index 00000000..8d54c9f6 --- /dev/null +++ b/src/DiffEngine/TextDiff/LineAnchors.cs @@ -0,0 +1,215 @@ +using System.Buffers; + +/// +/// The elements two sequences can be lined up by when searching for a diff has cost too much: +/// those that occur once in each, and of those the longest run that is in the same order in both. +/// +/// An element that is on each side once can only be matched with itself, so nothing has to be +/// searched to pair them up, and the longest run of the pairs still in order is found by patience +/// sorting, in the time of a sort. Each pair of the run is a point both sequences pass through, and +/// what lies between one point and the next is a diff of its own, a small one. +/// +/// +/// This is what falls back on, never what it starts with. A run of unique +/// elements in order is a diff, but not always the smallest: elements that repeat can line up +/// better some other way. So it is only asked for by a search that has already given up on the +/// smallest. +/// +/// +static class LineAnchors +{ + /// + /// The run, as positions in and the positions in + /// they pair with, both ascending. The arrays are rented, and the caller's to return, when + /// the count that comes back is more than zero. + /// + /// One sequence. + /// The other. + /// + /// How long a run is worth having. A shorter one comes back as none, and with fewer pairs + /// than this there is none to look for. + /// + /// Where each element of the run is in . + /// Where each is in . + public static int Find(ReadOnlySpan a, ReadOnlySpan b, int needed, out int[]? xs, out int[]? ys) + { + xs = null; + ys = null; + var most = Math.Min(a.Length, b.Length); + if (most == 0 || + most < needed) + { + return 0; + } + + var pool = ArrayPool.Shared; + var pairX = pool.Rent(most); + var pairY = pool.Rent(most); + try + { + var pairs = Pairs(a, b, pairX, pairY); + if (pairs == 0 || + pairs < needed) + { + return 0; + } + + // In the order of one side, the run is the longest increasing one of the other's + Array.Sort(pairX, pairY, 0, pairs); + return Longest(pairX, pairY, pairs, needed, out xs, out ys); + } + finally + { + pool.Return(pairX); + pool.Return(pairY); + } + } + + /// + /// Every element that is in each sequence exactly once, as where it is in each. Found by + /// sorting each side's elements with their positions and walking the two together, so nothing + /// is assumed about what an element is beyond that two of them can be compared. + /// + static int Pairs(ReadOnlySpan a, ReadOnlySpan b, int[] pairX, int[] pairY) + { + var pool = ArrayPool.Shared; + var valuesA = pool.Rent(a.Length); + var placesA = pool.Rent(a.Length); + var valuesB = pool.Rent(b.Length); + var placesB = pool.Rent(b.Length); + try + { + Sorted(a, valuesA, placesA); + Sorted(b, valuesB, placesB); + var pairs = 0; + var indexA = 0; + var indexB = 0; + while (indexA < a.Length && + indexB < b.Length) + { + var value = valuesA[indexA]; + if (value < valuesB[indexB]) + { + indexA++; + continue; + } + + if (value > valuesB[indexB]) + { + indexB++; + continue; + } + + var endA = indexA + 1; + while (endA < a.Length && + valuesA[endA] == value) + { + endA++; + } + + var endB = indexB + 1; + while (endB < b.Length && + valuesB[endB] == value) + { + endB++; + } + + if (endA - indexA == 1 && + endB - indexB == 1) + { + pairX[pairs] = placesA[indexA]; + pairY[pairs] = placesB[indexB]; + pairs++; + } + + indexA = endA; + indexB = endB; + } + + return pairs; + } + finally + { + pool.Return(valuesA); + pool.Return(placesA); + pool.Return(valuesB); + pool.Return(placesB); + } + } + + static void Sorted(ReadOnlySpan sequence, int[] values, int[] places) + { + sequence.CopyTo(values); + for (var index = 0; index < sequence.Length; index++) + { + places[index] = index; + } + + Array.Sort(values, places, 0, sequence.Length); + } + + /// + /// Patience sorting over the pairs' second halves. tops holds, for each length of run + /// so far, the pair that ends the one ending lowest, and each pair remembers the pair before + /// it in the run it extended, so the longest can be read back from its end. + /// + static int Longest(int[] pairX, int[] pairY, int pairs, int needed, out int[]? xs, out int[]? ys) + { + xs = null; + ys = null; + var pool = ArrayPool.Shared; + var tops = pool.Rent(pairs); + var before = pool.Rent(pairs); + try + { + var length = 0; + for (var pair = 0; pair < pairs; pair++) + { + var y = pairY[pair]; + var low = 0; + var high = length; + while (low < high) + { + var middle = (low + high) / 2; + if (pairY[tops[middle]] < y) + { + low = middle + 1; + } + else + { + high = middle; + } + } + + before[pair] = low == 0 ? -1 : tops[low - 1]; + tops[low] = pair; + if (low == length) + { + length++; + } + } + + if (length < needed) + { + return 0; + } + + xs = pool.Rent(length); + ys = pool.Rent(length); + var at = tops[length - 1]; + for (var index = length - 1; index >= 0; index--) + { + xs[index] = pairX[at]; + ys[index] = pairY[at]; + at = before[at]; + } + + return length; + } + finally + { + pool.Return(tops); + pool.Return(before); + } + } +} diff --git a/src/DiffEngine/TextDiff/MyersDiff.cs b/src/DiffEngine/TextDiff/MyersDiff.cs index 5d28ea46..81ab7cb9 100644 --- a/src/DiffEngine/TextDiff/MyersDiff.cs +++ b/src/DiffEngine/TextDiff/MyersDiff.cs @@ -19,6 +19,14 @@ /// fewer elements unchanged than it could have. Nothing the search used to do in a tenth of a /// second gets that far, so what was quick is exactly as it was. /// +/// +/// A search that settles first asks whether the two sequences can be lined up without searching, +/// by the elements each has once (). The same elements in another order +/// are edits from end to end, so a search gets nowhere in them however deep it goes, and split +/// wherever it stopped they came out as nearly all changed. The longest run of them still in +/// order is found in the time of a sort, and the sequences are split at every element of it at +/// once. +/// /// static class MyersDiff { @@ -47,6 +55,14 @@ static class MyersDiff /// internal const int MinimumDepth = 256; + /// + /// A run of elements in order, each on both sides once, is taken as how the sequences line up + /// once it is this long, and longer than whatever the search that settled had to go on. A + /// shorter one is a few lines that happen to be unique, and where they are says little about + /// the lines around them. + /// + internal const int AnchorRun = 16; + public static void Diff(ReadOnlySpan a, ReadOnlySpan b, Span changedA, Span changedB) => Diff(a, b, changedA, changedB, Budget, MinimumDepth); @@ -56,17 +72,19 @@ public static void Diff(ReadOnlySpan a, ReadOnlySpan b, Span cha /// Set for each element of with no match. /// /// The searching to do before settling. Given by the tests, along with - /// , which is the only way a search that settles can be had on - /// sequences small enough to check by other means. + /// and , which is the only way a + /// search that settles can be had on sequences small enough to check by other means. /// /// The depth a search is allowed with nothing left of the budget. + /// The shortest run of unique elements in order to split by. internal static void Diff( ReadOnlySpan a, ReadOnlySpan b, Span changedA, Span changedB, long budget, - int minimumDepth) + int minimumDepth, + int anchorRun = AnchorRun) { var length = VectorLength(a.Length, b.Length); int[]? rentedForward = null; @@ -79,7 +97,7 @@ internal static void Diff( : (rentedReverse = ArrayPool.Shared.Rent(length)).AsSpan(0, length); try { - Recurse(a, b, changedA, changedB, forward, reverse, ref budget, Math.Max(1, minimumDepth)); + Recurse(a, b, changedA, changedB, forward, reverse, ref budget, new(Math.Max(1, minimumDepth), Math.Max(1, anchorRun)), long.MaxValue); } finally { @@ -104,6 +122,24 @@ static int VectorLength(int n, int m) => /// is no longer follows from where the split is: one a search settled for can leave almost /// everything on either side of it. /// + /// One sequence, or the part of it left to diff. + /// The other. + /// The flags of . + /// The flags of . + /// The forward search's diagonals, shared by every search of the diff. + /// The reverse search's. + /// What is left of the searching the diff may do. + /// What a search with nothing left to spend may still do. + /// + /// How many elements, between the two sides, a part may have and still be looked at for + /// anchors when a search of it settles. Finding them costs a sort of the part, and a diff + /// that settles makes a split every few hundred elements, so looking after every one would be + /// the length squared again. Every part until one has been looked at; then nothing inside a + /// part that had no run worth splitting by, where a smaller piece of the same is unlikely to + /// have one either, and inside a part that was split by one only a part of half its size or + /// less. A part is inside at most as many such halvings as its length has, and the parts at + /// each are apart from one another, so all of it together is a few sorts of the whole. + /// static void Recurse( ReadOnlySpan a, ReadOnlySpan b, @@ -112,7 +148,8 @@ static void Recurse( Span forward, Span reverse, ref long budget, - int minimumDepth) + Limits limits, + long anchorBelow) { while (true) { @@ -158,9 +195,21 @@ static void Recurse( // whole of the grid when that is within reach, which is a search that cannot settle. var deepest = (a.Length + b.Length + 1) / 2; var affordable = budget <= 0 ? 0 : (long) Math.Sqrt(budget); - var limit = (int) Math.Min(deepest, Math.Max(minimumDepth, affordable)); - var found = TryMiddleSnake(a, b, forward, reverse, limit, out var x, out var y, out var depth); + var limit = (int) Math.Min(deepest, Math.Max(limits.Depth, affordable)); + var found = TryMiddleSnake(a, b, forward, reverse, limit, out var x, out var y, out var depth, out var settled, out var passed); budget -= (long) depth * depth; + if (settled && + (long) a.Length + b.Length <= anchorBelow) + { + var size = (long) a.Length + b.Length; + if (TryAnchors(a, b, changedA, changedB, forward, reverse, ref budget, limits, Math.Max(limits.AnchorRun, passed + 1), size / 2)) + { + return; + } + + anchorBelow = 0; + } + if (!found) { changedA.Fill(true); @@ -170,7 +219,7 @@ static void Recurse( if (x + y <= a.Length - x + b.Length - y) { - Recurse(a[..x], b[..y], changedA[..x], changedB[..y], forward, reverse, ref budget, minimumDepth); + Recurse(a[..x], b[..y], changedA[..x], changedB[..y], forward, reverse, ref budget, limits, anchorBelow); a = a[x..]; b = b[y..]; changedA = changedA[x..]; @@ -178,7 +227,7 @@ static void Recurse( } else { - Recurse(a[x..], b[y..], changedA[x..], changedB[y..], forward, reverse, ref budget, minimumDepth); + Recurse(a[x..], b[y..], changedA[x..], changedB[y..], forward, reverse, ref budget, limits, anchorBelow); a = a[..x]; b = b[..y]; changedA = changedA[..x]; @@ -187,6 +236,72 @@ static void Recurse( } } + /// + /// What a search may do once the budget has gone, and what a settled one may split by. + /// + /// See . + /// See . + readonly record struct Limits(int Depth, int AnchorRun); + + /// + /// Splits two sequences at every element of the longest run of elements still in order that + /// each has once, and diffs what lies between one and the next. False, having done nothing, + /// when there is no such run of elements. + /// + /// The elements of the run are the same on both sides and stay unflagged, which is what + /// unchanged is. Each part between two of them is a diff of its own, searched with whatever + /// budget is left, and all the parts together are at least as much unchanged as the run is + /// long. + /// + /// + static bool TryAnchors( + ReadOnlySpan a, + ReadOnlySpan b, + Span changedA, + Span changedB, + Span forward, + Span reverse, + ref long budget, + Limits limits, + int needed, + long anchorBelow) + { + var count = LineAnchors.Find(a, b, needed, out var xs, out var ys); + if (count == 0) + { + return false; + } + + try + { + var fromX = 0; + var fromY = 0; + for (var index = 0; index < count; index++) + { + var x = xs![index]; + var y = ys![index]; + // Nothing between two that follow straight on from one another, which in a run + // that was found whole is most of them + if (x > fromX || + y > fromY) + { + Recurse(a[fromX..x], b[fromY..y], changedA[fromX..x], changedB[fromY..y], forward, reverse, ref budget, limits, anchorBelow); + } + + fromX = x + 1; + fromY = y + 1; + } + + Recurse(a[fromX..], b[fromY..], changedA[fromX..], changedB[fromY..], forward, reverse, ref budget, limits, anchorBelow); + return true; + } + finally + { + ArrayPool.Shared.Return(xs!); + ArrayPool.Shared.Return(ys!); + } + } + /// /// Searches forward from the start and backward from the end, one edit at a time, until the /// two paths overlap. The point where they meet lies on an optimal path, and splitting there @@ -203,6 +318,12 @@ static void Recurse( /// both sequences changed. is how many edits deep it went either way, /// which is what it is charged for. /// + /// + /// says the split is one it settled for, and + /// what that split has going for it: the elements the search passed + /// as the same on its way there, or the run that follows from where the sequences were found + /// to line up. A run of anchors has to be longer than that to be split by instead. + /// /// static bool TryMiddleSnake( ReadOnlySpan a, @@ -212,8 +333,12 @@ static bool TryMiddleSnake( int limit, out int splitX, out int splitY, - out int depth) + out int depth, + out bool settled, + out int passed) { + settled = false; + passed = 0; var n = a.Length; var m = b.Length; var maxD = (n + m + 1) / 2; @@ -344,11 +469,14 @@ static bool TryMiddleSnake( if (d >= limit) { depth = d + 1; + settled = true; var furthest = TryFurthest(n, m, d, offset, forward, reverse, out splitX, out splitY, out var matched); - if (TryDisplaced(a, b, depth, matched, out var displacedX, out var displacedY)) + passed = matched; + if (TryDisplaced(a, b, depth, matched, out var displacedX, out var displacedY, out var run)) { splitX = displacedX; splitY = displacedY; + passed = run; return true; } @@ -394,10 +522,11 @@ static bool TryMiddleSnake( /// scattered along a diagonal it was already following. /// /// - static bool TryDisplaced(ReadOnlySpan a, ReadOnlySpan b, int depth, int matched, out int splitX, out int splitY) + static bool TryDisplaced(ReadOnlySpan a, ReadOnlySpan b, int depth, int matched, out int splitX, out int splitY, out int run) { splitX = 0; splitY = 0; + run = 0; // No further than the search looked, which was its depth squared, so a scan never costs // more than the search it follows did var window = (int) Math.Min(int.MaxValue, (long) depth * depth); @@ -412,12 +541,14 @@ static bool TryDisplaced(ReadOnlySpan a, ReadOnlySpan b, int depth, in (!fromB || inA <= inB)) { splitX = inA; + run = runA; return true; } if (fromB) { splitY = inB; + run = runB; return true; } From 89dbb0e9e39899fde0ca37de6ac7c9b95734ef6c Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:11:25 +1100 Subject: [PATCH 32/50] Leave an open menu open when a file is written again with what it held TrackedWatch hands ViewerSession.Refresh the entries whose files changed. A file written again with the same content comes back as the queued entry with new stamps, and Refresh put it in through Remove, which closes the context menu as it does for an entry that changed. A test that keeps failing the same way writes its received file on every run, so a menu the reader had open closed once a run. Refresh now tells a pass that only restamped entries from one that changed or dropped any: the restamped copy has the very rows of the entry it replaces. Such a pass replaces the queue with the stamps taken and nothing else, as the same pair arriving again over the socket already does (Restaged). A pass with any entry gone or rebuilt goes the way it did. TrackedWatchTests.AFileWrittenAgainWithWhatItHeldLeavesAnOpenMenuOpen failed before, for the entry on screen and for another, and AFileWrittenAgainWithSomethingElseStillClosesAnOpenMenu holds the other half. --- .../TrackedWatchTests.cs | 46 +++++++++++++++++++ src/DiffEngineViewer/ViewerSession.cs | 26 +++++++++++ 2 files changed, 72 insertions(+) diff --git a/src/DiffEngineViewer.Tests/TrackedWatchTests.cs b/src/DiffEngineViewer.Tests/TrackedWatchTests.cs index b7b0175b..499c159b 100644 --- a/src/DiffEngineViewer.Tests/TrackedWatchTests.cs +++ b/src/DiffEngineViewer.Tests/TrackedWatchTests.cs @@ -331,6 +331,52 @@ public async Task AFileWrittenAgainWithWhatItHeldIsNotDiffedAgain() await Assert.That(ReferenceEquals(host.State, settled)).IsTrue(); } + /// + /// And nothing about the window is another thing for it. A run that fails the same way writes + /// its received file again every time, and the pass that took the new stamp used to close a + /// context menu the reader had open, as an entry that changed does. The menu, what it was + /// opened over and the status line are all what they were, whether the file written again is + /// the one on screen or another. + /// + [Test] + [Arguments(0)] + [Arguments(1)] + public async Task AFileWrittenAgainWithWhatItHeldLeavesAnOpenMenuOpen(int written) + { + var host = OwnedAll(2); + host.Mutate(_ => ViewerSession.OpenMenu(_, 0) with { Message = "Accepted Sample9.Test" }); + var menu = host.State.Menu; + await Assert.That(menu).IsNotNull(); + var before = host.State.Queue[written]; + File.SetLastWriteTimeUtc(before.LeftFile!, DateTime.UtcNow.AddMinutes(1)); + + new TrackedWatch(host).Pump(); + + var after = host.State.Queue[written]; + await Assert.That(after.LeftStamp).IsNotEqualTo(before.LeftStamp); + await Assert.That(host.State.Menu).IsSameReferenceAs(menu); + await Assert.That(host.State.Selected).IsEqualTo(0); + await Assert.That(host.State.Message).IsEqualTo("Accepted Sample9.Test"); + } + + /// + /// A file written again with something else is an entry that changed, and that still closes + /// the menu: what it offered was offered of what the entry showed. + /// + [Test] + public async Task AFileWrittenAgainWithSomethingElseStillClosesAnOpenMenu() + { + var host = OwnedAll(2); + host.Mutate(_ => ViewerSession.OpenMenu(_, 0)); + await Assert.That(host.State.Menu).IsNotNull(); + await File.WriteAllTextAsync(host.State.Queue[1].LeftFile!, "what a later run received instead"); + + new TrackedWatch(host).Pump(); + + await Assert.That(host.State.Queue[1].LeftText).IsEqualTo("what a later run received instead"); + await Assert.That(host.State.Menu).IsNull(); + } + /// /// The same over the socket, which is how the run itself says the pair is pending again. /// diff --git a/src/DiffEngineViewer/ViewerSession.cs b/src/DiffEngineViewer/ViewerSession.cs index 25e93d7b..c2a3b458 100644 --- a/src/DiffEngineViewer/ViewerSession.cs +++ b/src/DiffEngineViewer/ViewerSession.cs @@ -333,17 +333,20 @@ public static SessionState Refresh( var went = new HashSet(gone, ReferenceEqualityComparer.Instance); var queue = new List(state.Queue.Count); var any = false; + var shownAnew = false; foreach (var entry in state.Queue) { if (went.Contains(entry)) { any = true; + shownAnew = true; continue; } if (replacements.TryGetValue(entry, out var fresh)) { any = true; + shownAnew |= !IsRestamped(entry, fresh); queue.Add(fresh); continue; } @@ -356,12 +359,35 @@ public static SessionState Refresh( return state; } + // Files written again with what they held, and nothing else: a run that fails the same + // way does that every time. Every entry is where it was and shows what it showed, so the + // open menu's indexes still mean what they did and nothing on screen is another thing. + // The stamps have to be taken all the same, or every pass after reads the file again. As + // the same pair arriving again over the socket is taken (Restaged), and for its reason: + // going through Remove closed a menu the reader had open, once a run. + if (!shownAnew) + { + return Clamp(state with { Queue = queue }); + } + // The message is carried rather than cleared, unlike every other path through Remove: this // is not something the reader did, and "Accepted Foo" disappearing because an unrelated // file went away reads as the accept having been undone. return Remove(state, queue, state.Message); } + /// + /// Whether is with its files' new stamps and + /// nothing else: the copy makes of an entry whose files + /// still hold what it shows. Told by its rows being the very rows, which a copy keeps and an + /// entry built from the files again does not. + /// + static bool IsRestamped(QueueEntry seen, QueueEntry fresh) => + seen.Key == fresh.Key && + seen.Status == fresh.Status && + ReferenceEquals(seen.LeftRows, fresh.LeftRows) && + ReferenceEquals(seen.RightRows, fresh.RightRows); + /// /// The loop's decision to leave, taken under the host's lock so it cannot cross an arrival: /// still set means nothing has joined the queue since it From 6d6bc65bcb5b760c3be2255c51a0329108e40207 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:13:00 +1100 Subject: [PATCH 33/50] Measure what one change to a long queue costs the session An arrival, a re-run with other content, a settle and a single accept each rebuild the whole display list from the whole queue under the session's lock. QueueChangeBenchmarks measures the four, ahead of the change to how the list is rebuilt: about 2.2 ms and 1.8 MB each at 2,000 entries, 0.13 ms and 180 KB at 200. --- .../QueueChangeBenchmarks.cs | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/DiffEngineViewer.Benchmarks/QueueChangeBenchmarks.cs diff --git a/src/DiffEngineViewer.Benchmarks/QueueChangeBenchmarks.cs b/src/DiffEngineViewer.Benchmarks/QueueChangeBenchmarks.cs new file mode 100644 index 00000000..c4c5a012 --- /dev/null +++ b/src/DiffEngineViewer.Benchmarks/QueueChangeBenchmarks.cs @@ -0,0 +1,80 @@ +using BenchmarkDotNet.Attributes; + +// What one change to a long queue costs the session: a snapshot arriving, a test failing again +// with something else, a test that started passing, and one accept. Each is done under the lock +// the render loop takes, on the listener thread a test process is waiting on, and each is about +// one entry of the queue however many there are. The applier here answers at once and touches +// nothing, so everything measured is the session's own work. +[MemoryDiagnoser] +public class QueueChangeBenchmarks +{ + [Params(200, 2000)] + public int Entries; + + SessionState state = null!; + InlinePatch arriving = null!; + InlinePatch again = null!; + string settling = ""; + + static readonly ViewerActions applied = new( + static _ => InlineApplyResult.Applied, + static (_, _) => + { + }, + static _ => + { + }); + + [GlobalSetup] + public void Setup() + { + // Nothing here is read: an inline entry is built from its patch, and the directory only has + // to be somewhere with no solution above it. + var directory = Path.Combine(Path.GetTempPath(), "deview-benchmarks", "change"); + var built = SessionState.Start(ViewerMode.Inline, 160, 50); + for (var index = 0; index < Entries; index++) + { + built = ViewerSession.EnqueueInline(built, Patch(directory, index, $"new {index}")); + } + + // On an entry in the middle, as a reader part way through a queue is + state = ViewerSession.Apply(built, Command.Select(Entries / 2)); + arriving = Patch(directory, Entries, "new"); + again = Patch(directory, Entries / 4, "something else this time"); + settling = InlineKey.For(again.SourceFile, again.LineHint); + } + + static InlinePatch Patch(string directory, int index, string content) => + new(Path.Combine(directory, $"Sample{index % 40}Tests.cs"), 10 + index, "\"old\"", content) + { + TestName = $"Test{index}", + MemberName = $"Test{index}", + Framework = "net10.0" + }; + + [Benchmark] + public object ASnapshotArrives() => + Changed(ViewerSession.EnqueueInline(state, arriving), Entries + 1); + + [Benchmark] + public object ATestFailsAgainWithSomethingElse() => + Changed(ViewerSession.EnqueueInline(state, again), Entries); + + [Benchmark] + public object ATestStartsPassing() => + Changed(ViewerSession.Settle(state, settling, "net10.0", again.MemberName), Entries - 1); + + [Benchmark] + public object OneAccept() => + Changed(ViewerSession.Apply(state, CommandKind.Accept, applied), Entries - 1); + + SessionState Changed(SessionState changed, int count) + { + if (changed.Queue.Count != count) + { + throw new($"{changed.Queue.Count} entries where {count} were expected: {changed.Message}"); + } + + return changed; + } +} From 6f9194b11b718ac6aec8a40d46effad8de33649d Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:20:46 +1100 Subject: [PATCH 34/50] Change one entry of the display list when the queue changed one An arrival, a settle, a discard and a single accept each rebuilt the display list from the whole queue under the session's lock: a dictionary of the entries, every entry's patches compared with the queue's, and an ordering of the result. InlineQueue hands back the items it did not touch as the items it was given, so what a change did can be read off the queue before and after it. ViewerSession.TryRebuildChanged does that and edits the list where it stands: an entry replaced in place when its solution and test are what they were, taken out, or put after the last entry of its test or the last snapshot of its solution. Anything else falls back to the whole rebuild, which is still there as RebuildWhole: a first snapshot in a solution, a list not in the order a rebuild leaves (snapshots ahead of files), and a removal that leaves a solution with only files, which a rebuild moves. QueueChangeBenchmarks at 2,000 entries, before and after: an arrival 2,187 us and 1,793 KB to 241 us and 942 KB, a re-run 2,190 us to 94 us and 325 KB, a settle 2,101 us to 95 us, an accept 2,235 us to 160 us. What is left is InlineQueue's own: the session still makes a PendingInline an entry to ask it, and it copies its list and makes a key an item to search. QueueRebuildTests drives 300 random queues through 60 random changes each and holds every result to RebuildWhole of the same queue; it failed with the check after a removal taken out. ARerunInALongQueueIsAboutOneEntry failed at 1.3 MB with the short way switched off. --- .../QueueRebuildTests.cs | 193 +++++++++++++ src/DiffEngineViewer/ViewerSession.cs | 264 +++++++++++++++++- 2 files changed, 449 insertions(+), 8 deletions(-) create mode 100644 src/DiffEngineViewer.Tests/QueueRebuildTests.cs diff --git a/src/DiffEngineViewer.Tests/QueueRebuildTests.cs b/src/DiffEngineViewer.Tests/QueueRebuildTests.cs new file mode 100644 index 00000000..2f771891 --- /dev/null +++ b/src/DiffEngineViewer.Tests/QueueRebuildTests.cs @@ -0,0 +1,193 @@ +/// +/// A change to the queue that is about one entry leaves every other entry where it is, as the +/// entry it was, rather than rebuilding the list from the whole queue. What it leaves has to be +/// what the rebuild would have: the same entries saying the same things, in the same order. +/// +public class QueueRebuildTests +{ + /// + /// Random queues changed at random - arrivals at new call sites and old ones, from the same + /// framework and another, call sites that moved, settles, accepts that land and that fail, + /// discards, and files arriving between them - each checked against the list rebuilt whole + /// from the same queue. + /// + [Test] + public void EveryChangeLeavesWhatAWholeRebuildWould() + { + var random = new Random(41); + for (var iteration = 0; iteration < 300; iteration++) + { + var state = SessionState.Start(ViewerMode.Inline, Fixtures.Columns, Fixtures.Rows); + var patches = new List(); + for (var step = 0; step < 60; step++) + { + var before = state; + var pending = Pending(state); + InlineQueue expected; + string what; + switch (random.Next(8)) + { + case 0 when patches.Count > 0: + { + // The same call site again: the same content, other content, or another + // framework's + var sent = patches[random.Next(patches.Count)]; + var again = Copy(sent, sent.LineHint, $"content {random.Next(3)}", random.Next(3) == 0 ? "net9.0" : "net10.0"); + what = $"again {again.SourceFile}:{again.LineHint}"; + expected = pending.Enqueue(again); + state = ViewerSession.EnqueueInline(state, again); + break; + } + case 1 when patches.Count > 0: + { + // The same call site, reported at another line + var index = random.Next(patches.Count); + var moved = Copy(patches[index], patches[index].LineHint + 1000, patches[index].NewContent, "net10.0"); + patches[index] = moved; + what = $"moved {moved.SourceFile}:{moved.LineHint}"; + expected = pending.Enqueue(moved); + state = ViewerSession.EnqueueInline(state, moved); + break; + } + case 2 when patches.Count > 0: + { + var settling = patches[random.Next(patches.Count)]; + var key = InlineKey.For(settling.SourceFile, settling.LineHint); + var origin = random.Next(2) == 0 ? "net10.0" : null; + what = $"settle {key} {origin}"; + expected = pending.Settle(key, origin, settling.MemberName); + state = ViewerSession.Settle(state, key, origin, settling.MemberName); + break; + } + case 3 when state.Current is { Kind: QueueEntryKind.Inline } current: + { + var result = random.Next(3) == 0 + ? InlineApplyResult.Failed("the file is held") + : InlineApplyResult.Applied; + what = $"accept {current.Key} {result.Status}"; + expected = current.Conflicted + ? pending.Accept(current.Key, current.Variants[current.SelectedVariant].Origins[0], _ => result, out _) + : pending.Accept(current.Key, _ => result, out _); + state = ViewerSession.Apply(state, CommandKind.Accept, Fixtures.Applying(result)); + break; + } + case 4 when state.Current is { Kind: QueueEntryKind.Inline } current: + what = $"discard {current.Key}"; + expected = pending.Discard(current.Key, out _); + state = ViewerSession.Apply(state, CommandKind.Discard, Fixtures.Applied); + break; + case 5: + // A file, which goes in where it arrived and is put after its solution's + // snapshots by the next rebuild + state = ViewerSession.EnqueueTracked( + state, + Fixtures.Move($"Sample{random.Next(4)}.Test (txt)", Solution(random))); + continue; + case 6 when state.Queue.Count > 0: + state = ViewerSession.Apply(state, Command.Select(random.Next(state.Queue.Count))); + continue; + default: + { + var solution = Solution(random); + var file = $"Tests{random.Next(3)}.cs"; + var arriving = Fixtures.Patch( + solution is null ? file : Fixtures.SolutionFile(solution, "Tests", file), + 10 + step + iteration * 100, + $"\"old{step}\"", + $"content {random.Next(3)}", + testName: random.Next(2) == 0 ? $"Test{random.Next(3)}" : null, + framework: "net10.0"); + arriving.MemberName = $"Member{random.Next(6)}"; + patches.Add(arriving); + what = $"arrive {arriving.SourceFile}:{arriving.LineHint}"; + expected = pending.Enqueue(arriving); + state = ViewerSession.EnqueueInline(state, arriving); + break; + } + } + + var whole = ViewerSession.RebuildWhole(before, expected); + if (Describe(whole) != Describe(state.Queue)) + { + Assert.Fail( + $""" + iteration {iteration} step {step}: {what} + before: {Describe(before.Queue)} + whole: {Describe(whole)} + left: {Describe(state.Queue)} + """); + } + + // An entry the change did not touch is the entry it was, never one built again + foreach (var entry in state.Queue) + { + var was = before.Queue.FirstOrDefault(_ => _.Key == entry.Key); + if (was is not null && + ReferenceEquals(was.Variants, entry.Variants) && + was.Status == entry.Status && + !ReferenceEquals(was, entry)) + { + Assert.Fail($"iteration {iteration} step {step}: {what} built {entry.Key} again"); + } + } + } + } + } + + /// + /// What the short way is for, seen by what a test failing again allocates in a long queue: the + /// list is copied, and nothing is made for the entries the arrival was not about. + /// + [Test] + public async Task ARerunInALongQueueIsAboutOneEntry() + { + var state = SessionState.Start(ViewerMode.Inline, Fixtures.Columns, Fixtures.Rows); + for (var index = 0; index < 2000; index++) + { + state = ViewerSession.EnqueueInline( + state, + Fixtures.Patch($"Sample{index % 40}Tests.cs", 10 + index, "\"old\"", $"new {index}", testName: $"Test{index}")); + } + + var arriving = Fixtures.Patch("Sample20Tests.cs", 510, "\"old\"", "something else", testName: "Test500"); + var before = GC.GetAllocatedBytesForCurrentThread(); + var arrived = ViewerSession.EnqueueInline(state, arriving); + var allocated = GC.GetAllocatedBytesForCurrentThread() - before; + + await Assert.That(arrived.Queue.Count).IsEqualTo(2000); + await Assert.That(arrived.Queue.Single(_ => _.TestName == "Test500").LeftText).IsEqualTo("something else"); + // Rebuilt whole it was nearly two megabytes. What is left is the queue the session asks + // InlineQueue of, an item an entry, and the list + await Assert.That(allocated).IsLessThan(700_000); + } + + static InlinePatch Copy(InlinePatch patch, int line, string content, string framework) => + new(patch.SourceFile, line, patch.OriginalExpression, content) + { + TestName = patch.TestName, + MemberName = patch.MemberName, + Framework = framework + }; + + static string? Solution(Random random) => + random.Next(3) switch + { + 0 => "SolutionA", + 1 => "SolutionB", + _ => null + }; + + static InlineQueue Pending(SessionState state) => + InlineQueue.From( + state.Queue + .Where(_ => _.Kind == QueueEntryKind.Inline) + .Select(_ => new PendingInline(_.Variants, _.Status))); + + // Everything a rebuild decides about an entry: where it is, what it holds and from which + // frameworks, which of those is on screen, and what the last attempt said + static string Describe(IReadOnlyList queue) => + string.Join( + " | ", + queue.Select(_ => + $"{_.Kind} {_.Key} [{string.Join(";", _.Variants.Select(variant => $"{variant.Patch.NewContent}@{variant.Patch.LineHint}<{string.Join(",", variant.Origins)}>"))}] v{_.SelectedVariant} {_.Status} '{_.LeftText}'")); +} diff --git a/src/DiffEngineViewer/ViewerSession.cs b/src/DiffEngineViewer/ViewerSession.cs index c2a3b458..e7a5a28d 100644 --- a/src/DiffEngineViewer/ViewerSession.cs +++ b/src/DiffEngineViewer/ViewerSession.cs @@ -37,7 +37,8 @@ public static SessionState EnqueueInline(SessionState state, InlinePatch patch) var key = InlineKey.For(patch.SourceFile, patch.LineHint); var current = state.Current; - var queue = Rebuild(state, Pending(state).Enqueue(patch)); + var pending = Pending(state); + var queue = Rebuild(state, pending, pending.Enqueue(patch)); // Grouping can reorder the list, so the selection follows its key rather than its index. var selected = current is null ? 0 : IndexOf(queue, current.Key); if (selected < 0) @@ -134,7 +135,7 @@ public static SessionState Settle(SessionState state, string key, string? origin return state; } - return Remove(state, Rebuild(state, settled), null); + return Remove(state, Rebuild(state, pending, settled), null); } /// @@ -775,7 +776,7 @@ static SessionState AcceptInline(SessionState state, ViewerActions actions) accepted = pending.Accept(current.Key, actions.ApplyInline, out message); } - var queue = Rebuild(state, accepted); + var queue = Rebuild(state, pending, accepted); if (accepted.Count < pending.Count) { return Remove(state, queue, message); @@ -863,7 +864,8 @@ static SessionState DiscardGroup(SessionState state, MenuState menu, ViewerActio .Where(_ => _.Kind == QueueEntryKind.Inline) .Select(_ => _.Key) .ToList(); - var queue = Pending(state); + var pending = Pending(state); + var queue = pending; foreach (var key in keys) { queue = queue.Discard(key, out _); @@ -871,7 +873,7 @@ static SessionState DiscardGroup(SessionState state, MenuState menu, ViewerActio return DiscardTrackedIn( state, - Rebuild(state, queue), + Rebuild(state, pending, queue), $"Discarded {keys.Count}", actions, TrackedKeysOf(all)); @@ -1258,7 +1260,7 @@ public static Func FailClaimed(SessionState claimed, /// /// The rules are still asked of an , but of one holding the entry /// alone, and what it says is done to the list as it stands: the entry taken out, or given the - /// status. Every other inline transition rebuilds the whole list from the whole queue, and a + /// status. Every inline transition used to rebuild the whole list from the whole queue, and a /// batch did that once an entry, so its own bookkeeping grew with the square of the queue: /// 2,000 snapshots were 3.7 seconds and 8.8 GB of garbage beside the applying. Taking an entry /// out of a list that is in order leaves it in order, and no other entry is touched, so there @@ -1553,8 +1555,9 @@ static SessionState DiscardInline(SessionState state) return state; } - var discarded = Pending(state).Discard(current.Key, out var message); - return Remove(state, Rebuild(state, discarded), message); + var pending = Pending(state); + var discarded = pending.Discard(current.Key, out var message); + return Remove(state, Rebuild(state, pending, discarded), message); } /// @@ -1627,8 +1630,253 @@ static InlineQueue Pending(SessionState state) => /// /// static IReadOnlyList Rebuild(SessionState state, InlineQueue queue) => + Rebuild(state, null, queue); + + /// + /// , by the short way round where there is one. + /// + /// The state whose list is to be rebuilt. + /// + /// The queue was made from, when that was of + /// this state. What the change did is then read off the two (). + /// + /// The queue as the change left it. + static IReadOnlyList Rebuild(SessionState state, InlineQueue? before, InlineQueue after) + { + if (before is not null && + TryRebuildChanged(state.Queue, before, after) is { } changed) + { + return changed; + } + + return RebuildWhole(state, after); + } + + /// + /// The list rebuilt from the whole queue: every snapshot looked up among the entries there + /// are, and the lot put in order. What every inline transition did, and what the short way + /// has to come to. + /// + internal static IReadOnlyList RebuildWhole(SessionState state, InlineQueue queue) => QueueProjection.Order([..Project(state, queue), ..Tracked(state)]); + /// + /// The list after a change to the queue that was about one entry or a few, made from the list + /// there is rather than from the queue: the entries the change left alone are the ones in the + /// list already, where they already are. Null when the change is not one this can do, and the + /// whole list is rebuilt instead. + /// + /// An arrival, a settle, a discard and a single accept each change one entry of however many + /// there are, and each rebuilt the list from the whole queue: a dictionary of the entries, a + /// comparison of every entry's patches with the queue's, and an ordering of the result, under + /// the lock the render loop takes and on the thread a test process is waiting on. At 2,000 + /// entries that was two milliseconds and nearly two megabytes a change. + /// + /// + /// What the change did is read off the two queues. hands back the + /// items it did not touch as the items it was given, so an item that is another one is the + /// change: replaced where it stands, taken out, or added at the end. + /// + /// + /// Only for a list in the order a rebuild leaves, which puts snapshots ahead of files + /// (). A file that arrived since the last rebuild can stand ahead + /// of a snapshot, and the rebuild that follows moves it: that one is left to the long way. + /// + /// + /// The display list was made from. + /// of the state the list is from. + /// What the change made of . + static IReadOnlyList? TryRebuildChanged(IReadOnlyList list, InlineQueue before, InlineQueue after) + { + var grew = after.Count - before.Count; + if (grew > 1 || + !InRebuiltOrder(list)) + { + return null; + } + + var result = new List(list.Count + 1); + var item = 0; + var kept = 0; + var removed = false; + foreach (var entry in list) + { + if (entry.Kind != QueueEntryKind.Inline) + { + result.Add(entry); + continue; + } + + var held = before.Items[item++]; + if (kept < after.Count && + ReferenceEquals(after.Items[kept], held)) + { + kept++; + result.Add(entry); + continue; + } + + // Another item where this one was, when the queue is no shorter: the same call site + // with something else to say. In a queue that is shorter, an item that is not next is + // one that went + if (grew < 0) + { + removed = true; + continue; + } + + if (kept == after.Count) + { + return null; + } + + var replacement = Projected(entry, after.Items[kept++]); + // Where an entry stands is decided by its solution and its test, so one that has + // neither changed stands where it stood + if (replacement.Solution != entry.Solution || + replacement.TestGroup != entry.TestGroup) + { + return null; + } + + result.Add(replacement); + } + + if (grew == 1) + { + if (kept != before.Count || + !TryInsert(result, QueueEntry.ForInline(after.Items[kept++]))) + { + return null; + } + } + + // Every item of the new queue accounted for, in the order it holds them + if (kept != after.Count) + { + return null; + } + + // Taking the last snapshot out of a solution leaves its files with no snapshot ahead of + // them, and a rebuild puts such a solution after the ones that have + if (removed && + !InRebuiltOrder(result)) + { + return null; + } + + return result; + } + + /// + /// The entry for a snapshot that is in the list already and has been replaced in the queue: + /// what makes of it, for the one entry. + /// + static QueueEntry Projected(QueueEntry entry, PendingInline pending) + { + // Under another key it is another line's entry now, and no entry is held for that line + if (entry.Key != pending.Key) + { + return QueueEntry.ForInline(pending); + } + + if (VariantsMatch(entry.Variants, pending.Variants)) + { + return entry.Status == pending.Status ? entry : entry with { Status = pending.Status }; + } + + return QueueEntry.ForInline(pending, SameVariant(entry, pending)); + } + + /// + /// Puts a snapshot that is new to the queue where ordering the whole list would: after the + /// last entry of its own test in its solution, or with no test of its own there, after the + /// last snapshot of its solution and ahead of that solution's files. False when its solution + /// has no snapshot yet, which is a solution taking a place among the others rather than an + /// entry taking one in it. + /// + static bool TryInsert(List list, QueueEntry entry) + { + var lastOfSolution = -1; + var lastOfTest = -1; + for (var index = 0; index < list.Count; index++) + { + var other = list[index]; + if (other.Kind != QueueEntryKind.Inline || + other.Solution != entry.Solution) + { + continue; + } + + lastOfSolution = index; + if (entry.TestGroup is not null && + other.TestGroup == entry.TestGroup) + { + lastOfTest = index; + } + } + + if (lastOfSolution < 0) + { + return false; + } + + list.Insert((lastOfTest < 0 ? lastOfSolution : lastOfTest) + 1, entry); + return true; + } + + /// + /// Whether a list is in the order leaves one in, beyond what + /// leaves any list in: within a solution every snapshot + /// ahead of every file, and a solution with snapshots ahead of one with only files, the + /// entries of no solution last of all. A rebuild orders the snapshots and then the files, so a + /// list like this is one it would hand back as it is. + /// + static bool InRebuiltOrder(IReadOnlyList list) + { + var filesOnly = false; + var index = 0; + while (index < list.Count) + { + var solution = list[index].Solution; + var inline = list[index].Kind == QueueEntryKind.Inline; + // A solution with snapshots after one with none. The entries of no solution are last + // whatever they are, so they are held to nothing here + if (solution is not null) + { + if (inline && + filesOnly) + { + return false; + } + + filesOnly |= !inline; + } + + var files = false; + for (; index < list.Count && list[index].Solution == solution; index++) + { + if (list[index].Kind != QueueEntryKind.Inline) + { + files = true; + } + else if (files) + { + return false; + } + } + + // Anything after the entries of no solution is a list no ordering left + if (solution is null && + index < list.Count) + { + return false; + } + } + + return true; + } + static IEnumerable Tracked(SessionState state) => state.Queue.Where(_ => _.Kind is QueueEntryKind.Move or QueueEntryKind.Delete); From 1584135e2828a1a23386a4053024d684e124d458 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:25:14 +1100 Subject: [PATCH 35/50] Throw a bulk discard's received files away outside the session's lock Discard-all and a header's discard were one transition that deleted the received file of every pending pair: under the lock every arrival waits on, and for a window's own discard on the thread that draws. They are now the batch an accept-all is (AcceptBatch.Discarding). The snapshots and the pending deletes go in the transition that begins it, since neither touches a file, and the moves are left in the queue to be claimed one at a time, each file thrown away outside the lock and recorded under it. A window's discard is only begun by its frame and carried out by the runner's worker; the socket's is driven on the listener thread, as its accept-all is, waiting out a batch already running rather than doing nothing behind it. ViewerSession.Apply still carries one out whole, which is what the tests and file mode drive. While one runs the status line says "Discarding n of m" and the window refuses what changes the queue. It is not put on a listing: the wire's progress is read by whoever displays the queue as an accept under way. What a discard says when done is word for word what it said. DiscardBatchTests: AFileIsThrownAwayOutsideTheLock has another thread take the lock from inside each delete, and failed after its full wait with the socket's discard put back as one mutation. The rest hold the steps, the kept files, a group's batch and what a window's frame leaves. --- .../DiscardBatchTests.cs | 197 +++++++++++++++++ src/DiffEngineViewer/AcceptBatch.cs | 35 +++ src/DiffEngineViewer/Ipc/MessageHandler.cs | 32 ++- src/DiffEngineViewer/ScreenBuilder.cs | 5 + src/DiffEngineViewer/SessionState.cs | 8 + src/DiffEngineViewer/ViewerProgram.cs | 12 + src/DiffEngineViewer/ViewerSession.cs | 208 ++++++++++++------ 7 files changed, 429 insertions(+), 68 deletions(-) create mode 100644 src/DiffEngineViewer.Tests/DiscardBatchTests.cs diff --git a/src/DiffEngineViewer.Tests/DiscardBatchTests.cs b/src/DiffEngineViewer.Tests/DiscardBatchTests.cs new file mode 100644 index 00000000..95283792 --- /dev/null +++ b/src/DiffEngineViewer.Tests/DiscardBatchTests.cs @@ -0,0 +1,197 @@ +/// +/// A bulk discard throws a received file away for every pending pair, and used to do all of it in +/// one transition: under the lock every arrival waits on, and for a window's own discard on the +/// thread that draws. It is the batch an accept-all is, over the moves: the snapshots and the +/// pending deletes go as it begins, since neither touches a file, and each received file is +/// thrown away in a step of its own, outside the lock. +/// +public class DiscardBatchTests +{ + [Test] + public async Task BeginningTouchesNoFile() + { + var deleted = new List(); + var state = ViewerSession.BeginDiscardAll(Mixed()); + + // The snapshot and the pending delete are gone, and the two moves are still listed + await Assert.That(state.Queue.Select(_ => _.Kind)).IsEquivalentTo([QueueEntryKind.Move, QueueEntryKind.Move]); + await Assert.That(state.Batch!.Discarding).IsTrue(); + await Assert.That(state.Batch.Current).IsNull(); + await Assert.That(deleted).IsEmpty(); + + var seen = new List(); + while ((state = ViewerSession.ClaimNext(state)).Batch?.Current is not null) + { + seen.Add($"{ScreenBuilder.Build(state).Status}, {state.Queue.Count} pending, {deleted.Count} thrown away"); + state = ViewerSession.ApplyClaimed(state, Deleting(deleted.Add))(state); + } + + await Assert.That(string.Join("\n", seen)).IsEqualTo( + """ + Discarding 1 of 2, 2 pending, 0 thrown away + Discarding 2 of 2, 1 pending, 1 thrown away + """); + await Assert.That(deleted.Count).IsEqualTo(2); + await Assert.That(state.Batch).IsNull(); + await Assert.That(state.Message).IsEqualTo("Discarded 1, plus 3 files"); + await Assert.That(state.Exit).IsTrue(); + } + + /// + /// A step at a time and in one call come to the same thing, which is what a discard-all was + /// before it was a batch: the tests and the wire's single discards still drive it whole. + /// + [Test] + public async Task InOneCallItSaysWhatTheStepsSay() + { + var deleted = new List(); + + var state = ViewerSession.Apply(Mixed(), CommandKind.DiscardAll, Deleting(deleted.Add)); + + await Assert.That(deleted.Count).IsEqualTo(2); + await Assert.That(state.Queue).IsEmpty(); + await Assert.That(state.Message).IsEqualTo("Discarded 1, plus 3 files"); + } + + /// + /// A received file that could not be thrown away stays pending, saying why, and is counted. + /// + [Test] + public async Task AFileThatWouldNotGoIsKept() + { + var actions = Deleting(_ => throw new IOException("the file is held")); + + var state = ViewerSession.Apply(Mixed(), CommandKind.DiscardAll, actions); + + await Assert.That(state.Queue.Count).IsEqualTo(2); + await Assert.That(state.Queue.All(_ => _.Status == "the file is held")).IsTrue(); + await Assert.That(state.Message).IsEqualTo("Discarded 1, plus 1 files (2 kept)"); + await Assert.That(state.Batch).IsNull(); + } + + /// + /// A header's discard is the same batch over its own members, and leaves everything else. + /// + [Test] + public async Task AGroupsDiscardIsTheBatchOverItsMembers() + { + var state = Fixtures.Inline( + Fixtures.Patch(Fixtures.SolutionFile("SolutionA", "Tests", "ATests.cs"), 10), + Fixtures.Patch(Fixtures.SolutionFile("SolutionB", "Tests", "BTests.cs"), 20)); + state = ViewerSession.EnqueueTracked(state, Fixtures.Move("One.Test (txt)", "SolutionA")); + state = ViewerSession.EnqueueTracked(state, Fixtures.Move("Two.Test (txt)", "SolutionB")); + var header = QueueProjection.Rows(state).ToList().FindIndex(_ => _.GroupName == "SolutionA"); + var deleted = new List(); + + var begun = ViewerSession.BeginDiscardGroup(ViewerSession.OpenMenu(state, header)); + + await Assert.That(begun.Menu).IsNull(); + await Assert.That(begun.Batch!.Remaining.Count).IsEqualTo(1); + await Assert.That(begun.Queue.Count).IsEqualTo(3); + var done = begun; + while ((done = ViewerSession.ClaimNext(done)).Batch?.Current is not null) + { + done = ViewerSession.ApplyClaimed(done, Deleting(deleted.Add))(done); + } + + await Assert.That(deleted.Count).IsEqualTo(1); + await Assert.That(string.Join(",", done.Queue.Select(_ => _.Solution))).IsEqualTo("SolutionB,SolutionB"); + await Assert.That(done.Message).IsEqualTo("Discarded 1, plus 1 files"); + } + + /// + /// What the batch is for. A discard-all asked over the socket throws each file away with the + /// session's lock free, so the render loop and an arriving snapshot get in between two of + /// them: seen by another thread taking the lock from inside a delete, which waited for the + /// whole discard when the discard was one mutation. + /// + [Test] + public async Task AFileIsThrownAwayOutsideTheLock() + { + var host = new SessionHost(Mixed()); + var took = new List(); + var actions = Deleting(_ => + { + var taking = new Thread(() => host.Mutate(static _ => _)) + { + IsBackground = true + }; + taking.Start(); + // Held, it is never let go while this delete waits, so this is only ever the whole + // wait when the test is failing + took.Add(taking.Join(TimeSpan.FromSeconds(20))); + }); + IQueueOwner owner = new MessageHandler(host, actions, _ => { }); + + var message = owner.DiscardAll(); + + await Assert.That(took.Count).IsEqualTo(2); + await Assert.That(took.All(_ => _)).IsTrue(); + await Assert.That(message).IsEqualTo("Discarded 1, plus 3 files"); + await Assert.That(host.State.Queue).IsEmpty(); + } + + /// + /// A window's own discard-all is only begun by the frame that asked for it, as its accept-all + /// is, and the buttons that change the queue wait for it. + /// + [Test] + public async Task AWindowOnlyBeginsItsDiscard() + { + var state = ViewerProgram.Apply(Mixed(), Input(CommandKind.DiscardAll), null, new Window()); + + await Assert.That(state.Batch!.Discarding).IsTrue(); + await Assert.That(state.Queue.Count).IsEqualTo(2); + var screen = ScreenBuilder.Build(state); + await Assert.That(screen.Buttons.Where(_ => _.Command is CommandKind.Accept or CommandKind.Discard or CommandKind.AcceptAll).Any(_ => _.Enabled)).IsFalse(); + // Not something a listing says: the wire's progress is an accept's, in so many words + await Assert.That(state.ListedProgress).IsNull(); + } + + // A snapshot, two pending moves and a pending delete + static SessionState Mixed() + { + var state = Fixtures.Inline(Fixtures.Patch()); + state = ViewerSession.EnqueueTracked(state, Fixtures.Move("One.Test (txt)")); + state = ViewerSession.EnqueueTracked(state, Fixtures.Move("Two.Test (txt)")); + return ViewerSession.EnqueueTracked(state, Fixtures.Delete()); + } + + static ViewerActions Deleting(Action delete) => + Fixtures.Applied with + { + MoveFile = static (_, _) => throw new("A discard moves nothing."), + DeleteFile = delete + }; + + static ViewerInput Input(CommandKind key) => + new(key, -1, -1, 0, false, Fixtures.Columns, Fixtures.Rows); + + sealed class Window : IViewerWindow + { + public bool Present(Screen screen) => + true; + + public ViewerInput Poll() => + default; + + public void SetHidden(bool hidden) + { + } + + public void Focus() + { + } + + public void SetClipboard(string text) + { + } + + public bool Capture(Screen screen, int width, int height, string pngPath) => + false; + + public void Dispose() + { + } + } +} diff --git a/src/DiffEngineViewer/AcceptBatch.cs b/src/DiffEngineViewer/AcceptBatch.cs index 265f9ee5..86ce3a29 100644 --- a/src/DiffEngineViewer/AcceptBatch.cs +++ b/src/DiffEngineViewer/AcceptBatch.cs @@ -63,6 +63,41 @@ Only is null || /// public IReadOnlyList Together { get; init; } = []; + /// + /// Whether this is a bulk discard rather than an accept: the same steps, over the moves a + /// discard-all or a header's discard covers, each step throwing a received file away. + /// + /// A discard waits on nothing, which is why it was left one transition when accept-all + /// stopped being one. But it deletes a file an entry, under the lock every arrival waits on + /// and on the thread that draws, and a thousand pending pairs are a thousand deletes on a + /// drive something is watching. The snapshots and the pending deletes of a discard touch no + /// file, so they go in the transition that begins it, and only the moves are left to claim. + /// + /// + public bool Discarding { get; init; } + + /// + /// For a discard, what its beginning said of the snapshots: the first half of what the batch + /// says when it is done, as is for an accept. + /// + public string Said { get; init; } = ""; + public AcceptProgress Progress => new(Total - Remaining.Count - (Current is null ? 0 : 1 + Together.Count), Total); + + /// + /// What the status line says while the batch runs. An accept's is + /// , the words a window displaying someone else's batch + /// uses too; a discard's is this process's alone, since it is not put on a listing. + /// + public string Describe() + { + var progress = Progress; + if (Discarding) + { + return $"Discarding {Math.Min(progress.Done + 1, progress.Total)} of {progress.Total}"; + } + + return progress.Describe(); + } } diff --git a/src/DiffEngineViewer/Ipc/MessageHandler.cs b/src/DiffEngineViewer/Ipc/MessageHandler.cs index ad7fbc2c..ad06545e 100644 --- a/src/DiffEngineViewer/Ipc/MessageHandler.cs +++ b/src/DiffEngineViewer/Ipc/MessageHandler.cs @@ -116,7 +116,7 @@ ViewerResponse IQueueOwner.Listing(bool withPatches) withPatches); if (!withPatches) { - return ViewerResponse.Listing(items, progress: state.Progress); + return ViewerResponse.Listing(items, progress: state.ListedProgress); } return ViewerResponse.Listing( @@ -129,7 +129,7 @@ ViewerResponse IQueueOwner.Listing(bool withPatches) .Where(_ => _.Kind == QueueEntryKind.Delete) .Select(_ => new ViewerResponseDelete(_.Key, _.Name, _.Solution, _.LeftFile!)) .ToList(), - progress: state.Progress); + progress: state.ListedProgress); } /// @@ -148,7 +148,7 @@ string IQueueOwner.ListingTag() generation++; } - return $"{instance}.{generation}.{state.Progress?.Build()}"; + return $"{instance}.{generation}.{state.ListedProgress?.Build()}"; } } @@ -239,8 +239,30 @@ origin is null && return runner.Drive(); } - string? IQueueOwner.DiscardAll() => - host.Mutate(_ => ViewerSession.Apply(_, CommandKind.DiscardAll, actions)).Message; + /// + /// As , and for its reason: each received file is thrown + /// away outside the lock, a mutation a file, where one mutation around all of them kept the + /// render loop and every arrival waiting for as long as the deletes took. + /// + string? IQueueOwner.DiscardAll() + { + // A batch already running is not this one, and beginning is a no-op while it runs. It is + // waited out and the discard begun after it, which is what asking mid batch came to when + // a discard was one mutation queued behind the batch's next + var waiting = false; + host.Mutate(_ => + { + waiting = _.Batch is not null; + return ViewerSession.BeginDiscardAll(_); + }); + if (waiting) + { + runner.Drive(); + host.Mutate(ViewerSession.BeginDiscardAll); + } + + return runner.Drive(); + } void IQueueOwner.Window(WindowCommand command, string? key) { diff --git a/src/DiffEngineViewer/ScreenBuilder.cs b/src/DiffEngineViewer/ScreenBuilder.cs index 9543d051..c1cca2f5 100644 --- a/src/DiffEngineViewer/ScreenBuilder.cs +++ b/src/DiffEngineViewer/ScreenBuilder.cs @@ -519,6 +519,11 @@ static string BuildStatus(SessionState state, QueueEntry? current, int body) { // Over whatever the last command said, which while a batch runs is at best "Waiting for // the queue owner." - and saying that over a list that is visibly shrinking is not news + if (state.Batch is { } batch) + { + return batch.Describe(); + } + if (state.Progress is { } progress) { return progress.Describe(); diff --git a/src/DiffEngineViewer/SessionState.cs b/src/DiffEngineViewer/SessionState.cs index 395aea0d..0063a6db 100644 --- a/src/DiffEngineViewer/SessionState.cs +++ b/src/DiffEngineViewer/SessionState.cs @@ -182,6 +182,14 @@ public SessionState Showing(DrawingView view) public AcceptProgress? Progress => Batch?.Progress ?? OwnerProgress; + /// + /// The progress an owner puts on its listings: its accept-all's. Not a bulk discard's, which + /// the wire has no words for: is read by whoever displays the + /// queue as an accept under way, and says so on their status line. + /// + public AcceptProgress? ListedProgress => + Batch is { Discarding: true } ? null : Progress; + public QueueEntry? Current => Selected >= 0 && Selected < Queue.Count ? Queue[Selected] : null; diff --git a/src/DiffEngineViewer/ViewerProgram.cs b/src/DiffEngineViewer/ViewerProgram.cs index f5f5e577..7992ff04 100644 --- a/src/DiffEngineViewer/ViewerProgram.cs +++ b/src/DiffEngineViewer/ViewerProgram.cs @@ -722,6 +722,18 @@ static SessionState Dispatch(SessionState state, Command command, OwnerLink? lin { return ViewerSession.BeginAcceptGroup(state); } + + // And the bulk discards, which throw a received file away for every pending + // pair: the same batch, the same worker + if (command.Kind == CommandKind.DiscardAll) + { + return ViewerSession.BeginDiscardAll(state); + } + + if (command.Kind == CommandKind.DiscardGroup) + { + return ViewerSession.BeginDiscardGroup(state); + } } return ViewerSession.Apply(state, command, ViewerActions.Real); diff --git a/src/DiffEngineViewer/ViewerSession.cs b/src/DiffEngineViewer/ViewerSession.cs index e7a5a28d..cb349e2e 100644 --- a/src/DiffEngineViewer/ViewerSession.cs +++ b/src/DiffEngineViewer/ViewerSession.cs @@ -857,26 +857,139 @@ static SessionState BeginAcceptGroup(SessionState state, MenuState menu) => .Select(_ => _.Key) .ToList()); + /// + /// A whole group discard in one call, for a caller that already holds the state: the steps + /// takes a mutation at a time, taken back to back. + /// static SessionState DiscardGroup(SessionState state, MenuState menu, ViewerActions actions) { - var all = Members(state, menu); - var keys = all - .Where(_ => _.Kind == QueueEntryKind.Inline) - .Select(_ => _.Key) - .ToList(); + // For the reason AcceptAllInline gives + if (state.Batch is not null) + { + return state; + } + + return Carry(BeginDiscard(state, Members(state, menu)), actions); + } + + /// + /// Starts a discard of every member of the group the open menu's header describes, without + /// throwing any file away yet: see . The state as it is, less + /// the menu, when there is no group to discard. + /// + public static SessionState BeginDiscardGroup(SessionState state) + { + if (state.Menu is not { } menu) + { + return state; + } + + state = state with { Menu = null }; + if (state.Mode != ViewerMode.Inline) + { + return state; + } + + return BeginDiscard(state, Members(state, menu)); + } + + /// + /// Starts a discard of everything in a queue this process owns. The snapshots are dropped and + /// the pending deletes untracked here and now, since neither touches a file. The moves are + /// left in the queue as a batch to carry out through and + /// , one received file thrown away per step and outside the lock: + /// see . With no move among them it is finished where it + /// started. A no-op while a batch is already running. + /// + public static SessionState BeginDiscardAll(SessionState state) => + BeginDiscard(state, null); + + /// The state to start it in. + /// + /// The entries to discard, for a group header acting on its own members. Null discards + /// everything, which is what the unqualified discard-all means. + /// + static SessionState BeginDiscard(SessionState state, IReadOnlyList? members) + { + if (state.Mode != ViewerMode.Inline || + state.Batch is not null) + { + return state; + } + var pending = Pending(state); - var queue = pending; - foreach (var key in keys) + InlineQueue discarded; + string said; + if (members is null) + { + discarded = pending.DiscardAll(out said); + } + else { - queue = queue.Discard(key, out _); + var keys = members + .Where(_ => _.Kind == QueueEntryKind.Inline) + .Select(_ => _.Key) + .ToList(); + discarded = pending; + foreach (var key in keys) + { + discarded = discarded.Discard(key, out _); + } + + said = $"Discarded {keys.Count}"; } - return DiscardTrackedIn( - state, - Rebuild(state, pending, queue), - $"Discarded {keys.Count}", - actions, - TrackedKeysOf(all)); + var only = members is null ? null : TrackedKeysOf(members).ToHashSet(); + var remaining = new List(); + var moves = new List(); + var untracked = 0; + foreach (var entry in Rebuild(state, pending, discarded)) + { + if (entry.Kind is not (QueueEntryKind.Move or QueueEntryKind.Delete) || + (only is not null && !only.Contains(entry.Key))) + { + remaining.Add(entry); + continue; + } + + // Discarding a pending delete leaves the file alone and only untracks it + if (entry.Kind == QueueEntryKind.Delete) + { + untracked++; + continue; + } + + moves.Add(entry.Key); + remaining.Add(entry); + } + + var batch = new AcceptBatch(moves, moves.Count) + { + Discarding = true, + Said = said, + Swept = untracked + }; + var begun = Remove(state, remaining, null); + // No received file to throw away, so nothing to report progress on + if (moves.Count == 0) + { + return Finish(begun, batch); + } + + return begun with { Batch = batch }; + } + + /// + /// Whatever batch a state holds, carried out to its end in one call. + /// + static SessionState Carry(SessionState state, ViewerActions actions) + { + while ((state = ClaimNext(state)).Batch?.Current is not null) + { + state = ApplyClaimed(state, actions)(state); + } + + return state; } static List Members(SessionState state, MenuState menu) => @@ -1215,7 +1328,7 @@ public static Func ApplyClaimed(SessionState claimed if (entry.Kind != QueueEntryKind.Inline) { - var failure = TryApplyTracked(entry, actions, discarding: false); + var failure = TryApplyTracked(entry, actions, batch.Discarding); return _ => RecordTracked(_, entry, failure); } @@ -1367,6 +1480,16 @@ state with /// static SessionState Finish(SessionState state, AcceptBatch batch) { + // A discard says what its beginning said of the snapshots, then the files: worded the way + // an owning tray words its own, with what stayed pending counted rather than hidden + if (batch.Discarding) + { + return Remove( + state with { Batch = null }, + state.Queue, + WithFiles(batch.Said, batch.Swept, batch.Kept)); + } + var conflicted = 0; foreach (var entry in state.Queue) { @@ -1402,60 +1525,19 @@ static List Replace(IReadOnlyList queue, int index, Queu static List Without(IReadOnlyList queue, int index) => [..queue.Take(index), ..queue.Skip(index + 1)]; - static SessionState DiscardAllInline(SessionState state, ViewerActions actions) - { - var discarded = Pending(state).DiscardAll(out var message); - return DiscardTrackedIn(state, Rebuild(state, discarded), message, actions); - } - /// - /// The tracked half of a bulk discard, worded the way an owning tray words its own: the inline - /// summary, then ", plus n files" with what stayed pending counted rather than hidden. Both - /// say the same thing about the same files, whichever process is holding them. - /// - /// Only discards go this way now. A bulk accept is an , an entry at a - /// time and outside the lock, because accepting is where the time goes: a discard throws a - /// received file away or untracks a delete, and neither waits on anything. - /// + /// A whole discard-all in one call, for a caller that already holds the state: what + /// is to an accept-all, and the same batch underneath. /// - /// The state the discard was asked of. - /// Its queue, with the snapshots already discarded. - /// What the snapshots' half of the discard said. - /// What throws a received file away. - /// - /// The keys to discard, for a group header acting on its own members. Null discards every - /// tracked entry, which is what the unqualified discard-all means. - /// - static SessionState DiscardTrackedIn( - SessionState state, - IReadOnlyList queue, - string message, - ViewerActions actions, - IReadOnlyCollection? only = null) + static SessionState DiscardAllInline(SessionState state, ViewerActions actions) { - var remaining = new List(queue.Count); - var swept = 0; - var kept = 0; - foreach (var entry in queue) + // For the reason AcceptAllInline gives + if (state.Batch is not null) { - if (entry.Kind is not (QueueEntryKind.Move or QueueEntryKind.Delete) || - (only is not null && !only.Contains(entry.Key))) - { - remaining.Add(entry); - continue; - } - - if (TryApplyTracked(entry, actions, discarding: true) is not { } failure) - { - swept++; - continue; - } - - kept++; - remaining.Add(entry with { Status = failure }); + return state; } - return Remove(state, remaining, WithFiles(message, swept, kept)); + return Carry(BeginDiscardAll(state), actions); } /// From df7fc4f2011b6020993a832c249168a1f3c5d2c0 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:49:01 +1100 Subject: [PATCH 36/50] Read the holes of an F# interpolated string as the compiler does A hole is code, and the scanner counted every brace in one and took every quote for a string. So $"{'{'}" never closed, $"{'"'}" closed on a string that ran to the end of the file, and a triple quoted literal ended at the first three quotes whatever they were in, which a verbatim string in a hole that ends in a doubled quote has. Each left the calls under it inside a literal, where no patch finds them. A hole is now lexed as code: char literals, comments, strings and backticked names are stepped over whole. A triple quoted literal's holes are found by the braces its dollars ask for, and a backslash in front of a brace is a backslash and then a hole. The other half of the item, a tick after an identifier character, is how F# reads it too: nothing fsi compiles was read differently. Checked by FsCompilerRoundTripTests.TicksAndHolesAreReadAsTheCompilerReadsThem, which patches a call under each of 59 lines fsi compiles and has fsi run the result. Five of the first set lost the call before the change. --- .../FsCompilerRoundTripTests.cs | 119 ++++++++++++++++++ src/DiffEngine/Inline/FsLanguage.cs | 91 +++++++++++++- 2 files changed, 206 insertions(+), 4 deletions(-) diff --git a/src/DiffEngine.Tests/FsCompilerRoundTripTests.cs b/src/DiffEngine.Tests/FsCompilerRoundTripTests.cs index f74da477..cb761797 100644 --- a/src/DiffEngine.Tests/FsCompilerRoundTripTests.cs +++ b/src/DiffEngine.Tests/FsCompilerRoundTripTests.cs @@ -121,6 +121,125 @@ static readonly (InlinePatchMode Mode, string Call)[] midLineCalls = "a ` b" ]; + /// + /// Lines of code F# compiles, each holding a tick or an interpolated string the scanner has + /// to step over as the compiler does, or the call under it is taken to be inside a literal. + /// A tick after a name or a type parameter is part of it, and anywhere else opens a char + /// literal, which is where a quote that opens no string is written. A hole of + /// $"..." holds char literals and comments and no string; one of a triple quoted + /// literal holds strings too, a verbatim one that ends in a doubled quote among them. Each is + /// here because fsi was asked, and is asked again by + /// . + /// + internal static readonly string[] Code = + [ + "let a' = 1 in ignore a'", + "let a'b = 1 in ignore a'b", + "let a'' = 1 in ignore a''", + "ignore '\"'", + "ignore ['a';'\"';'\\'']", + "ignore ('\"', '\\\\', '\\\"')", + "ignore (1,'\"')", + "ignore (id'\"')", + "ignore 'a'B", + "ignore ('\\065', '\\u0041', '\\U00000041', '\\x41')", + "let f (x: 'a) (y: 'a) = x in ignore (f '\"' '\"')", + "let x' = '\"' in ignore x'", + "let x = 1 in ignore (x,'\"')", + "ignore $\"{1}\"", + "ignore $\"{{literal}}\"", + "ignore $\"{ {| A = 1 |}.A }\"", + "ignore $\"{'}'}\"", + "ignore $\"{'{'}\"", + "ignore $\"{'\"'}\"", + "ignore $\"{1:N2}\"", + "ignore $\"%d{1}\"", + "ignore $@\"c:\\{1}\\\"", + "ignore @$\"c:\\{1}\\\"", + "ignore $@\"a\"\"{1}\"\"b\"", + "ignore $\"a\\\"{1}\\\"\"", + "ignore $\"{1 (* } *)}\"", + "ignore $\"{1 (* { *)}\"", + "ignore $\"{ [ for c in ['}'] -> c ] }\"", + "ignore $\"}}\"", + "ignore $\"{{\"", + "ignore $\"{1}}}\"", + "ignore $\"\\{1}\"", + "ignore $\"\"\"{\"a\"}\"\"\"", + "ignore $\"\"\"{ \"}\" }\"\"\"", + "ignore $\"\"\"{ \"{\" }\"\"\"", + "ignore $\"\"\"{ '\"' }\"\"\"", + "ignore $\"\"\"{ '{' }\"\"\"", + "ignore $\"\"\"{ $\"{1}\" }\"\"\"", + "ignore $\"\"\"{ @\"a\"\"\" }\"\"\"", + "ignore $\"\"\"{ @\"a\"\"b\" }\"\"\"", + "ignore $\"\"\"{ \"a\\\"\" }\"\"\"", + "ignore $\"\"\"{1}\"\" \"\"\"", + "ignore $\"\"\"{ (1, \"}}\") }\"\"\"", + "ignore $\"\"\"{ {| A = \"}\" |}.A }\"\"\"", + // A backslash escapes no brace, so this is a backslash and then a hole + "ignore $\"\\{'\"'}\"", + "ignore $\"{1}{'\"'}\"", + "let x' = 1 in ignore $\"{x'}{'}'}\"", + "let ``a}b`` = 1 in ignore $\"{ ``a}b`` }\"", + // A line comment in a hole runs to the end of its line, whatever it holds + "ignore $\"{1 // }\n }\"", + "ignore $\"\"\"{ 1 // } \"\"\"\n }\"\"\"", + // Doubled braces are text with one dollar, and what opens a hole with two + "ignore $\"\"\"{{ {1} }}\"\"\"", + "ignore $\"\"\"{{{'\"'}}}\"\"\"", + "ignore $$\"\"\"{{1}} {literal}\"\"\"", + "ignore $$\"\"\"{{ \"}}\" }}\"\"\"", + "ignore $$\"\"\"{ {{'\"'}} }\"\"\"", + "ignore $$\"\"\"{{{'\"'}}}\"\"\"", + "ignore $$$\"\"\"{{ {{{'\"'}}} }}\"\"\"", + "ignore \"a\"B", + "ignore \"\"\"a\"\"\"B" + ]; + + [Test] + [RequiresDotnet] + public async Task TicksAndHolesAreReadAsTheCompilerReadsThem() + { + var expected = Convert.ToBase64String(Encoding.UTF8.GetBytes("found")); + var builder = new StringBuilder(prelude); + // Every line the scanner lost the call under, rather than the first, since one reading + // put right is as likely as not to be the reason for the next + var lost = new List(); + for (var index = 0; index < Code.Length; index++) + { + // The line is the first thing in the body, so a scanner that reads a literal in it as + // longer or shorter than it is loses the call under it, and a compiler that does not + // take the line has no function to call + var snippet = $"let code{index} () =\n {Code[index]}\n Verify(\"x\").Snapshot().ToTask()\n"; + var status = InlinePatcher.TryApply(SourceLanguage.FSharp, snippet, 3, InlinePatchMode.Set, null, null, null, null, false, "found", out var patched, out _); + if (status != PatchStatus.Applied) + { + lost.Add(Code[index]); + continue; + } + + builder.Append(patched); + builder.Append($"check \"code{index}\" (code{index} ()) \"{expected}\"\n\n"); + } + + await Assert.That(lost).IsEmpty(); + builder.Append(footer); + var path = Path.Combine(Path.GetTempPath(), $"DiffEngineFsCode_{Guid.NewGuid():N}.fsx"); + await File.WriteAllTextAsync(path, builder.ToString(), new UTF8Encoding(false)); + try + { + var (exitCode, output) = RunFsi(path); + + await Assert.That(output).Contains("ALL OK"); + await Assert.That(exitCode).IsEqualTo(0); + } + finally + { + File.Delete(path); + } + } + [Test] [RequiresDotnet] public async Task CommentsAndNamesAreReadAsTheCompilerReadsThem() diff --git a/src/DiffEngine/Inline/FsLanguage.cs b/src/DiffEngine/Inline/FsLanguage.cs index 0d10bf98..f0601b52 100644 --- a/src/DiffEngine/Inline/FsLanguage.cs +++ b/src/DiffEngine/Inline/FsLanguage.cs @@ -40,6 +40,9 @@ public override bool TryParse(string expression, [NotNullWhen(true)] out string? internal override bool SuppliesArgumentExpressions => false; internal override bool IsIdentifierChar(char ch) => + IsNameChar(ch); + + static bool IsNameChar(char ch) => char.IsLetterOrDigit(ch) || ch == '_' || ch == '\''; internal override bool IsTypeArgumentChar(char ch) => @@ -466,8 +469,11 @@ static bool TrySkipStringLike(string source, ref int index) if (quotes >= 3 && !verbatim) { // Triple quoted: verbatim, so there are no escapes to consider and no delimiter to - // widen. It ends at the next run of three quotes, interpolation holes included + // widen. Its text ends at the next run of three quotes. A hole is not text: it may + // hold a string or a comment with three quotes of its own, which end nothing var search = cursor + 3; + // As many braces open a hole as there are dollars in front, and fewer are text + var dollars = interpolated ? cursor - index : 0; while (search < source.Length) { if (source[search] == '"' && @@ -477,6 +483,42 @@ static bool TrySkipStringLike(string source, ref int index) return true; } + if (dollars > 0 && + source[search] == '{') + { + var braces = 1; + while (search + braces < source.Length && + source[search + braces] == '{') + { + braces++; + } + + // With one dollar a doubled brace is a brace, so only an odd one out opens. + // With more, the last of a run that is long enough do, and the ones in front + // of them are text + var opens = dollars == 1 ? braces % 2 == 1 : braces >= dollars; + search += braces; + if (!opens) + { + continue; + } + + search--; + if (!TrySkipHole(source, ref search)) + { + index = source.Length; + return true; + } + + // The rest of the braces that close it + for (var closing = 1; closing < dollars && search < source.Length && source[search] == '}'; closing++) + { + search++; + } + + continue; + } + search++; } @@ -511,8 +553,9 @@ static bool TrySkipStringLike(string source, ref int index) if (!verbatim && ch == '\\') { - // Escape or line continuation: either way the next character is content - cursor += 2; + // Escape or line continuation: either way the next character is content. Except a + // brace where braces open holes, which no backslash escapes + cursor += interpolated && cursor + 1 < source.Length && source[cursor + 1] == '{' ? 1 : 2; continue; } @@ -548,7 +591,17 @@ static bool TrySkipStringLike(string source, ref int index) return true; } - // cursor at '{' of an interpolation hole; skips past the matching '}' + /// + /// Steps past an interpolation hole, from its { to past the } that closes it. + /// + /// A hole is code, and is lexed as code is: a brace in a char literal, a comment, a string or + /// a backticked name is not one of the hole's own, and a quote in a char literal or a comment + /// opens no string. Counting every brace and taking every quote for a string, as this did, + /// $"{'{'}" never closed and $"{'"'}" closed on a string that ran to the end of + /// the file, and the calls under either were inside a literal. FsCompilerRoundTripTests + /// holds each shape to the compiler. + /// + /// static bool TrySkipHole(string source, ref int cursor) { var depth = 1; @@ -565,6 +618,36 @@ static bool TrySkipHole(string source, ref int cursor) cursor++; } + continue; + case '\'': + // The rule code has: a tick after a name is part of the name + if (IsNameChar(source[cursor - 1]) || + !TrySkipCharLiteral(source, ref cursor)) + { + cursor++; + } + + continue; + case '(': + if (!TrySkipBlockComment(source, ref cursor)) + { + cursor++; + } + + continue; + case '/': + if (!TrySkipLineComment(source, ref cursor)) + { + cursor++; + } + + continue; + case '`': + if (!TrySkipQuotedIdentifier(source, ref cursor)) + { + cursor++; + } + continue; case '{': depth++; From edb55679b609244d71881fd6566def369c35dac1 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:54:46 +1100 Subject: [PATCH 37/50] Keep the line of a statement a Remove takes when a Snapshot call is under it A Remove of settings.Snapshot("dup"); takes the statement's lines, which brought the line under it up onto the line the patch names. Where that was other.Snapshot("dup");, or a verify call with the same literal chained onto it, the next apply of the same Remove - a second framework's, or the next case of a test that ignores its parameters - had the same line and the same anchor and took the sibling. The statement now leaves one empty line where a Snapshot call would otherwise come up onto its first line, as a chained call taken with its line already did. RemovedAtHint reads an empty line over a line holding a Snapshot call as the call removed, since a statement on a variable has no verify call above it to be recognised by. Only where the Snapshot call is on the statement's first line. No existing expectation moved: a statement with anything else under it still goes whole. Checked by RemoveOfAStatementAppliedTwiceLeavesTheSiblingUnderIt (both siblings), RemoveOfAStatementOverSeveralLinesAppliedTwiceLeavesTheSiblingUnderIt and RemoveOfAStatementWithNoSnapshotCallUnderItKeepsNoLine in InlinePatcherTests, the first two failing before the change, and by a removedStatement shape in FsCompilerRoundTripTests that fsi compiles and runs. --- .../FsCompilerRoundTripTests.cs | 3 + src/DiffEngine.Tests/InlinePatcherTests.cs | 56 +++++++++++++++ src/DiffEngine/Inline/InlinePatcher.cs | 70 ++++++++++++++++++- 3 files changed, 128 insertions(+), 1 deletion(-) diff --git a/src/DiffEngine.Tests/FsCompilerRoundTripTests.cs b/src/DiffEngine.Tests/FsCompilerRoundTripTests.cs index cb761797..a0862551 100644 --- a/src/DiffEngine.Tests/FsCompilerRoundTripTests.cs +++ b/src/DiffEngine.Tests/FsCompilerRoundTripTests.cs @@ -456,6 +456,9 @@ void Add(string name, string snippet, int lineHint, InlinePatchMode mode) builder.Append($"check \"removedBang\" (removedBang ()) \"{Convert.ToBase64String(Encoding.UTF8.GetBytes("xdup"))}\"\n\n"); builder.Append(Patch("let removedChain () =\n Verify(\"x\")\n .Snapshot(\"dup\")\n .Snapshot(\"kept\").ToTask()\n", 3, InlinePatchMode.Remove, "", "dup")); builder.Append($"check \"removedChain\" (removedChain ()) \"{Convert.ToBase64String(Encoding.UTF8.GetBytes("kept"))}\"\n\n"); + // And where a statement was, taken whole for being a call on a name and nothing else + builder.Append(Patch("let removedStatement () =\n let first = Verify(\"x\")\n first.Snapshot(\"dup\")\n first.Snapshot(\"dup\")\n first.ToTask()\n", 3, InlinePatchMode.Remove, "", "dup")); + builder.Append($"check \"removedStatement\" (removedStatement ()) \"{Convert.ToBase64String(Encoding.UTF8.GetBytes("x"))}\"\n\n"); builder.Append(footer); return builder.ToString(); diff --git a/src/DiffEngine.Tests/InlinePatcherTests.cs b/src/DiffEngine.Tests/InlinePatcherTests.cs index 49acbb00..9ee94196 100644 --- a/src/DiffEngine.Tests/InlinePatcherTests.cs +++ b/src/DiffEngine.Tests/InlinePatcherTests.cs @@ -1582,6 +1582,62 @@ public async Task ReapplyingARemoveOfAStatementIsAlreadyApplied() await Assert.That(status).IsEqualTo(PatchStatus.AlreadyApplied); } + /// + /// A statement taken whole brought the line under it up onto the line the patch names, as a + /// chained call taken with its line did, and where that line was a sibling's statement with + /// the same literal the second apply took the sibling. So the line stays here too, empty. + /// + [Test] + [Arguments(" other.Snapshot(\"dup\");")] + [Arguments(" await Verify(value, other).Snapshot(\"dup\");")] + public async Task RemoveOfAStatementAppliedTwiceLeavesTheSiblingUnderIt(string sibling) + { + var source = Method($" settings.Snapshot(\"dup\");\n{sibling}\n await Verify(value, settings);"); + var removed = Method($"\n{sibling}\n await Verify(value, settings);"); + + var first = TryApply(source, 5, InlinePatchMode.Remove, "\"dup\"", "", out var once, out _, memberName: "Test"); + var second = TryApply(once, 5, InlinePatchMode.Remove, "\"dup\"", "", out _, out _, memberName: "Test"); + + await Assert.That(first).IsEqualTo(PatchStatus.Applied); + await Assert.That(once).IsEqualTo(removed); + await Assert.That(second).IsEqualTo(PatchStatus.AlreadyApplied); + } + + /// + /// One line is kept for a statement over several, written with the file's own line break, as + /// it is for a chained call: the first line is the one the patch names. + /// + [Test] + public async Task RemoveOfAStatementOverSeveralLinesAppliedTwiceLeavesTheSiblingUnderIt() + { + var literal = "\"\"\"\n dup\n \"\"\""; + var source = Method($" settings.Snapshot(\n {literal}); // inline for now\n other.Snapshot(\n {literal});").Replace("\n", "\r\n"); + var removed = Method($"\n other.Snapshot(\n {literal});").Replace("\n", "\r\n"); + var anchor = literal.Replace("\n", "\r\n"); + + var first = TryApply(source, 5, InlinePatchMode.Remove, anchor, "", out var once, out _, memberName: "Test"); + var second = TryApply(once, 5, InlinePatchMode.Remove, anchor, "", out _, out _, memberName: "Test"); + + await Assert.That(first).IsEqualTo(PatchStatus.Applied); + await Assert.That(once).IsEqualTo(removed); + await Assert.That(second).IsEqualTo(PatchStatus.AlreadyApplied); + } + + /// + /// The line is kept only for a Snapshot call that would come up onto it. Under anything else + /// the statement's lines go, as they always did. + /// + [Test] + public async Task RemoveOfAStatementWithNoSnapshotCallUnderItKeepsNoLine() + { + var source = Method(" settings.Snapshot(\"dup\");\n var next = 1;\n other.Snapshot(\"dup\");"); + + var status = TryApply(source, 5, InlinePatchMode.Remove, "\"dup\"", "", out var newSource, out _, memberName: "Test"); + + await Assert.That(status).IsEqualTo(PatchStatus.Applied); + await Assert.That(newSource).IsEqualTo(Method(" var next = 1;\n other.Snapshot(\"dup\");")); + } + /// /// Shapes where the call is all its statement does and the statement cannot simply be lifted /// out: an if with no braces would take the next statement for its body, a line shared diff --git a/src/DiffEngine/Inline/InlinePatcher.cs b/src/DiffEngine/Inline/InlinePatcher.cs index a1f2c0c0..d5c27728 100644 --- a/src/DiffEngine/Inline/InlinePatcher.cs +++ b/src/DiffEngine/Inline/InlinePatcher.cs @@ -678,7 +678,7 @@ static PatchStatus TryRemove( return PatchStatus.NotFound; } - newSource = Splice(source, from, to, ""); + newSource = Splice(source, from, to, KeptStatementLine(source, scan, lineStarts, nameStart, from, to)); return PatchStatus.Applied; } @@ -782,6 +782,41 @@ static string KeepingItsLine(string source, SourceScan scan, int lineBreak, int return builder.ToString(); } + /// + /// What a statement taken whole leaves where it was: nothing, or one empty line when the line + /// under it holds a Snapshot call. + /// + /// for a statement, and for its reason. + /// settings.Snapshot("dup"); over other.Snapshot("dup"); brought the second up + /// onto the line the patch names, and the next apply of the same Remove had the same line and + /// the same anchor to go by and took the sibling's statement. + /// + /// + /// Only where the Snapshot call is on the statement's first line, which is the line the patch + /// names and so the one the empty line has to be on. With what it is called on a line above + /// it, the line that comes up onto the call's is further down than the one under the + /// statement, and one kept line puts neither right. + /// + /// + /// The source the statement is in. + /// The map of that source. + /// Where each line of the source starts. + /// The Snapshot call's name. + /// The start of the statement's first line. + /// The start of the line after its last. + static string KeptStatementLine(string source, SourceScan scan, List lineStarts, int nameStart, int from, int to) + { + if (to >= source.Length || + LineOf(lineStarts, nameStart) != LineOf(lineStarts, from) || + !CallsOnLine(source, scan, lineStarts, LineOf(lineStarts, to), snapshotName, false).Any()) + { + return ""; + } + + // The break the statement's last line ended in, which is the file's own + return to >= 2 && source[to - 2] == '\r' ? "\r\n" : "\n"; + } + /// /// Whether taking a call out would leave nothing of its expression but what it was called on: /// the call hangs off a name rather than off another call, and nothing is chained on after it. @@ -958,6 +993,11 @@ static bool TryStatementLines(string source, SourceScan scan, List lineStar /// pulls the rest of its statement up onto the line above, so the recorded line then holds /// whatever followed, and the statement it named ends just before it. /// + /// + /// A call on a variable has no verify statement to be read off, and its whole statement goes. + /// So an empty line over a line holding a Snapshot call is read as removed too, which is what + /// leaves, and . + /// /// static bool RemovedAtHint(string source, SourceScan scan, List lineStarts, int lineHint, int? memberLine, string[] entryPoints) { @@ -983,6 +1023,15 @@ static bool RemovedAtHint(string source, SourceScan scan, List lineStarts, return false; } + // An empty line over a Snapshot call is the line a Remove kept, and the only sign there is + // of a statement taken whole: nothing above it need be a verify call + if (lineHint < lineCount && + IsEmptyLine(source, scan, lineStarts, lineHint) && + CallsOnLine(source, scan, lineStarts, lineHint + 1, snapshotName, false).Any()) + { + return true; + } + for (var line = lineHint; line >= floor; line--) { var calls = CallsOnLine(source, scan, lineStarts, line, entryPoints, true).ToList(); @@ -1006,6 +1055,25 @@ static bool RemovedAtHint(string source, SourceScan scan, List lineStarts, return false; } + /// + /// Whether a line holds nothing but whitespace, and is a line of code: an empty line of a + /// literal's content is not one anything was taken from. + /// + static bool IsEmptyLine(string source, SourceScan scan, List lineStarts, int line) + { + var start = lineStarts[line - 1]; + var end = line < lineStarts.Count ? lineStarts[line] : source.Length; + for (var index = start; index < end; index++) + { + if (!char.IsWhiteSpace(source[index])) + { + return false; + } + } + + return scan.IsCode(start); + } + /// /// The calls a Snapshot call has to be appended in front of rather than after: each hands back /// something other than the SettingsTask a Snapshot call is made on, so the chain cannot be From 044017ef4949becfab542d49b4a7c1a5d1706681 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:57:21 +1100 Subject: [PATCH 38/50] Refuse an Append whose line names no call when two calls could take it An Append carries no anchor. With its hint gone stale it took the first call in the member with no Snapshot call chained onto it, and where an earlier call there is verified through files, or through settings.Snapshot, that call was given the snapshot of the one after it. Two things now. A call passed a name that Snapshot is called on in the same member (settings.Snapshot("A"); then Verify(a, settings)) has its snapshot and is passed over. And where more than one call is still left, nothing in the source says which the patch was for, so it is refused with a reason that says to re-run, which brings the line the call is on now. A hint that lands on a call still names it, a member with one such call still takes it, and a patch with no member still goes to the nearest call, all as before. No existing expectation moved. Checked by AppendWithAStaleHintPassesOverACallVerifiedThroughItsSettings, AppendWithAStaleHintIsRefusedWhenTwoCallsCouldTakeIt, AppendTakesTheCallOnTheRecordedLineAmongSeveral and AppendWithAStaleHintTakesTheOnlyCallWithNoSnapshot in InlinePatcherTests, the first two failing before the change. --- src/DiffEngine.Tests/InlinePatcherTests.cs | 84 ++++++++++++ src/DiffEngine/Inline/InlinePatcher.cs | 147 ++++++++++++++++++++- 2 files changed, 228 insertions(+), 3 deletions(-) diff --git a/src/DiffEngine.Tests/InlinePatcherTests.cs b/src/DiffEngine.Tests/InlinePatcherTests.cs index 9ee94196..ad8ae3d9 100644 --- a/src/DiffEngine.Tests/InlinePatcherTests.cs +++ b/src/DiffEngine.Tests/InlinePatcherTests.cs @@ -1074,6 +1074,90 @@ await Verify(b) """)); } + /// + /// A call verified through its settings has nothing chained onto it, and with the hint gone + /// stale it was the first call the walk met with no Snapshot call: the snapshot of the call + /// under it was appended to it. A name Snapshot is called on, passed to a call, says that + /// call has one. + /// + [Test] + [Arguments("settings")] + [Arguments("settings: settings")] + public async Task AppendWithAStaleHintPassesOverACallVerifiedThroughItsSettings(string argument) + { + var source = Method( + $""" + var settings = new VerifySettings(); + settings.Snapshot("A"); + await Verify(a, {argument}); + await Verify(b); + """); + + var status = TryApply(source, 14, InlinePatchMode.Append, null, "B", out var newSource, out var reason, memberName: "Test"); + + await Assert.That((status, reason)).IsEqualTo((PatchStatus.Applied, "")); + await Assert.That(newSource).IsEqualTo( + Method( + $""" + var settings = new VerifySettings(); + settings.Snapshot("A"); + await Verify(a, {argument}); + await Verify(b) + .Snapshot("B"); + """)); + } + + const string twoWithNoSnapshot = + """ + class Tests + { + async Task Test() + { + await Verify(a).UseDirectory("files"); + await Throws(() => Verify(b)); + } + } + + """; + + /// + /// Two calls with no Snapshot call, one of them verified through files, and a hint that names + /// neither. An append has no anchor to tell them apart by, and the first was taken, which is + /// the wrong one whenever the file verified call comes first. Refused, for a re-run to say + /// where the call is. The verify call inside the Throws is part of that call, not a third. + /// + [Test] + public async Task AppendWithAStaleHintIsRefusedWhenTwoCallsCouldTakeIt() + { + var status = TryApply(Source(twoWithNoSnapshot), 12, InlinePatchMode.Append, null, "B", out _, out var reason, memberName: "Test"); + + await Assert.That(status).IsEqualTo(PatchStatus.NotFound); + await Assert.That(reason).Contains("more than one verify entry point call in its test has no Snapshot call"); + } + + // The recorded line still names its call, whatever else is in the member + [Test] + public async Task AppendTakesTheCallOnTheRecordedLineAmongSeveral() + { + var status = TryApply(Source(twoWithNoSnapshot), 6, InlinePatchMode.Append, null, "B", out var newSource, out _, memberName: "Test"); + + await Assert.That(status).IsEqualTo(PatchStatus.Applied); + await Assert.That(newSource).Contains("await Verify(a).UseDirectory(\"files\");\n"); + await Assert.That(newSource).Contains("await Throws(() => Verify(b))\n .Snapshot(\"B\");"); + } + + // One call with none, and a call nested in its arguments, is still one call + [Test] + public async Task AppendWithAStaleHintTakesTheOnlyCallWithNoSnapshot() + { + var source = Method(" await Verify(a).Snapshot(\"A\");\n await Throws(() => Verify(b));"); + + var status = TryApply(source, 12, InlinePatchMode.Append, null, "B", out var newSource, out var reason, memberName: "Test"); + + await Assert.That((status, reason)).IsEqualTo((PatchStatus.Applied, "")); + await Assert.That(newSource).Contains("await Throws(() => Verify(b))\n .Snapshot(\"B\");"); + } + /// /// The hint lands on the accepted call this time, which is what a second framework's patch for /// that same call site looks like once the first has been accepted. It names that call, so the diff --git a/src/DiffEngine/Inline/InlinePatcher.cs b/src/DiffEngine/Inline/InlinePatcher.cs index d5c27728..4bf1b9b8 100644 --- a/src/DiffEngine/Inline/InlinePatcher.cs +++ b/src/DiffEngine/Inline/InlinePatcher.cs @@ -448,6 +448,14 @@ static bool TryReadArguments(string source, SourceScan scan, int openParen, out /// accepted already. Stopping there answered "already has a Snapshot call" for a patch whose /// own call sat two lines further down, and a single accept dropped the entry. /// + /// + /// And it has to be the only one, where the recorded line names no call. An append carries no + /// anchor, so among several calls with no Snapshot call nothing says which it was for, and the + /// first was taken: a call verified through files that came earlier in the test was given the + /// snapshot of the one after it. That is refused now, and a re-run brings the line the call + /// is on. A call passed a name Snapshot is called on () + /// has its snapshot and is not one of them. + /// /// static PatchStatus TryAppend( string source, @@ -467,6 +475,10 @@ static PatchStatus TryAppend( // Whether a call passed over for having a Snapshot call was holding this very content var held = false; List<(int Open, int Close)>? passedOver = null; + // The call to append to, once the recorded line has turned out not to name one, and the + // names Snapshot is called on in the member, read when the first such call is met + (int NameStart, int InsertAt)? taken = null; + HashSet? snapshotReceivers = null; foreach (var (nameStart, openParen) in FindCalls(source, scan, lineStarts, lineHint, memberLine, entryPoints, true)) { // An entry point in the argument list of a call that was passed over is part of that @@ -479,8 +491,14 @@ static PatchStatus TryAppend( } found = true; - if (!TryScanArguments(source, scan, openParen, out var closeParen, out _)) + if (!TryScanArguments(source, scan, openParen, out var closeParen, out var commas)) { + // One past the call that was taken is not this patch's to report + if (taken is not null) + { + break; + } + failReason = $"Could not parse the argument list of the {entryPointDescription} call near line {lineHint}."; return PatchStatus.NotFound; } @@ -495,8 +513,39 @@ static PatchStatus TryAppend( var insertAt = WalkChain(source, scan, closeParen + 1, methodName, out var chained); if (chained < 0) { - newSource = AppendCall(source, scan, lineStarts, nameStart, insertAt, newContent, eol, fileUnit); - return PatchStatus.Applied; + // The recorded line names its call, and with no member there is nothing to say + // how far the walk may go for another + if (memberLine is null || + IsOnHint(lineStarts, nameStart, lineHint)) + { + newSource = AppendCall(source, scan, lineStarts, nameStart, insertAt, newContent, eol, fileUnit); + return PatchStatus.Applied; + } + + passedOver ??= []; + passedOver.Add((openParen, closeParen)); + snapshotReceivers ??= SnapshotReceivers(source, scan, lineStarts, memberLine.Value); + if (TakesASnapshotReceiver(source, scan, openParen, closeParen, commas, snapshotReceivers)) + { + continue; + } + + if (taken is not null) + { + failReason = $"The call has moved from line {lineHint}, and more than one {entryPointDescription} call in its test has no {methodName} call. Re-run the test."; + return PatchStatus.NotFound; + } + + taken = (nameStart, insertAt); + continue; + } + + // Past the call that was taken, the walk is only looking for a second one like it + if (taken is not null) + { + passedOver ??= []; + passedOver.Add((openParen, closeParen)); + continue; } held |= HoldsContent(source, scan, chained, newContent); @@ -516,6 +565,12 @@ static PatchStatus TryAppend( passedOver.Add((openParen, closeParen)); } + if (taken is { } call) + { + newSource = AppendCall(source, scan, lineStarts, call.NameStart, call.InsertAt, newContent, eol, fileUnit); + return PatchStatus.Applied; + } + if (!found) { // Short, because every surface that shows it is one line: a status bar, a balloon, a @@ -543,6 +598,92 @@ static PatchStatus TryAppend( return PatchStatus.NotFound; } + /// + /// The names a Snapshot call is made on in the member declared at + /// : settings for settings.Snapshot("old");. Plain + /// names only, since that is all can match an argument to. + /// + static HashSet SnapshotReceivers(string source, SourceScan scan, List lineStarts, int memberLine) + { + var receivers = new HashSet(StringComparer.Ordinal); + var lineCount = lineStarts.Count; + var floor = Clamp(memberLine, lineCount); + var ceiling = Math.Min(NextMemberLine(source, scan, lineStarts, floor), lineCount + 1); + for (var line = floor; line < ceiling; line++) + { + foreach (var (nameStart, _) in CallsOnLine(source, scan, lineStarts, line, snapshotName, false)) + { + var dot = PreviousToken(source, scan, nameStart); + if (dot < 0 || + source[dot] != '.') + { + continue; + } + + var end = PreviousToken(source, scan, dot); + if (end < 0 || + !scan.IsCode(end) || + !scan.IsIdentifierChar(source[end])) + { + continue; + } + + var start = scan.WordStart(end); + var before = PreviousToken(source, scan, start); + if (before >= 0 && + source[before] == '.') + { + continue; + } + + receivers.Add(source.Substring(start, end + 1 - start)); + } + } + + return receivers; + } + + /// + /// Whether a call is passed something a Snapshot call is made on in the same member, which is + /// a verification that has its snapshot already: settings.Snapshot("old"); and then + /// Verify(value, settings). + /// + /// Asked of a call the recorded line did not name. A patch that appends is for a call with no + /// snapshot anywhere, so this one is not it, and with nothing chained onto it, it read as the + /// first call still wanting one. + /// + /// + static bool TakesASnapshotReceiver(string source, SourceScan scan, int openParen, int closeParen, List commas, HashSet receivers) + { + if (receivers.Count == 0) + { + return false; + } + + var start = openParen + 1; + for (var index = 0; index <= commas.Count; index++) + { + var end = index < commas.Count ? commas[index] : closeParen; + var argumentStart = start; + var argumentEnd = end; + start = end + 1; + TrimSpan(source, scan, ref argumentStart, ref argumentEnd); + if (argumentStart < argumentEnd) + { + scan.Language.TryStripArgumentName(source, ref argumentStart, out _); + } + + if (argumentStart < argumentEnd && + scan.IsCode(argumentStart) && + receivers.Contains(source.Substring(argumentStart, argumentEnd - argumentStart))) + { + return true; + } + } + + return false; + } + /// /// The source with a Snapshot call holding spliced in at /// , on a line of its own under the call at From 67d67ed1a4603a6f2c2616d37b5711ce3ae95443 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:21:03 +1100 Subject: [PATCH 39/50] Lex a file once for a batch, and around each edit after that A batch applies each patch to what the one before it left, so the file was lexed whole for every patch, and its line starts, line ending and indent step were worked out whole again too, the last with a string a line. Five hundred patches to a 600 KB file were 0.77 s of patching around one write, and a gigabyte allocated. The scan is now carried from each patch that edits to the next. SourceScan.Edited keeps the spans before the edit, lexes again from the start of the line the edit begins on, and stops at the first line start past the edit that both scans have as code, taking the rest of the old scan's spans moved by the change in length. A line that follows a backslash is not started from, since a backslash is the one thing either lexer reads across a line break from in front of it. The line starts are carried the same way, and the line ending and the indent step are counted from them without allocating. What each patch is told is unchanged, because the scan it is given answers as a scan of the whole text does. That is what the tests hold it to: - SourceScanTests.AScanMadeFromAnotherIsTheScanOfTheWholeText, both languages: 400 runs of 25 random edits made of everything that opens, closes or escapes a comment or a literal, every answer at every offset compared with a scan of the whole text after each. Taking the backslash rule out fails it. - AScanMadeFromAnotherOfTheSuitesOwnSourceIsTheScanOfTheWholeText, the same over two files of thousands of lines. - InlineApplierBatchTests.ACarriedScanTellsEachPatchWhatLexingAgainWould, both languages: 60 shuffled batches of Set, Append and Remove patches, outcomes, reasons and final source compared with lexing again for each. - The existing batch tests, which compare ApplyAll with Apply in turn. InlineAcceptBenchmarks, 500 call sites, before and after, on a machine busy with other builds: PatchInMemory 766.5 ms, 1,048 MB -> 285.8 ms, 711 MB AcceptTogether 727.6 ms -> 354.3 ms PatchInMemory now goes through InlineApplier.PatchInTurn, which is the loop the batch runs. What is left is a copy of the source for each patch that edits, 1.2 MB each in that file. --- .../InlineAcceptBenchmarks.cs | 31 +- .../InlineApplierBatchTests.cs | 157 +++++++ src/DiffEngine.Tests/SourceScanTests.cs | 171 +++++++ src/DiffEngine/Inline/CsLanguage.cs | 15 +- src/DiffEngine/Inline/FsLanguage.cs | 15 +- src/DiffEngine/Inline/InlineApplier.cs | 183 +++++--- src/DiffEngine/Inline/InlinePatcher.cs | 171 ++----- src/DiffEngine/Inline/SourceLanguage.cs | 14 +- src/DiffEngine/Inline/SourceScan.cs | 423 ++++++++++++++++++ 9 files changed, 944 insertions(+), 236 deletions(-) diff --git a/src/DiffEngine.Benchmarks/InlineAcceptBenchmarks.cs b/src/DiffEngine.Benchmarks/InlineAcceptBenchmarks.cs index 52b61dd8..2f34dce4 100644 --- a/src/DiffEngine.Benchmarks/InlineAcceptBenchmarks.cs +++ b/src/DiffEngine.Benchmarks/InlineAcceptBenchmarks.cs @@ -113,36 +113,15 @@ public int AnchorEach() return Every(anchored); } - // The patcher alone over the same patches, each applied to what the last one left: what the - // accepts above cost with the file system, the encoding and the locks taken out + // The patcher alone over the same patches, each applied to what the last one left: what + // AcceptTogether costs with the file system, the encoding and the locks taken out [Benchmark] public int PatchInMemory() { var current = source; - var applied = 0; - foreach (var patch in patches) - { - var status = InlinePatcher.TryApply( - SourceLanguage.CSharp, - current, - patch.LineHint, - patch.Mode, - patch.OriginalExpression, - patch.OriginalValue, - patch.MemberName, - patch.EntryPoints, - false, - patch.NewContent, - out var patched, - out _); - if (status == PatchStatus.Applied) - { - current = patched; - applied++; - } - } - - return Every(applied); + var results = new InlineApplyResult[patches.Length]; + InlineApplier.PatchInTurn(SourceLanguage.CSharp, ref current, patches, true, false, path, results); + return Every(results.Count(_ => _.Status == InlineApplyStatus.Applied)); } // The lexing every one of those starts with diff --git a/src/DiffEngine.Tests/InlineApplierBatchTests.cs b/src/DiffEngine.Tests/InlineApplierBatchTests.cs index 8f7bd498..e71efa40 100644 --- a/src/DiffEngine.Tests/InlineApplierBatchTests.cs +++ b/src/DiffEngine.Tests/InlineApplierBatchTests.cs @@ -211,6 +211,163 @@ public async Task EncodingAndLineEndingsSurviveABatch() public async Task AnEmptyBatchIsNoResults() => await Assert.That(InlineApplier.ApplyAll([])).IsEmpty(); + /// + /// A batch lexes its file once and carries the scan from each patch to the next. What each + /// patch is told, and what the source comes to, has to be what lexing the whole text again + /// for every patch gives. Patches of every mode, in an order made at random: literals that + /// grow and move every call site under them, calls appended and removed, the same patch + /// twice, an anchor that is in no call, and hints that are stale from the first edit on. + /// + [Test] + [Arguments("cs")] + [Arguments("fs")] + public async Task ACarriedScanTellsEachPatchWhatLexingAgainWould(string extension) + { + var language = SourceLanguage.ForFile($"Sample.{extension}"); + var path = Path.Combine(Path.GetTempPath(), $"Sample.{extension}"); + var problems = new List(); + var seen = new HashSet(); + for (var seed = 0; seed < 60 && problems.Count < 3; seed++) + { + var random = new Random(seed); + var (source, patches) = MixedBatch(random, extension, path, seed % 2 == 0 ? "\n" : "\r\n"); + + var carried = source; + var results = new InlineApplyResult[patches.Count]; + InlineApplier.PatchInTurn(language, ref carried, patches, true, false, path, results); + + var lexedAgain = source; + for (var index = 0; index < patches.Count; index++) + { + var patch = patches[index]; + var status = InlinePatcher.TryApply( + language, + lexedAgain, + patch.LineHint, + patch.Mode, + patch.OriginalExpression, + patch.OriginalValue, + patch.MemberName, + patch.EntryPoints, + false, + patch.NewContent, + out var patched, + out var reason); + if (status == PatchStatus.Applied) + { + lexedAgain = patched; + } + + var expected = status switch + { + PatchStatus.Applied => InlineApplyResult.Applied, + PatchStatus.AlreadyApplied => InlineApplyResult.AlreadyApplied, + _ => InlineApplyResult.NotFound(reason) + }; + if (results[index].Status != expected.Status || + results[index].Message != expected.Message) + { + problems.Add($"seed {seed}, patch {index} ({patch.Mode} at {patch.LineHint}): {results[index].Status} {results[index].Message}, and lexed again {expected.Status} {expected.Message}"); + break; + } + } + + if (carried != lexedAgain) + { + problems.Add($"seed {seed}: the source differs"); + } + + seen.UnionWith(results.Select(_ => _.Status)); + } + + await Assert.That(problems).IsEmpty(); + // Or the batches were all refusals, and agreed about nothing much + await Assert.That(seen).IsEquivalentTo([InlineApplyStatus.Applied, InlineApplyStatus.AlreadyApplied, InlineApplyStatus.NotFound]); + } + + /// + /// A file of members, each with a call that has a snapshot and one that has none, and a + /// shuffled batch of patches for them. + /// + static (string source, List patches) MixedBatch(Random random, string extension, string path, string eol) + { + var fsharp = extension == "fs"; + var builder = new StringBuilder(); + var patches = new List(); + var line = 0; + + void Add(string text) + { + builder.Append(text); + builder.Append(eol); + line++; + } + + Add(fsharp ? "module Tests" : "class Tests"); + Add(fsharp ? "" : "{"); + var members = 6 + random.Next(6); + for (var member = 0; member < members; member++) + { + Add(fsharp ? $"let member{member} () =" : $" async Task Member{member}()"); + Add(fsharp ? " // a comment with a \" in it" : " {"); + Add($" {(fsharp ? "let" : "var")} text{member} = \"a string // with (* things */ in it\"{(fsharp ? "" : ";")}"); + Add($" Verify(first{member})"); + Add($" .Snapshot(\"old {member}\"){(fsharp ? ".ToTask() |> ignore" : ";")}"); + var snapshotLine = line; + Add($" Verify(second{member}){(fsharp ? ".ToTask() |> ignore" : ";")}"); + var verifyLine = line; + Add(fsharp ? "" : " }"); + + var name = fsharp ? $"member{member}" : $"Member{member}"; + InlinePatch Patch(int hint, string? expression, string? value, string content, InlinePatchMode mode) => + new(path, hint, fsharp ? null : expression, content, mode) + { + TestName = null, + MemberName = name, + OriginalValue = fsharp ? value : null + }; + + var content = random.Next(3) switch + { + 0 => $"new {member}", + 1 => $"new {member}\nsecond \"line\"\n third", + _ => $"// {member}\n(* \"\"\" *)\n" + }; + switch (random.Next(5)) + { + case 0: + patches.Add(Patch(snapshotLine, $"\"old {member}\"", $"old {member}", content, InlinePatchMode.Set)); + break; + case 1: + patches.Add(Patch(snapshotLine, $"\"old {member}\"", $"old {member}", "", InlinePatchMode.Remove)); + break; + case 2: + patches.Add(Patch(verifyLine, null, null, content, InlinePatchMode.Append)); + break; + case 3: + // Both of a member's calls, and the first of them twice + patches.Add(Patch(snapshotLine, $"\"old {member}\"", $"old {member}", content, InlinePatchMode.Set)); + patches.Add(Patch(verifyLine, null, null, content, InlinePatchMode.Append)); + patches.Add(Patch(snapshotLine, $"\"old {member}\"", $"old {member}", content, InlinePatchMode.Set)); + break; + default: + patches.Add(Patch(snapshotLine, "\"in no call\"", "in no call", content, InlinePatchMode.Set)); + break; + } + } + + Add(fsharp ? "" : "}"); + + // Queue order is not file order + for (var index = patches.Count - 1; index > 0; index--) + { + var other = random.Next(index + 1); + (patches[index], patches[other]) = (patches[other], patches[index]); + } + + return (builder.ToString(), patches); + } + // Joined, because the order is the point and the collection assertions do not check it static string Statuses(IEnumerable results) => string.Join(", ", results.Select(_ => _.Status)); diff --git a/src/DiffEngine.Tests/SourceScanTests.cs b/src/DiffEngine.Tests/SourceScanTests.cs index dda0073d..984f9079 100644 --- a/src/DiffEngine.Tests/SourceScanTests.cs +++ b/src/DiffEngine.Tests/SourceScanTests.cs @@ -80,6 +80,177 @@ public async Task TheSuitesOwnSourceIsOneConsistentMap(string file) await Assert.That(spans).IsGreaterThan(10); } + /// + /// What an edit is made of here: everything that opens, closes or escapes a comment or a + /// literal in either language, line breaks of both kinds, and a backslash in front of one, + /// which is the one thing a lexer reads across a line break from in front of it. + /// + static readonly string[] pieces = + [ + "\"", "\"\"\"", "\"\"\"\"", "'", "\\", "\n", "\r\n", "\\\n", "'\\\n", "//", "/*", "*/", "(*", "*)", "(*)", + "#", "#if X", "$\"", "$$\"\"\"", "@\"", "{", "}", "{{", "}}", "``", " ", " ", "\t", "x", "'x'", "u8", "B", + "Verify(value)", ".Snapshot(\"old\")", ";" + ]; + + /// + /// A scan made from another by is the scan of the whole + /// text: every answer it gives, at every offset, after each of a run of edits made at random. + /// A batch carries its scan from patch to patch this way, so anything the two disagree on is + /// a patch told something other than what applying it by itself would have told it. + /// + [Test] + [Arguments("cs")] + [Arguments("fs")] + public async Task AScanMadeFromAnotherIsTheScanOfTheWholeText(string extension) + { + var language = SourceLanguage.ForFile($"file.{extension}"); + var problems = new List(); + for (var seed = 0; seed < 400 && problems.Count < 5; seed++) + { + var random = new Random(seed); + // Each language's sample, and the other's, which is mostly not this one's syntax + var other = seed % 4 == 3; + var text = SourceLanguage.NormalizeNewlines(other == (extension == "cs") ? fsharp : csharp); + var scan = language.Scan(text); + try + { + for (var step = 0; step < 25; step++) + { + // The line starts are carried only once they have been asked for + if (random.Next(2) == 0) + { + _ = scan.LineStarts; + } + + var edited = Edit(random, text); + var next = scan.Edited(edited); + scan.Dispose(); + scan = next; + text = edited; + using var whole = language.Scan(text); + if (Difference(scan, whole) is { } difference) + { + problems.Add($"seed {seed}, step {step}: {difference}"); + break; + } + } + } + finally + { + scan.Dispose(); + } + } + + await Assert.That(problems).IsEmpty(); + } + + /// + /// The same over a file of thousands of lines, where most of the scan is carried and the + /// lexer has a long way to go to rejoin it when an edit opens something. + /// + [Test] + [Arguments("InlinePatcherTests.cs")] + [Arguments("FsCompilerRoundTripTests.cs")] + public async Task AScanMadeFromAnotherOfTheSuitesOwnSourceIsTheScanOfTheWholeText(string file) + { + var text = await File.ReadAllTextAsync(Path.Combine(SourceDirectory, file)); + var random = new Random(file.Length); + var problems = new List(); + var scan = SourceLanguage.CSharp.Scan(text); + try + { + for (var step = 0; step < 60; step++) + { + if (step == 20) + { + _ = scan.LineStarts; + } + + var edited = Edit(random, text); + var next = scan.Edited(edited); + scan.Dispose(); + scan = next; + text = edited; + using var whole = SourceLanguage.CSharp.Scan(text); + if (Difference(scan, whole) is { } difference) + { + problems.Add($"step {step}: {difference}"); + break; + } + } + } + finally + { + scan.Dispose(); + } + + await Assert.That(problems).IsEmpty(); + } + + static string Edit(Random random, string text) + { + var start = random.Next(text.Length + 1); + var length = random.Next(3) == 0 ? 0 : random.Next(Math.Min(12, text.Length - start) + 1); + var replacement = new StringBuilder(); + for (var count = random.Next(4); count > 0; count--) + { + replacement.Append(pieces[random.Next(pieces.Length)]); + } + + return text[..start] + replacement + text[(start + length)..]; + } + + /// + /// The first thing two scans of one text answer differently, or null when there is none. + /// + static string? Difference(SourceScan made, SourceScan whole) + { + for (var offset = 0; offset <= whole.Source.Length + 1; offset++) + { + if (made.IsCode(offset) != whole.IsCode(offset)) + { + return $"{offset} is code to one and not the other"; + } + + if (made.TryGetSkip(offset, out var madeEnd) != whole.TryGetSkip(offset, out var wholeEnd) || + madeEnd != wholeEnd) + { + return $"the span starting at {offset} ends at {madeEnd} and at {wholeEnd}"; + } + + if (made.TryGetCommentSkip(offset, out madeEnd) != whole.TryGetCommentSkip(offset, out wholeEnd) || + madeEnd != wholeEnd) + { + return $"the comment starting at {offset} ends at {madeEnd} and at {wholeEnd}"; + } + + if (made.TryGetSkipEndingAt(offset, out var madeStart) != whole.TryGetSkipEndingAt(offset, out var wholeStart) || + madeStart != wholeStart) + { + return $"the span ending at {offset} starts at {madeStart} and at {wholeStart}"; + } + + if (made.TryGetCommentEndingAt(offset, out madeStart) != whole.TryGetCommentEndingAt(offset, out wholeStart) || + madeStart != wholeStart) + { + return $"the comment ending at {offset} starts at {madeStart} and at {wholeStart}"; + } + } + + if (!made.LineStarts.SequenceEqual(whole.LineStarts)) + { + return "the lines start in different places"; + } + + if (made.Eol != whole.Eol || + made.IndentUnit != whole.IndentUnit) + { + return "the line break or the indentation differs"; + } + + return null; + } + static string SourceDirectory { get; } = Path.GetDirectoryName(GetSourceFile())!; static string GetSourceFile([CallerFilePath] string path = "") => path; diff --git a/src/DiffEngine/Inline/CsLanguage.cs b/src/DiffEngine/Inline/CsLanguage.cs index 455930f5..2c4a1e6f 100644 --- a/src/DiffEngine/Inline/CsLanguage.cs +++ b/src/DiffEngine/Inline/CsLanguage.cs @@ -22,12 +22,19 @@ public override bool TryParse(string expression, [NotNullWhen(true)] out string? internal override bool IsIdentifierChar(char ch) => char.IsLetterOrDigit(ch) || ch == '_'; - internal override SourceScan Scan(string source) + internal override void Lex(SourceScan scan, int from) { - var scan = new SourceScan(this, source); - var index = 0; + var source = scan.Source; + var rejoinFrom = scan.RejoinFrom; + var index = from; while (index < source.Length) { + if (index >= rejoinFrom && + scan.TryRejoin(index)) + { + return; + } + var start = index; switch (source[index]) { @@ -81,8 +88,6 @@ internal override SourceScan Scan(string source) // Code, which is whatever the map was not told otherwise about index++; } - - return scan; } /// diff --git a/src/DiffEngine/Inline/FsLanguage.cs b/src/DiffEngine/Inline/FsLanguage.cs index f0601b52..6708ece5 100644 --- a/src/DiffEngine/Inline/FsLanguage.cs +++ b/src/DiffEngine/Inline/FsLanguage.cs @@ -50,12 +50,19 @@ internal override bool IsTypeArgumentChar(char ch) => // Tuple types (Foo) and statically resolved type parameters (^T) ch is '*' or '^'; - internal override SourceScan Scan(string source) + internal override void Lex(SourceScan scan, int from) { - var scan = new SourceScan(this, source); - var index = 0; + var source = scan.Source; + var rejoinFrom = scan.RejoinFrom; + var index = from; while (index < source.Length) { + if (index >= rejoinFrom && + scan.TryRejoin(index)) + { + return; + } + var start = index; switch (source[index]) { @@ -127,8 +134,6 @@ internal override SourceScan Scan(string source) // Code, which is whatever the map was not told otherwise about index++; } - - return scan; } internal override bool IsDeclaration(SourceScan scan, int nameStart) diff --git a/src/DiffEngine/Inline/InlineApplier.cs b/src/DiffEngine/Inline/InlineApplier.cs index b81d32a0..33d2f417 100644 --- a/src/DiffEngine/Inline/InlineApplier.cs +++ b/src/DiffEngine/Inline/InlineApplier.cs @@ -32,8 +32,8 @@ public static InlineApplyResult Apply(InlinePatch patch) => /// at a time, the whole file is read, lexed and written again for every patch, and the write /// is where the time goes. A file that has just been written is scanned by whatever watches /// the drive before the next thing can open it, and for five hundred snapshots in one ten - /// thousand line file that came to half a minute. The lexing is still once per patch, since - /// each starts from different source. + /// thousand line file that came to half a minute. The lexing is once a file too, and around + /// each edit after that (). /// /// /// So a write that fails fails every patch it was carrying, and each says so. The patches @@ -275,66 +275,7 @@ static InlineApplyResult[] LockedApply(string fullPath, IReadOnlyList + /// Applies the patches of one file to its source in memory, each to what the one before it + /// left, and says what became of each. Returns the first patch whose edit a write has to + /// carry, or -1 when none made one. + /// + /// The source is lexed once, for the first patch, and the scan is carried from each patch + /// that edits to the next (), which lexes only around the + /// edit. Lexed whole for every patch, five hundred snapshots in a 600 KB file were most of a + /// second of patching around their one write. What each patch is told is what it would have + /// been told over a scan of the whole text, since the scan it is given is that scan. + /// + /// + /// The language the source is in. + /// The source, replaced by each patch that edits when writing. + /// The patches, in the order they are to be applied. + /// False for a dry run, where every patch is asked of the same source. + /// Whether only a call site is being asked for. + /// The file, for a failure to name. + /// Filled with an outcome for each patch. + internal static int PatchInTurn( + SourceLanguage language, + ref string source, + IReadOnlyList patches, + bool write, + bool anchorOnly, + string fullPath, + InlineApplyResult[] results) + { + // The first patch whose edit the write has to carry, or -1 while there is none + var firstToWrite = -1; + SourceScan? scan = null; + try + { + for (var index = 0; index < results.Length; index++) + { + var patch = patches[index]; + PatchStatus status; + string newSource; + string failReason; + try + { + scan ??= language.Scan(source); + status = InlinePatcher.TryApply( + scan, + patch.LineHint, + patch.Mode, + patch.OriginalExpression, + patch.OriginalValue, + patch.MemberName, + patch.EntryPoints, + anchorOnly, + SourceLanguage.NormalizeNewlines(patch.NewContent), + out newSource, + out failReason); + } + catch (Exception exception) + { + // A patcher defect on some shape of source, reported against the file it met + // it in rather than thrown at whichever surface was accepting + results[index] = InlineApplyResult.Failed($"Failed to patch: {fullPath}", exception); + continue; + } + + switch (status) + { + case PatchStatus.AlreadyApplied: + results[index] = InlineApplyResult.AlreadyApplied; + continue; + case PatchStatus.NotFound: + results[index] = InlineApplyResult.NotFound(failReason); + continue; + } + + // Every reason a patch can be refused for has been asked by this point and none + // of them held. All that remains is the write, which is the one step a dry run + // may not take + results[index] = InlineApplyResult.Applied; + if (!write) + { + continue; + } + + // The next patch is applied to this one's result, as it would have been to the + // file this one had written + source = newSource; + if (firstToWrite < 0) + { + firstToWrite = index; + } + + var previous = scan; + scan = null; + try + { + if (index + 1 < results.Length) + { + scan = previous.Edited(newSource); + } + } + catch (Exception) + { + // Left for the next patch to lex whole, which is what it used to do. A scan + // that could not be carried is no reason to fail a patch that has applied + } + finally + { + previous.Dispose(); + } + } + } + finally + { + scan?.Dispose(); + } + + return firstToWrite; + } + /// /// Writes the patched source through a temporary file beside it and swaps that in, so the file /// on disk is either what it was or what the patch made it and never half of either. diff --git a/src/DiffEngine/Inline/InlinePatcher.cs b/src/DiffEngine/Inline/InlinePatcher.cs index 4bf1b9b8..52396975 100644 --- a/src/DiffEngine/Inline/InlinePatcher.cs +++ b/src/DiffEngine/Inline/InlinePatcher.cs @@ -122,13 +122,36 @@ public static PatchStatus TryApply( out string newSource, out string failReason) { - newSource = ""; - failReason = ""; - var eol = DetectEol(source); - var lineStarts = BuildLineStarts(source); // Everything that reads the scan does so before this returns, the searches that are // enumerated lazily included, so its map goes back to the pool on the way out using var scan = language.Scan(source); + return TryApply(scan, lineHint, mode, originalExpression, originalValue, memberName, entryPoints, anchorOnly, newContent, out newSource, out failReason); + } + + /// + /// The same, over source that has been lexed already. For a caller with more than one thing + /// to ask of the same text: a probe of each call site in a file, or a batch, which carries + /// the scan from each patch to the next (). + /// + public static PatchStatus TryApply( + SourceScan scan, + int lineHint, + InlinePatchMode mode, + string? originalExpression, + string? originalValue, + string? memberName, + string[]? entryPoints, + bool anchorOnly, + string newContent, + out string newSource, + out string failReason) + { + newSource = ""; + failReason = ""; + var language = scan.Language; + var source = scan.Source; + var eol = scan.Eol; + var lineStarts = scan.LineStarts; var memberLine = MemberLine(source, scan, lineStarts, lineHint, memberName); if (mode == InlinePatchMode.Remove) @@ -136,13 +159,15 @@ public static PatchStatus TryApply( return TryRemove(language, source, scan, lineStarts, lineHint, memberLine, EntryPoints(entryPoints), originalExpression, originalValue, eol, ref newSource, ref failReason); } - var fileUnit = DetectIndentUnit(source, scan, lineStarts); - if (mode == InlinePatchMode.Append) { - return TryAppend(source, scan, lineStarts, lineHint, memberLine, EntryPoints(entryPoints), anchorOnly, newContent, eol, fileUnit, ref newSource, ref failReason); + // Not asked for a probe, which writes nothing + var appendUnit = anchorOnly ? "" : scan.IndentUnit; + return TryAppend(source, scan, lineStarts, lineHint, memberLine, EntryPoints(entryPoints), anchorOnly, newContent, eol, appendUnit, ref newSource, ref failReason); } + var fileUnit = scan.IndentUnit; + if (!string.IsNullOrEmpty(originalExpression)) { // Located by content: the Snapshot call whose expected argument is still the text the @@ -2212,123 +2237,9 @@ static string Splice(string source, int start, int end, string replacement) => .ToString(); #endif - static string DetectEol(string source) - { - var crlf = 0; - var lf = 0; - for (var index = 0; index < source.Length; index++) - { - if (source[index] != '\n') - { - continue; - } - - if (index > 0 && source[index - 1] == '\r') - { - crlf++; - } - else - { - lf++; - } - } - - if (crlf >= lf && crlf > 0) - { - return "\r\n"; - } - - if (lf > 0) - { - return "\n"; - } - - return Environment.NewLine; - } - /// - /// What one level of indentation is made of in this file: the most common run of whitespace a - /// line adds to the one above it. - /// - /// Read off the source rather than taken from a convention, because a splice has to match the - /// code it lands in, and files disagree with their repo's settings often enough - vendored, - /// generated, or last edited by someone configured differently - that following the convention - /// would make the patch look more out of place, not less. It answers the one question a single - /// call site cannot: a line shows which characters it is indented with, but not how wide a - /// level is, and hard coding four spaces is wrong in every two space repo. - /// - /// Returns "" when the file is too small to show a step, which leaves the choice to - /// . - /// - static string DetectIndentUnit(string source, SourceScan scan, List lineStarts) - { - Dictionary counts = new(StringComparer.Ordinal); - var previous = ""; - foreach (var lineStart in lineStarts) - { - // Inside a comment or a literal the leading whitespace is content, not indentation. - // A snapshot literal in particular is arbitrary text, and counting its lines would - // measure the snapshot rather than the file - if (!scan.IsCode(lineStart)) - { - continue; - } - - var index = lineStart; - while (index < source.Length && - (source[index] == ' ' || source[index] == '\t')) - { - index++; - } - - // A blank line has no indentation of its own, and must not break the run either - if (index >= source.Length || - source[index] == '\r' || - source[index] == '\n') - { - continue; - } - - var lead = source.Substring(lineStart, index - lineStart); - // Only a line that indents further than the one above, by adding to what it already - // had. Anything else is a dedent, or whitespace of a different kind, and neither - // measures a step - if (lead.Length > previous.Length && - lead.StartsWith(previous, StringComparison.Ordinal)) - { - var step = lead.Substring(previous.Length); - counts.TryGetValue(step, out var count); - counts[step] = count + 1; - } - - previous = lead; - } - - var best = ""; - var bestCount = 0; - foreach (var pair in counts) - { - if (bestCount == 0 || - pair.Value > bestCount || - pair.Value == bestCount && Closer(pair.Key, best)) - { - best = pair.Key; - bestCount = pair.Value; - } - } - - return best; - - // A tie goes to the shorter step, since a longer one is two levels taken at once, and - // then to ordinal order so the answer cannot depend on enumeration order - static bool Closer(string candidate, string current) => - candidate.Length == current.Length - ? string.CompareOrdinal(candidate, current) < 0 - : candidate.Length < current.Length; - } - - /// - /// One level of indentation for a splice at a site indented with . + /// One level of indentation for a splice at a site indented with , + /// given the file's own (). /// /// The character comes from the site and the width from the file, so a file that indents /// inconsistently still gets a splice consistent with its own surroundings, while a file that @@ -2365,20 +2276,6 @@ static string NormalizeTo(string value, string eol) => .Replace('\r', '\n') .Replace("\n", eol); - static List BuildLineStarts(string source) - { - List starts = [0]; - for (var index = 0; index < source.Length; index++) - { - if (source[index] == '\n' && index + 1 < source.Length) - { - starts.Add(index + 1); - } - } - - return starts; - } - static int LineOf(List lineStarts, int offset) { var low = 0; diff --git a/src/DiffEngine/Inline/SourceLanguage.cs b/src/DiffEngine/Inline/SourceLanguage.cs index 1ea83a0e..f7fa7087 100644 --- a/src/DiffEngine/Inline/SourceLanguage.cs +++ b/src/DiffEngine/Inline/SourceLanguage.cs @@ -63,7 +63,19 @@ public static SourceLanguage ForFile(string path) /// /// Lexes into the map every search then reads. /// - internal abstract SourceScan Scan(string source); + internal SourceScan Scan(string source) + { + var scan = new SourceScan(this, source); + Lex(scan, 0); + return scan; + } + + /// + /// Fills a scan's map from on, which is the start of the source or a + /// line start it has as code, up to the end or to where the scan says the rest is known + /// (). + /// + internal abstract void Lex(SourceScan scan, int from); internal abstract bool IsIdentifierChar(char ch); diff --git a/src/DiffEngine/Inline/SourceScan.cs b/src/DiffEngine/Inline/SourceScan.cs index b6e38785..4b57405b 100644 --- a/src/DiffEngine/Inline/SourceScan.cs +++ b/src/DiffEngine/Inline/SourceScan.cs @@ -86,6 +86,429 @@ public void AddSkip(int start, int end, bool comment) skipped.AsSpan(start, end - start).Fill(true); } + /// + /// The scan this one is being made from, while it is, and how much longer this source is than + /// that one's. See . + /// + SourceScan? before; + + int growth; + + /// + /// The first offset at which the lexer may be told the rest is known: just past the edit, for + /// a scan being made from another, and never for one lexed whole. + /// + public int RejoinFrom { get; private set; } = int.MaxValue; + + /// + /// The scan of this source after an edit, made from this one and not by lexing the whole of + /// again. + /// + /// A batch applies each patch to what the one before it left, so the file was lexed again for + /// every patch, start to end, to find the handful of spans one literal changed. What a lexer + /// makes of a line depends on the text before it only through whether the line starts inside + /// a comment or a literal, and on the text after it not at all once a span has closed. So the + /// spans before the edit are kept, lexing starts again at the line the edit begins on, and it + /// stops at the first line start past the edit that both this scan and the new one take as + /// code (): from there on the two read the same text from the same + /// state, and the rest of this scan's spans are the new one's, moved by the change in length. + /// + /// + /// One thing does look across a line break from in front of it, which is a backslash: C#'s + /// char and string scans step over the character after one, and F#'s char literal reads the + /// one after that. So a line that follows a backslash is not started from, and the line + /// before it is. SourceScanTests holds the result to a scan of the whole text, over + /// edits made at random. + /// + /// + /// This scan is still whole afterwards, and still the caller's to dispose. + /// + /// + public SourceScan Edited(string edited) + { + var limit = Math.Min(Source.Length, edited.Length); + var prefix = CommonPrefix(Source, edited, limit); + var suffix = CommonSuffix(Source, edited, limit - prefix); + var restart = RestartFor(prefix); + var next = new SourceScan(Language, edited); + + // About as many spans as there were, so the lists are sized once and not as they grow + next.starts.Capacity = starts.Count + 16; + next.ends.Capacity = starts.Count + 16; + next.comments.Capacity = starts.Count + 16; + var kept = LowerBound(starts, restart); + for (var index = 0; index < kept; index++) + { + next.starts.Add(starts[index]); + next.ends.Add(ends[index]); + next.comments.Add(comments[index]); + } + + Array.Copy(skipped, next.skipped, restart); + next.before = this; + next.growth = edited.Length - Source.Length; + // Strictly past the edit, so the line break in front of the offset is one both texts have + next.RejoinFrom = edited.Length - suffix + 1; + Language.Lex(next, restart); + next.before = null; + next.RejoinFrom = int.MaxValue; + + if (lineStarts is not null) + { + next.lineStarts = EditedLineStarts(lineStarts, edited, prefix, edited.Length - suffix, next.growth); + } + + return next; + } + + /// + /// Where lexing starts again for an edit that begins at : the start + /// of its line, or of an earlier one where that start is inside a comment or a literal, or + /// follows a backslash. + /// + int RestartFor(int offset) + { + var restart = offset; + while (restart > 0) + { + restart = Source.LastIndexOf('\n', restart - 1) + 1; + if (restart == 0) + { + break; + } + + // The last span to start before the line does. The line starts inside it when it ends + // past there, and when it ran to the end of the source, which is where a comment or + // a literal that was never closed ends: anything added there is inside it too + var span = LowerBound(starts, restart) - 1; + if (span >= 0 && + (ends[span] > restart || ends[span] == Source.Length)) + { + // Back to where that span starts, and then to the start of its line + restart = starts[span]; + continue; + } + + if (restart < 2 || + Source[restart - 2] != '\\') + { + break; + } + + restart--; + } + + return restart; + } + + /// + /// Asked by a lexer at the top of its loop, once it is at or past : + /// whether everything from on is as the scan this one is made from + /// has it. Where it is, the rest of that scan's spans are taken and the lexer is done. + /// + public bool TryRejoin(int index) + { + if (before is null || + Source[index - 1] != '\n') + { + return false; + } + + var from = index - growth; + if (before.skipped[from]) + { + return false; + } + + for (var span = LowerBound(before.starts, from); span < before.starts.Count; span++) + { + starts.Add(before.starts[span] + growth); + ends.Add(before.ends[span] + growth); + comments.Add(before.comments[span]); + } + + Array.Copy(before.skipped, from, skipped, index, before.Source.Length - from); + return true; + } + + static List EditedLineStarts(List old, string edited, int prefix, int editEnd, int growth) + { + var found = new List(old.Count + 8); + // The lines that start before the edit, which the line breaks in front of it decide + var index = 0; + for (; index < old.Count && old[index] < Math.Max(prefix, 1); index++) + { + found.Add(old[index]); + } + + // Those a line break in the edit, or the one in front of it, starts + var search = Math.Max(prefix - 1, 0); + while (search < editEnd) + { + search = edited.IndexOf('\n', search, editEnd - search); + if (search < 0 || + search + 1 >= edited.Length) + { + break; + } + + search++; + found.Add(search); + } + + // And those past it, moved + index = LowerBound(old, editEnd - growth + 1); + for (; index < old.Count; index++) + { + found.Add(old[index] + growth); + } + + return found; + } + + /// + /// The index of the first value not less than in a sorted list. + /// + static int LowerBound(List sorted, int value) + { + var low = 0; + var high = sorted.Count; + while (low < high) + { + var middle = (low + high) / 2; + if (sorted[middle] < value) + { + low = middle + 1; + } + else + { + high = middle; + } + } + + return low; + } + + // Compared a block at a time, which is vectorised on every framework this targets, and then + // a character at a time within the block that differs + const int block = 4096; + + static int CommonPrefix(string left, string right, int limit) + { + var index = 0; + while (index + block <= limit && + left.AsSpan(index, block).SequenceEqual(right.AsSpan(index, block))) + { + index += block; + } + + while (index < limit && + left[index] == right[index]) + { + index++; + } + + return index; + } + + static int CommonSuffix(string left, string right, int limit) + { + var count = 0; + while (count + block <= limit && + left.AsSpan(left.Length - count - block, block).SequenceEqual(right.AsSpan(right.Length - count - block, block))) + { + count += block; + } + + while (count < limit && + left[left.Length - count - 1] == right[right.Length - count - 1]) + { + count++; + } + + return count; + } + + List? lineStarts; + string? eol; + string? indentUnit; + + /// + /// The offset each line starts at. A line break that ends the source starts no line. + /// + /// Kept here, with and , because they are facts + /// about the same text the map is of, and a scan that is carried from one patch to the next + /// carries them with it. Each is worked out when first asked, since a search that finds + /// nothing to write needs only the first. + /// + /// + public List LineStarts => lineStarts ??= BuildLineStarts(); + + List BuildLineStarts() + { + List found = [0]; + var index = 0; + while (true) + { + index = Source.IndexOf('\n', index); + if (index < 0 || + index + 1 >= Source.Length) + { + return found; + } + + index++; + found.Add(index); + } + } + + /// + /// The line break most of the file's lines end in, a tie going to \r\n, and the + /// platform's own for a file with none. + /// + public string Eol => eol ??= DetectEol(); + + string DetectEol() + { + var crlf = 0; + var lf = 0; + var starts = LineStarts; + // Every line but the first starts after a line break, and the last line may end in one + // that starts nothing + for (var line = 1; line <= starts.Count; line++) + { + var end = line < starts.Count ? starts[line] : Source.Length; + if (end == 0 || + Source[end - 1] != '\n') + { + continue; + } + + if (end > 1 && Source[end - 2] == '\r') + { + crlf++; + } + else + { + lf++; + } + } + + if (crlf >= lf && crlf > 0) + { + return "\r\n"; + } + + if (lf > 0) + { + return "\n"; + } + + return Environment.NewLine; + } + + /// + /// What one level of indentation is made of in this file: the most common run of whitespace a + /// line adds to the one above it. + /// + /// Read off the source rather than taken from a convention, because a splice has to match the + /// code it lands in, and files disagree with their repo's settings often enough - vendored, + /// generated, or last edited by someone configured differently - that following the convention + /// would make the patch look more out of place, not less. It answers the one question a single + /// call site cannot: a line shows which characters it is indented with, but not how wide a + /// level is, and hard coding four spaces is wrong in every two space repo. + /// + /// + /// "" when the file is too small to show a step, which leaves the choice to whoever asked. + /// + /// + public string IndentUnit => indentUnit ??= DetectIndentUnit(); + + string DetectIndentUnit() + { + // Counted without a string a line: this is asked once a patch, of every line of the file, + // and a file shows two or three different steps at most + List<(string Step, int Count)> counts = []; + var previousStart = 0; + var previousLength = 0; + foreach (var lineStart in LineStarts) + { + // Inside a comment or a literal the leading whitespace is content, not indentation. + // A snapshot literal in particular is arbitrary text, and counting its lines would + // measure the snapshot rather than the file + if (!IsCode(lineStart)) + { + continue; + } + + var index = lineStart; + while (index < Source.Length && + (Source[index] == ' ' || Source[index] == '\t')) + { + index++; + } + + // A blank line has no indentation of its own, and must not break the run either + if (index >= Source.Length || + Source[index] == '\r' || + Source[index] == '\n') + { + continue; + } + + var length = index - lineStart; + // Only a line that indents further than the one above, by adding to what it already + // had. Anything else is a dedent, or whitespace of a different kind, and neither + // measures a step + if (length > previousLength && + string.CompareOrdinal(Source, lineStart, Source, previousStart, previousLength) == 0) + { + Count(counts, lineStart + previousLength, length - previousLength); + } + + previousStart = lineStart; + previousLength = length; + } + + var best = ""; + var bestCount = 0; + foreach (var (step, count) in counts) + { + if (bestCount == 0 || + count > bestCount || + count == bestCount && Closer(step, best)) + { + best = step; + bestCount = count; + } + } + + return best; + + // A tie goes to the shorter step, since a longer one is two levels taken at once, and + // then to ordinal order so the answer cannot depend on the order they were met in + static bool Closer(string candidate, string current) => + candidate.Length == current.Length + ? string.CompareOrdinal(candidate, current) < 0 + : candidate.Length < current.Length; + } + + void Count(List<(string Step, int Count)> counts, int start, int length) + { + for (var index = 0; index < counts.Count; index++) + { + var (step, count) = counts[index]; + if (step.Length == length && + string.CompareOrdinal(Source, start, step, 0, length) == 0) + { + counts[index] = (step, count + 1); + return; + } + } + + counts.Add((Source.Substring(start, length), 1)); + } + /// /// True when the offset is outside every comment, string and char literal. /// From 8933661d30ad76ea13ebf2c505bf74b2554d42fd Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:28:46 +1100 Subject: [PATCH 40/50] Answer a dry run from the last reading of a file that has not changed A test run asks CanAnchor once for each call site it has not seen before, and each asking took the file's lock and mutex and read, decoded and lexed the whole file: 0.7 s for the five hundred call sites of a 600 KB file, to be told five hundred things about the same text. A dry run writes nothing, so what one read stands for as long as the file does. The applier now keeps the scan a dry run made, for up to four files, under the file's length and write time, and CanAnchor and CanApply are answered from it while those are unchanged, with no lock taken. A write time cannot tell a second write inside the same tick of the file system's clock, so a file is kept only when it had been left alone for three seconds when it was read. One being edited, or one an accept has just written, is read every time, as before. Checked by ASecondProbeOfAFileDoesNotReadItAgain, which holds the file open with nothing shared and fails without the change, AProbeReadsAFileThatHasChangedSinceTheLast and AProbeOfAFileJustWrittenIsNotKept in InlineApplierTests. InlineAcceptBenchmarks.AnchorEach, on a machine busy with other builds: 25 call sites 5.3 ms, 3.5 MB -> 1.3 ms, 0.08 MB 500 call sites 833.5 ms, 1,303 MB -> 50.8 ms, 1.6 MB The benchmark's file is now dated a minute back, as a source file is by the time a run asks about it. --- .../InlineAcceptBenchmarks.cs | 5 +- .../InlineApplierBatchTests.cs | 2 +- src/DiffEngine.Tests/InlineApplierTests.cs | 103 +++++++ src/DiffEngine/Inline/InlineApplier.cs | 271 +++++++++++++++--- 4 files changed, 338 insertions(+), 43 deletions(-) diff --git a/src/DiffEngine.Benchmarks/InlineAcceptBenchmarks.cs b/src/DiffEngine.Benchmarks/InlineAcceptBenchmarks.cs index 2f34dce4..2aa88e1d 100644 --- a/src/DiffEngine.Benchmarks/InlineAcceptBenchmarks.cs +++ b/src/DiffEngine.Benchmarks/InlineAcceptBenchmarks.cs @@ -39,6 +39,9 @@ public void Setup() source = text; pristine = new UTF8Encoding(false).GetBytes(text); File.WriteAllBytes(path, pristine); + // As a source file is when a test run asks about it: written at the last save, and not + // in the last few seconds, which is the file a probe keeps what it read of + File.SetLastWriteTimeUtc(path, DateTime.UtcNow.AddMinutes(-1)); patches = new InlinePatch[CallSites]; appends = new InlinePatch[CallSites]; for (var index = 0; index < CallSites; index++) @@ -120,7 +123,7 @@ public int PatchInMemory() { var current = source; var results = new InlineApplyResult[patches.Length]; - InlineApplier.PatchInTurn(SourceLanguage.CSharp, ref current, patches, true, false, path, results); + InlineApplier.PatchInTurn(SourceLanguage.CSharp, ref current, patches, path, results); return Every(results.Count(_ => _.Status == InlineApplyStatus.Applied)); } diff --git a/src/DiffEngine.Tests/InlineApplierBatchTests.cs b/src/DiffEngine.Tests/InlineApplierBatchTests.cs index e71efa40..31dddb16 100644 --- a/src/DiffEngine.Tests/InlineApplierBatchTests.cs +++ b/src/DiffEngine.Tests/InlineApplierBatchTests.cs @@ -234,7 +234,7 @@ public async Task ACarriedScanTellsEachPatchWhatLexingAgainWould(string extensio var carried = source; var results = new InlineApplyResult[patches.Count]; - InlineApplier.PatchInTurn(language, ref carried, patches, true, false, path, results); + InlineApplier.PatchInTurn(language, ref carried, patches, path, results); var lexedAgain = source; for (var index = 0; index < patches.Count; index++) diff --git a/src/DiffEngine.Tests/InlineApplierTests.cs b/src/DiffEngine.Tests/InlineApplierTests.cs index 5050746c..294d5d2c 100644 --- a/src/DiffEngine.Tests/InlineApplierTests.cs +++ b/src/DiffEngine.Tests/InlineApplierTests.cs @@ -970,6 +970,109 @@ public async Task CanAnchorOnAMissingFileFails() await Assert.That(result.Status).IsEqualTo(InlineApplyStatus.Failed); } + const string twoCallSites = + """ + class C + { + void First() => Verify(first); + void Other() => Verify(other).Snapshot("old"); + } + """; + + /// + /// A run asks once for each call site, and each asking read and lexed the whole file. The + /// file is held open here with nothing shared, so a second asking that reads it fails to: + /// what it is told comes from the first one's reading. CanApply is a dry run too. + /// + [Test] + public async Task ASecondProbeOfAFileDoesNotReadItAgain() + { + var path = WriteTemp(Utf8(twoCallSites, bom: false)); + try + { + // As a source file is by the time a run asks: not written in the last few seconds + File.SetLastWriteTimeUtc(path, DateTime.UtcNow.AddMinutes(-1)); + + var first = InlineApplier.CanAnchor(Append(path)); + InlineApplyResult second; + InlineApplyResult set; + using (new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None)) + { + second = InlineApplier.CanAnchor(Patch(path, 4, null, "new", InlinePatchMode.Append)); + set = InlineApplier.CanApply(Patch(path, 4, "\"old\"", "new")); + } + + await Assert.That(first.Status).IsEqualTo(InlineApplyStatus.Applied); + await Assert.That(second.Status).IsEqualTo(InlineApplyStatus.Applied); + await Assert.That(set.Status).IsEqualTo(InlineApplyStatus.Applied); + } + finally + { + File.Delete(path); + } + } + + /// + /// What was read stands only while the file does. The same length written at another time is + /// another file, and so is one an accept has just written. + /// + [Test] + public async Task AProbeReadsAFileThatHasChangedSinceTheLast() + { + var path = WriteTemp(Utf8(twoCallSites, bom: false)); + try + { + File.SetLastWriteTimeUtc(path, DateTime.UtcNow.AddMinutes(-2)); + var set = Patch(path, 4, "\"old\"", "new"); + var before = InlineApplier.CanApply(set); + + // The same length, so only the time says it is not the file that was read + await File.WriteAllTextAsync(path, twoCallSites.Replace("\"old\"", "\"new\"")); + File.SetLastWriteTimeUtc(path, DateTime.UtcNow.AddMinutes(-1)); + var after = InlineApplier.CanApply(set); + + var applied = InlineApplier.Apply(Patch(path, 3, null, "appended", InlinePatchMode.Append)); + var anchored = InlineApplier.CanApply(Patch(path, 3, null, "appended", InlinePatchMode.Append)); + + await Assert.That(before.Status).IsEqualTo(InlineApplyStatus.Applied); + await Assert.That(after.Status).IsEqualTo(InlineApplyStatus.AlreadyApplied); + await Assert.That(applied.Status).IsEqualTo(InlineApplyStatus.Applied); + await Assert.That(anchored.Status).IsEqualTo(InlineApplyStatus.AlreadyApplied); + } + finally + { + File.Delete(path); + } + } + + /// + /// A file written a moment ago is not kept: a second write inside the same tick of the file + /// system's clock leaves it the same length with the same time, which is arranged here. So + /// the second asking reads it, and is told about what it now holds. + /// + [Test] + public async Task AProbeOfAFileJustWrittenIsNotKept() + { + var path = WriteTemp(Utf8(twoCallSites, bom: false)); + try + { + var written = File.GetLastWriteTimeUtc(path); + var set = Patch(path, 4, "\"old\"", "new"); + var before = InlineApplier.CanApply(set); + + await File.WriteAllTextAsync(path, twoCallSites.Replace("\"old\"", "\"new\"")); + File.SetLastWriteTimeUtc(path, written); + var after = InlineApplier.CanApply(set); + + await Assert.That(before.Status).IsEqualTo(InlineApplyStatus.Applied); + await Assert.That(after.Status).IsEqualTo(InlineApplyStatus.AlreadyApplied); + } + finally + { + File.Delete(path); + } + } + static InlinePatch Append(string path) => Patch(path, 3, null, "new", InlinePatchMode.Append); diff --git a/src/DiffEngine/Inline/InlineApplier.cs b/src/DiffEngine/Inline/InlineApplier.cs index 33d2f417..e5369e3b 100644 --- a/src/DiffEngine/Inline/InlineApplier.cs +++ b/src/DiffEngine/Inline/InlineApplier.cs @@ -176,6 +176,14 @@ static bool TryResolve(InlinePatch patch, out string fullPath, [NotNullWhen(fals static InlineApplyResult[] Run(string fullPath, IReadOnlyList patches, bool write, bool anchorOnly, Action replace) { var normalizedPath = fullPath.ToLowerInvariant(); + // A dry run of a file an earlier one read, and nothing has written since, is answered + // from what was read then, with no lock: there is nothing here for one to protect + if (!write && + Probed.Find(normalizedPath, fullPath) is { } lexed) + { + return Judge(lexed, patches, anchorOnly, fullPath); + } + lock (gates.GetOrAdd(normalizedPath, static _ => new())) { // Answered rather than thrown, as everything else here is. A mutex this process may @@ -210,7 +218,7 @@ static InlineApplyResult[] Run(string fullPath, IReadOnlyList patch return All(patches, InlineApplyResult.Failed($"Timed out waiting for the inline patch mutex for: {fullPath}")); } - return LockedApply(fullPath, patches, write, anchorOnly, replace); + return LockedApply(fullPath, normalizedPath, patches, write, anchorOnly, replace); } finally { @@ -233,7 +241,7 @@ static InlineApplyResult[] All(IReadOnlyList patches, InlineApplyRe return results; } - static InlineApplyResult[] LockedApply(string fullPath, IReadOnlyList patches, bool write, bool anchorOnly, Action replace) + static InlineApplyResult[] LockedApply(string fullPath, string normalizedPath, IReadOnlyList patches, bool write, bool anchorOnly, Action replace) { // Asked here rather than before the lock, because the swap at the end of this method takes // the path away for the instant it takes to rename over it. Asked outside, an applier @@ -244,6 +252,8 @@ static InlineApplyResult[] LockedApply(string fullPath, IReadOnlyList /// /// The language the source is in. - /// The source, replaced by each patch that edits when writing. + /// The source, replaced by each patch that edits. /// The patches, in the order they are to be applied. - /// False for a dry run, where every patch is asked of the same source. - /// Whether only a call site is being asked for. /// The file, for a failure to name. /// Filled with an outcome for each patch. internal static int PatchInTurn( SourceLanguage language, ref string source, IReadOnlyList patches, - bool write, - bool anchorOnly, string fullPath, InlineApplyResult[] results) { @@ -351,49 +379,18 @@ internal static int PatchInTurn( { for (var index = 0; index < results.Length; index++) { - var patch = patches[index]; - PatchStatus status; - string newSource; - string failReason; try { scan ??= language.Scan(source); - status = InlinePatcher.TryApply( - scan, - patch.LineHint, - patch.Mode, - patch.OriginalExpression, - patch.OriginalValue, - patch.MemberName, - patch.EntryPoints, - anchorOnly, - SourceLanguage.NormalizeNewlines(patch.NewContent), - out newSource, - out failReason); } catch (Exception exception) { - // A patcher defect on some shape of source, reported against the file it met - // it in rather than thrown at whichever surface was accepting results[index] = InlineApplyResult.Failed($"Failed to patch: {fullPath}", exception); continue; } - switch (status) - { - case PatchStatus.AlreadyApplied: - results[index] = InlineApplyResult.AlreadyApplied; - continue; - case PatchStatus.NotFound: - results[index] = InlineApplyResult.NotFound(failReason); - continue; - } - - // Every reason a patch can be refused for has been asked by this point and none - // of them held. All that remains is the write, which is the one step a dry run - // may not take - results[index] = InlineApplyResult.Applied; - if (!write) + results[index] = Judge(scan, patches[index], false, fullPath, out var newSource); + if (results[index].Status != InlineApplyStatus.Applied) { continue; } @@ -434,6 +431,198 @@ internal static int PatchInTurn( return firstToWrite; } + /// + /// What the patcher makes of one patch, over source that has been lexed, as the outcome a + /// caller is given. is the edited source where the outcome is + /// Applied, which is all a dry run wanted to know and what a write has still to carry out. + /// + static InlineApplyResult Judge(SourceScan scan, InlinePatch patch, bool anchorOnly, string fullPath, out string newSource) + { + PatchStatus status; + string failReason; + try + { + status = InlinePatcher.TryApply( + scan, + patch.LineHint, + patch.Mode, + patch.OriginalExpression, + patch.OriginalValue, + patch.MemberName, + patch.EntryPoints, + anchorOnly, + SourceLanguage.NormalizeNewlines(patch.NewContent), + out newSource, + out failReason); + } + catch (Exception exception) + { + // A patcher defect on some shape of source, reported against the file it met it in + // rather than thrown at whichever surface was accepting + newSource = ""; + return InlineApplyResult.Failed($"Failed to patch: {fullPath}", exception); + } + + // Every reason a patch can be refused for has been asked by this point. For one that + // none of them held for, all that remains is the write, which is the one step a dry run + // may not take + return status switch + { + PatchStatus.AlreadyApplied => InlineApplyResult.AlreadyApplied, + PatchStatus.NotFound => InlineApplyResult.NotFound(failReason), + _ => InlineApplyResult.Applied + }; + } + + /// + /// A dry run: every patch asked of the same source, which none of them changes. + /// + static InlineApplyResult[] Judge(SourceScan scan, IReadOnlyList patches, bool anchorOnly, string fullPath) + { + var results = new InlineApplyResult[patches.Count]; + for (var index = 0; index < results.Length; index++) + { + results[index] = Judge(scan, patches[index], anchorOnly, fullPath, out _); + } + + return results; + } + + /// + /// The source files a dry run has read, lexed, for the next dry run of the same file. + /// + /// A test run asks once for each call site it has not seen before, + /// and each asking read, decoded and lexed the whole file: 0.7 s for the five hundred call + /// sites of a 600 KB file, to be told five hundred things about the same text. Nothing is + /// written by a dry run, so what one read stands for as long as the file does, and the file's + /// length and write time say whether it has. + /// + /// + /// A write time says nothing about a second write inside the same tick of the file system's + /// clock, which is two seconds on some. So only a file that had been left alone for longer + /// than that when it was read is kept: any write after the read then has a later time. A + /// file being edited is read each time, as it was. + /// + /// + /// A few files, since a run goes through its source files a class at a time and tests run + /// side by side. A scan that is dropped is left to the collector and not disposed, because + /// another thread may be part way through asking it something. + /// + /// + static class Probed + { + const int capacity = 4; + + static readonly TimeSpan settled = TimeSpan.FromSeconds(3); + + static readonly List entries = []; + + static long uses; + + sealed class Entry(string path, (long Length, DateTime Written) stamp, SourceScan scan) + { + public string Path => path; + public (long Length, DateTime Written) Stamp => stamp; + public SourceScan Scan => scan; + public long Used; + } + + /// + /// What tells one state of a file from the next, or null for a file that cannot be asked. + /// + public static (long Length, DateTime Written)? Stamp(string fullPath) + { + try + { + var info = new FileInfo(fullPath); + if (!info.Exists) + { + return null; + } + + return (info.Length, info.LastWriteTimeUtc); + } + catch (Exception exception) + when (exception is IOException or UnauthorizedAccessException) + { + return null; + } + } + + /// + /// The scan kept for a file, where the file is still as it was when that was read. + /// + public static SourceScan? Find(string normalizedPath, string fullPath) + { + Entry? entry; + lock (entries) + { + entry = entries.Find(_ => _.Path == normalizedPath); + } + + if (entry is null) + { + return null; + } + + // Asked outside the lock, since it is the file system that answers + var stamp = Stamp(fullPath); + lock (entries) + { + if (stamp is null || + stamp.Value != entry.Stamp) + { + entries.Remove(entry); + return null; + } + + entry.Used = ++uses; + return entry.Scan; + } + } + + /// + /// Keeps a scan of a file that was read while it looked like . + /// False when it is not kept, and is still the caller's to dispose. + /// + public static bool Keep(string normalizedPath, string fullPath, (long Length, DateTime Written) stamp, SourceScan scan) + { + // Written too recently to tell a later write by its time, written since it was read, + // or dated in the future, which the same test refuses + if (DateTime.UtcNow - stamp.Written < settled || + Stamp(fullPath) is not { } after || + after != stamp) + { + return false; + } + + // Asked for here, so nothing about the scan changes once other threads can see it + _ = scan.Eol; + _ = scan.IndentUnit; + lock (entries) + { + entries.RemoveAll(_ => _.Path == normalizedPath); + if (entries.Count >= capacity) + { + var oldest = 0; + for (var index = 1; index < entries.Count; index++) + { + if (entries[index].Used < entries[oldest].Used) + { + oldest = index; + } + } + + entries.RemoveAt(oldest); + } + + entries.Add(new(normalizedPath, stamp, scan) { Used = ++uses }); + } + + return true; + } + } + /// /// Writes the patched source through a temporary file beside it and swaps that in, so the file /// on disk is either what it was or what the patch made it and never half of either. From ff1b8e1735865455d9ef0de3db714bd0a4443689 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:29:45 +1100 Subject: [PATCH 41/50] Tell a patch that needed no write what is true of the file when a batch's write fails A batch's one write that failed failed every patch from the first edit on, whatever each had been judged to be, because what they were judged against was never written. That is right for a patch that edited, and for one that was already applied only because an earlier patch in the batch had written its literal. It is not right for one whose snapshot was in the source all along, which stayed queued as a failure, or for one whose call site was never there, which was not told to re-run. A patch from the first edit on that made no edit is now asked again of the file as it was read, which is the file as it still is. Already applied or not found there is what it is told. Where it would have had to edit that file, it reports the write as the others do. A patch judged before the first edit keeps its answer, as it did. The file's mutex is still held from the read to the write: that is what one read and one write are, and the patching between them is shorter than it was. Checked by AWriteThatFailsLeavesAPatchThatDidNotNeedItItsOwnAnswer in InlineApplierBatchTests, which was five failures before the change, and by AWriteThatFailsFailsEveryPatchItCarried, unchanged. --- .../InlineApplierBatchTests.cs | 29 +++++++ src/DiffEngine/Inline/InlineApplier.cs | 78 ++++++++++++++++--- 2 files changed, 96 insertions(+), 11 deletions(-) diff --git a/src/DiffEngine.Tests/InlineApplierBatchTests.cs b/src/DiffEngine.Tests/InlineApplierBatchTests.cs index 31dddb16..7bc31b18 100644 --- a/src/DiffEngine.Tests/InlineApplierBatchTests.cs +++ b/src/DiffEngine.Tests/InlineApplierBatchTests.cs @@ -134,6 +134,35 @@ public async Task AWriteThatFailsFailsEveryPatchItCarried() await Assert.That(Directory.GetFileSystemEntries(file.Root)).IsEquivalentTo([file.FullName]); } + /// + /// A patch after the first edit that made no edit of its own is told what is true of the file + /// as it still is, and not that the write failed: its snapshot was in the source all along, + /// or its call site was never there. They used to report the write with the rest, so the + /// first stayed queued as a failure and the second was not told to re-run. The duplicate + /// still reports the write, since the literal it found was one the write was carrying. + /// + [Test] + public async Task AWriteThatFailsLeavesAPatchThatDidNotNeedItItsOwnAnswer() + { + using var file = new TempSource(Members(4)); + var before = file.Text; + + var results = InlineApplier.ApplyAll( + [ + Set(file.FullName, 0), + Set(file.FullName, 2, anchor: "\"not in the source\""), + Set(file.FullName, 1, content: "old 1"), + Set(file.FullName, 0), + Set(file.FullName, 3) + ], + (_, _) => throw new IOException("The process cannot access the file.")); + + await Assert.That(Statuses(results)).IsEqualTo("Failed, NotFound, AlreadyApplied, Failed, Failed"); + await Assert.That(results[1].Message!).Contains("Re-run the test"); + await Assert.That(results[3].Message!).Contains("Failed to write"); + await Assert.That(file.Text).IsEqualTo(before); + } + /// /// A batch in which nothing applies writes nothing, as a single patch that is already applied /// writes nothing: the file an editor has open is not touched for no reason. diff --git a/src/DiffEngine/Inline/InlineApplier.cs b/src/DiffEngine/Inline/InlineApplier.cs index e5369e3b..140bacb1 100644 --- a/src/DiffEngine/Inline/InlineApplier.cs +++ b/src/DiffEngine/Inline/InlineApplier.cs @@ -36,9 +36,10 @@ public static InlineApplyResult Apply(InlinePatch patch) => /// each edit after that (). /// /// - /// So a write that fails fails every patch it was carrying, and each says so. The patches - /// after the first of those say so too, whatever they were judged to be, because what they - /// were judged against was never written. The file is left as it was. + /// So a write that fails fails every patch it was carrying, and each says so. A patch after + /// the first of those that made no edit was judged against source that was never written, so + /// it is asked again of the file as it was read, and says the write failed only where it would + /// have had to edit that. The file is left as it was. /// /// public static IReadOnlyList ApplyAll(IReadOnlyList patches) => @@ -307,6 +308,7 @@ static InlineApplyResult[] LockedApply(string fullPath, string normalizedPath, I } var results = new InlineApplyResult[patches.Count]; + var read = source; var firstToWrite = PatchInTurn(language, ref source, patches, fullPath, results); if (firstToWrite < 0) { @@ -333,19 +335,73 @@ static InlineApplyResult[] LockedApply(string fullPath, string normalizedPath, I } catch (Exception exception) { - // Nothing from the first edit on reached the file, and every answer after it was about - // source that held that edit: one already applied only because an earlier patch here - // had written the same literal, one not found only because an earlier patch had taken - // its anchor. So they all report the write, and an entry that reports a failure is - // kept for another try - var failed = InlineApplyResult.Failed($"Failed to write: {fullPath}", exception); + AfterAFailedWrite( + language, + read, + patches, + fullPath, + results, + firstToWrite, + InlineApplyResult.Failed($"Failed to write: {fullPath}", exception)); + } + + return results; + } + + /// + /// What each patch from the first edit on is told when the one write failed. + /// + /// Nothing from that edit on reached the file, and every answer after it was about source + /// that held it: one already applied only because an earlier patch here had written the same + /// literal, one not found only because an earlier patch had taken its anchor. So a patch that + /// edited reports the write, and an entry that reports a failure is kept for another try. + /// + /// + /// One that made no edit is asked again, of the file as it was read, which is the file as it + /// still is. Already applied there, or not found there, is true whatever became of the write + /// and is what it is told: they all used to report the write, so a snapshot that was in the + /// source all along stayed queued as a failure, and one whose call site had gone was not + /// told to re-run. Where it would have had to edit that file, it needed the write as much as + /// the others, and reports it. + /// + /// + static void AfterAFailedWrite( + SourceLanguage language, + string read, + IReadOnlyList patches, + string fullPath, + InlineApplyResult[] results, + int firstToWrite, + InlineApplyResult failed) + { + SourceScan? scan = null; + try + { + for (var index = firstToWrite; index < results.Length; index++) + { + if (results[index].Status == InlineApplyStatus.Applied) + { + results[index] = failed; + continue; + } + + scan ??= language.Scan(read); + var asRead = Judge(scan, patches[index], false, fullPath, out _); + results[index] = asRead.Status == InlineApplyStatus.Applied ? failed : asRead; + } + } + catch (Exception) + { + // The source could not be lexed again, which leaves the write as all there is to say for (var index = firstToWrite; index < results.Length; index++) { results[index] = failed; } } - - return results; + finally + { + scan?.Dispose(); + } } /// From aa7dd451de45e07ddecf1050a7f63c3436463639 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:54:37 +1100 Subject: [PATCH 42/50] Give a held letter one command in the Linux head, unless it is navigation A key held past the repeat delay is reported again at the keyboard's repeat rate, and the Linux head acted on every one of them for a letter, as it does for an arrow. A held a accepted the entry on screen and then every one that took its place, into source, none of them read. The WinForms head gives what changes the queue a press each for that reason. Which commands go on while their key is held is now asked in one place, Repeats: scrolling and paging, next and previous change, the next variant, the pages of a document and zooming in and out. Everything else acts once: accept, accept all, discard, quit, the two toggles, the next projection and zoom reset, with Home, End, Tab and Escape, which already did. A chord with Control is still never repeated. Checked in the ubuntu:24.04 container under Xvfb, with xdotool holding a key for a second and a half over a queue of three pairs, against a build of the shim that says which keys it hands over. Before: Down, n, m and ] 23 each, and a three times, which was the whole queue accepted. After: Down, n and ] 23 each, m once, and a once with two pairs still pending. No test in the repository can press a key in the shim: input is behind the C ABI. --- native/src/deview.cpp | 57 +++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/native/src/deview.cpp b/native/src/deview.cpp index 0d683521..35615ee4 100644 --- a/native/src/deview.cpp +++ b/native/src/deview.cpp @@ -2240,9 +2240,40 @@ unsigned int LetterOf(const State::KeyPress& press) return 0; } -/* What one key press asks for, or none: a key this head has no use for, or a repeat of one that - * acts once however long it is held. */ -int KeyOf(const State::KeyPress& press) +/* + * Whether a command goes on for as long as its key is held, at the rate the window system repeats + * a key: the ones that move through what is being read, and no other. + * + * A letter repeated like an arrow. A held a accepted the entry on screen and then every one that + * took its place, into source, none of them read, and a held d discarded them. The WinForms head + * gives what changes the queue a press each for that reason. Here the rest of what is not + * navigation acts once as well: a held m, r or j is the view flipping thirty times a second, and + * there is nothing more for a held q or 0 to do. + */ +bool Repeats(int key) +{ + switch (key) + { + case DEVIEW_KEY_SCROLL_UP: + case DEVIEW_KEY_SCROLL_DOWN: + case DEVIEW_KEY_PAGE_UP: + case DEVIEW_KEY_PAGE_DOWN: + case DEVIEW_KEY_NEXT_CHANGE: + case DEVIEW_KEY_PREVIOUS_CHANGE: + case DEVIEW_KEY_NEXT_VARIANT: + case DEVIEW_KEY_PREVIOUS_PAGE: + case DEVIEW_KEY_NEXT_PAGE: + case DEVIEW_KEY_ZOOM_IN: + case DEVIEW_KEY_ZOOM_OUT: + return true; + default: + return false; + } +} + +/* What a key going down asks for, or none for a key this head has no use for, whether it is the + * press or one of its repeats: see KeyOf. */ +int Pressed(const State::KeyPress& press) { const unsigned int letter = LetterOf(press); @@ -2319,24 +2350,12 @@ int KeyOf(const State::KeyPress& press) } } - /* The arrows and paging go on for as long as they are held, at the rate the window system - * repeats a key: one row a press was all a held arrow scrolled. */ switch (press.key) { case KEY_UP: return DEVIEW_KEY_SCROLL_UP; case KEY_DOWN: return DEVIEW_KEY_SCROLL_DOWN; case KEY_PAGE_UP: return DEVIEW_KEY_PAGE_UP; case KEY_PAGE_DOWN: return DEVIEW_KEY_PAGE_DOWN; - default: break; - } - - if (press.repeated) - { - return DEVIEW_KEY_NONE; - } - - switch (press.key) - { case KEY_HOME: return DEVIEW_KEY_HOME; case KEY_END: return DEVIEW_KEY_END; case KEY_TAB: return shift ? DEVIEW_KEY_PREVIOUS_ITEM : DEVIEW_KEY_NEXT_ITEM; @@ -2345,6 +2364,14 @@ int KeyOf(const State::KeyPress& press) } } +/* What one key press asks for, or none: a key this head has no use for, or a repeat of one that + * acts once however long it is held. */ +int KeyOf(const State::KeyPress& press) +{ + const int key = Pressed(press); + return press.repeated && !Repeats(key) ? DEVIEW_KEY_NONE : key; +} + /* * The next key waiting that asks for anything, and whether it was Escape. One a poll: the rest * wait for the polls after it, which is what keeps two keys pressed between two polls both acted From 949f9f83ec696e70b0fd31c462e15b6373dc1388 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 09:57:44 +1100 Subject: [PATCH 43/50] Declare the vertex offset in a capture's ImGui context, as the window's does deview_capture makes a context of its own for its one frame, and that context did not say the renderer applies a draw command's vertex offset, which the window's context says and RenderTriangles does. Without it ImGui lets one draw list grow past what a sixteen bit index can address, the indices wrap, and the capture comes out scrambled. Checked in the ubuntu:24.04 container with a capture made for it: two panes of 220 character lines at 3840 by 2160, 53,124 characters in the rows on screen. Before, the rows stop at line 46 and the ones above have their colours on the wrong lines; after, all 114 rows are there. No scene in PixelTests is that large, and all nineteen Linux baselines are the same files byte for byte with the flag declared. --- native/src/deview.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/native/src/deview.cpp b/native/src/deview.cpp index 35615ee4..ea069e34 100644 --- a/native/src/deview.cpp +++ b/native/src/deview.cpp @@ -4433,6 +4433,10 @@ int32_t deview_capture(const DeviewScreen* screen, int32_t width, int32_t height ImGui::SetCurrentContext(capture); ImGuiIO& io = ImGui::GetIO(); io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures; + /* As the window's context declares it, and for its reason: both are drawn by RenderTriangles. + * Without it a capture of more than 65,535 vertices in one draw list, which dense text at 4K + * comes to, had its indices wrap, and came out scrambled. */ + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; io.IniFilename = nullptr; io.LogFilename = nullptr; ApplyStyle(); From 17d6153ee03b238695412f63ce1fc27763f6d3dc Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:06:52 +1100 Subject: [PATCH 44/50] Test that the Linux head leaves a window alone when nothing happens to it Nothing in DiffEngineViewer.Tests failed if deview_present went back to drawing every frame: a capture draws one frame into a texture and cannot tell, and NativeIdleBenchmarks, which shows it in its Drawn column, is run by hand. PixelTests.AWindowLeftAloneIsNotDrawn shows the shared window, presents one screen a second at a time, and asks OpenGL after each present whether anything was drawn, by the primitives generated, as NativeHead in the benchmarks does. It passes once a second goes by with nothing drawn, and fails after thirty seconds without one. It also asserts that the first second after the window is shown did draw, or the count would be of nothing. It waits for a quiet second rather than asserting which second is quiet, so a slow runner or the window system asking for the window again does not fail it. In the ubuntu:24.04 container, set up as the unix job is, it passed 25 times of 25 pinned to two processors with DOTNET_PROCESSOR_COUNT=2, in about two and a half seconds each. Against a build of the shim altered to build and draw every frame it fails, after its thirty seconds. --- src/DiffEngineViewer.Tests/PixelTests.cs | 105 +++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/src/DiffEngineViewer.Tests/PixelTests.cs b/src/DiffEngineViewer.Tests/PixelTests.cs index b933809e..6c40b876 100644 --- a/src/DiffEngineViewer.Tests/PixelTests.cs +++ b/src/DiffEngineViewer.Tests/PixelTests.cs @@ -551,6 +551,111 @@ public async Task PresentWaitsForTheNextFrame() await Assert.That(elapsed).IsGreaterThan(TimeSpan.FromMilliseconds(750)); } + /// + /// A window nothing is happening to is left alone: the Linux head builds no frame for it and + /// draws nothing into it, where it used to draw the frame already there sixty times a second, + /// which under a software rasteriser was more than half a core for a viewer left open. Nothing + /// a capture does can tell the two apart, so this is asked of the window itself, shown for + /// as long as the test takes: the same screen is presented a second at a time until a second + /// goes by in which nothing was drawn. + /// + /// A second, and not the first one. The frame after a window is shown is drawn, and the head + /// goes on building frames for a second after anything changes before it leaves a window + /// alone, so the first second draws and a later one does not. Which later one is not asserted: + /// the window system may ask for the window again, and a runner may be slow. A head that has + /// gone back to drawing every frame never has such a second. + /// + /// + [Test] + [PixelTest] + [NotInParallel(nameof(PixelTests), Order = 21)] + [SkipOnMac("A capture host never creates the macOS window, and the counts are asked of OpenGL, which that head does not draw with.")] + public async Task AWindowLeftAloneIsNotDrawn() + { + var screen = ScreenBuilder.Build(ViewerSession.Resize(Fixtures.File(), columns, rows)); + var (first, rested) = await OnShimThread( + () => + { + window!.SetHidden(false); + try + { + var first = Drawn(60, screen); + var watch = Stopwatch.StartNew(); + var rested = false; + while (!rested && + watch.Elapsed < TimeSpan.FromSeconds(30)) + { + rested = Drawn(60, screen) == 0; + } + + return (first, rested); + } + finally + { + window.SetHidden(true); + } + }); + + // Or the count is of nothing, and a second with none drawn says nothing either + await Assert.That(first).IsGreaterThan(0); + await Assert.That(rested).IsTrue(); + } + + static uint drawnQuery; + + /// + /// How many of so many presents, of the screens given in turn, put anything on the screen. + /// Asked of OpenGL, as NativeHead in the benchmarks asks it: the primitives generated + /// between the start of a present and its end are the triangles the shim submitted, whichever + /// rasteriser then filled them, and a present that generated none drew nothing. On the shim's + /// thread, which is the one the GL context belongs to. + /// + static int Drawn(int presents, params Screen[] screens) + { + if (drawnQuery == 0) + { + Gl.GenQueries(1, out drawnQuery); + } + + var drawn = 0; + for (var present = 0; present < presents; present++) + { + Gl.BeginQuery(Gl.PrimitivesGenerated, drawnQuery); + window!.Present(screens[present % screens.Length]); + Gl.EndQuery(Gl.PrimitivesGenerated); + Gl.GetQueryObject(drawnQuery, Gl.QueryResult, out var primitives); + if (primitives > 0) + { + drawn++; + } + } + + return drawn; + } + + /// + /// The four OpenGL calls a query takes, from the library the shim's own context came from. + /// + static class Gl + { + const string library = "libGL.so.1"; + + public const uint PrimitivesGenerated = 0x8C87; + public const uint QueryResult = 0x8866; + + [DllImport(library, EntryPoint = "glGenQueries")] + public static extern void GenQueries(int count, out uint id); + + [DllImport(library, EntryPoint = "glBeginQuery")] + public static extern void BeginQuery(uint target, uint id); + + [DllImport(library, EntryPoint = "glEndQuery")] + public static extern void EndQuery(uint target); + + [DllImport(library, EntryPoint = "glGetQueryObjectuiv")] + public static extern void GetQueryObject(uint id, uint name, out uint value); + } + static async Task Capture(SessionState state, int gridRows = rows) { var screen = ScreenBuilder.Build(ViewerSession.Resize(state, columns, gridRows)); From bb3c9cedf848501a1858f87c08a315a316222475 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:07:09 +1100 Subject: [PATCH 45/50] Build and draw nothing for a hidden window in the Linux head deview_present left an unchanged window alone, but a hidden one whose screen changed was still built and drawn, and a viewer hidden behind a tray is handed another screen by every arrival in its queue: the whole queue laid out and the whole window filled, for a window nobody can see. A hidden window now ends its turn after taking in what arrived: decoded pictures and found fonts are still taken, the screen is still kept as the last one handed over, and the fonts for the characters it holds are still asked for, so they are there by the time it is shown. Showing it marks it stale and is itself an arrival, so the first present after it builds and draws the screen it is handed. A window that has never had a frame built is built once wherever it is, since the grid the managed side slices by is measured from a frame and ImGui has no font to measure with before its first. PixelTests.AHiddenWindowIsNotDrawn presents two screens in turn to the hidden window sixty times and asks OpenGL how many presents drew: sixty before, none now, and one for the first present after it is shown. Checked further in the ubuntu:24.04 container by photographing the window off the X server: handed a queue and then pictures while hidden, it shows each when shown or focused, the same pixels as when they were presented to it on screen, and its other sixteen photographs are those of the shim before. OutsideTheFont still has the machine's fonts merged while it presents to the hidden window, two of them in the container, which is what it is about. All nineteen Linux baselines are the same files byte for byte. --- native/src/deview.cpp | 30 ++++++++++++++++- src/DiffEngineViewer.Tests/PixelTests.cs | 43 ++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/native/src/deview.cpp b/native/src/deview.cpp index ea069e34..90048245 100644 --- a/native/src/deview.cpp +++ b/native/src/deview.cpp @@ -4272,10 +4272,38 @@ int32_t deview_present(const DeviewScreen* screen) bool arrived = TakeDecoded(); /* And its fonts, for that reason and because a font can only be added between frames. */ arrived = TakeFonts() || arrived; - arrived = Changed(screen) || arrived; + const bool changed = Changed(screen); + arrived = changed || arrived; arrived = Arrived() || arrived; arrived = arrived || state.tooltipDue; + /* + * A hidden window is not built for and not drawn into, whatever has arrived. It was, each time + * its screen changed, and a viewer hidden behind a tray is handed another screen by every + * arrival in its queue: the whole queue laid out and the whole window filled, for nobody. + * + * What arrived has still been taken in, above, and the fonts for what the screen holds are + * still asked for, so that they are there by the time it is shown. Showing it is itself an + * arrival, and marks the window stale, so the first present after it builds the screen it is + * handed and draws it: see deview_set_hidden and Arrived. + * + * Not before a frame has been built for the window at all. The grid the managed side slices + * its rows by is measured from one, and ImGui has no font to measure with until its first. + */ + if (state.hidden && + state.cellWidth > 0.0f) + { + if (changed) + { + FindFontsFor(screen); + } + + Rest(); + MeasureGrid(); + TrackPlacement(); + return 1; + } + /* * A window nothing is happening to is left alone: no frame is built, and nothing is drawn. * It used to be built, drawn and put on the screen sixty times a second, each one the frame diff --git a/src/DiffEngineViewer.Tests/PixelTests.cs b/src/DiffEngineViewer.Tests/PixelTests.cs index 6c40b876..b91b101a 100644 --- a/src/DiffEngineViewer.Tests/PixelTests.cs +++ b/src/DiffEngineViewer.Tests/PixelTests.cs @@ -601,6 +601,49 @@ public async Task AWindowLeftAloneIsNotDrawn() await Assert.That(rested).IsTrue(); } + /// + /// A hidden window is handed another screen by every arrival in its queue, and the Linux head + /// built and drew each of them into a window nobody could see. Hidden, it now draws none, + /// however the screen changes, and the first present after it is shown draws the screen it is + /// handed. That what it draws then is the right screen is not something a count can say: it + /// was photographed off the X server when this was changed. + /// + [Test] + [PixelTest] + [NotInParallel(nameof(PixelTests), Order = 22)] + [SkipOnMac("A capture host never creates the macOS window, and the counts are asked of OpenGL, which that head does not draw with.")] + public async Task AHiddenWindowIsNotDrawn() + { + var screen = ScreenBuilder.Build(ViewerSession.Resize(Fixtures.File(), columns, rows)); + // The same frame twice, told apart by its status line, so that every present is of a + // screen that is not the one before it + Screen[] screens = + [ + screen with {Status = "tick"}, + screen with {Status = "tock"} + ]; + var (hidden, shown) = await OnShimThread( + () => + { + // A window's first frame is built wherever the window is, and this test may be + // the first to present anything + window!.Present(screen); + var hidden = Drawn(60, screens); + window.SetHidden(false); + try + { + return (hidden, Drawn(1, screens[0])); + } + finally + { + window.SetHidden(true); + } + }); + + await Assert.That(hidden).IsEqualTo(0); + await Assert.That(shown).IsEqualTo(1); + } + static uint drawnQuery; /// From f5ad63e4eab65d218094124ed016cdd34ce24af9 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:10:48 +1100 Subject: [PATCH 46/50] Read [ ] 0 - and = by position on a layout with no Latin letters The Linux head reads a key by the character it types, and falls back to where the key is for the letters on a layout that types none of them. The five keys that are not letters had no such fallback. Russian and Arabic type letters of their own from the keys a US keyboard has [ and ] on, so the pages of a document had no key there, and Persian types its own digits, so zoom reset had none. Those five are now read as what a US keyboard has in their place when the key typed something outside ASCII and the layout has no key that types any of a to z unshifted. Only then: a German keyboard types u with a diaeresis where [ is and a French one a with a grave where 0 is, and both have the character itself elsewhere, so neither is given a command for a letter of its own language. Checked in the ubuntu:24.04 container under Xvfb with setxkbmap and xdotool, against a build of the shim that says which keys it hands over. Russian: the keys for ha and the hard sign gave nothing and now give previous and next page, and - = 0 still zoom as they did. Persian: its zero gave nothing and now resets the zoom, and jeem and tcheh turn the page. German u with a diaeresis and French a with a grave still give nothing, and German + still zooms in. No test in the repository can press a key in the shim. --- native/src/deview.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/native/src/deview.cpp b/native/src/deview.cpp index 90048245..056fda3d 100644 --- a/native/src/deview.cpp +++ b/native/src/deview.cpp @@ -2193,6 +2193,22 @@ bool LayoutTypes(unsigned int letter) return false; } +/* Whether the layout in use has a key that types any of the letters a to z, unshifted. */ +bool LayoutIsLatin() +{ + for (int key = KEY_APOSTROPHE; key <= 162; key++) + { + const unsigned int typed = OnlyCharacter(glfwGetKeyName(key, 0)); + if (typed >= 'a' && + typed <= 'z') + { + return true; + } + } + + return false; +} + /* * Which character a key press is to be read as, in lower case, or zero for none. * @@ -2237,6 +2253,27 @@ unsigned int LetterOf(const State::KeyPress& press) } } + /* + * And the five keys that are not letters, on a layout with no Latin letters at all: Russian + * and Arabic type letters of their own where a US keyboard has [ and ], so a paged document + * had no key for its pages there, and Persian types its own digits, so zoom had no key to + * put it back. Only on such a layout. A German keyboard types u with a diaeresis from the + * key where [ is and has [ somewhere else, and reading it by position would give a letter + * of its user's own language a command. + */ + if (!LayoutIsLatin()) + { + switch (press.key) + { + case KEY_LEFT_BRACKET: return '['; + case KEY_RIGHT_BRACKET: return ']'; + case KEY_ZERO: return '0'; + case KEY_MINUS: return '-'; + case KEY_EQUAL: return '='; + default: break; + } + } + return 0; } From d0cc73f7968404e16dd00fcce3fdb24253716cb7 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:22:06 +1100 Subject: [PATCH 47/50] Sample a picture near its own size without choosing among its reduced copies, and make those only for a picture drawn small A frame of two pictures cost about a tenth more under llvmpipe since pictures were given reduced copies, and the guess was the trilinear sampling of a picture drawn under half its size. It was not: the 4K benchmark fits its pictures at 0.99 of their size, where nothing is sampled trilinearly. The cause is raylib's SetTextureFilter, which for any texture that has reduced copies makes "bilinear" GL_LINEAR_MIPMAP_NEAREST: which copy to read is worked out for every pixel drawn, and at that size the answer is always the picture itself. A build that makes no reduced copies at all showed it, 27.1 ms against 30.4. The filters are now set directly. From three quarters of its size up a picture is sampled with GL_LINEAR, which never asks. Under half it is trilinear, as before. Between the two it is still GL_LINEAR_MIPMAP_NEAREST, kept as its own case, because under about seven tenths that draws from the half size copy, in which a grid of one pixel lines is even: photographed both ways at two thirds of its size, GL_LINEAR alone leaves some of the lines dark and some faint. Three quarters rather than seven tenths so the change of filter is clear of the size where GL's own answer changes, and every picture is the pixels it was. A texture is now made with reduced copies only for a picture drawn at under three quarters of its size, which is known when it is asked for. One that comes to be drawn that small later, in a window made narrower, is decoded again with them on the decoder's thread while the texture it has goes on being drawn, and swapped when it lands, so no frame waits for them. A capture makes them there and then. In the ubuntu:24.04 container, llvmpipe on four threads, NativeFrameBenchmarks with 30 iterations, before and after run in turn twice: OpaquePictures at 3840x2160 29.7 and 30.4 ms before, 27.1 and 27.4 after (CPU 101 ms to 91); TranslucentPictures 37.0 to 33.6 and 34.2; both unchanged at 1100x700, where the pictures are under a third of their size. Two opaque pictures 2400 square in a 4K window add 49 MB to the process where they added 94; two 3600 square, drawn under three quarters, add 154 as before. Pixels: all nineteen Linux baselines are the same files byte for byte, as are the 179 captures of the earlier round's picture scenes, at every zoom step. A window photographed off the X server at 1900, 1500 and 1100 pixels wide, made narrower in two steps and opened afresh at each, shows the same pixels as the shim before at all five, which a build with no reduced copies does not. --- native/src/deview.cpp | 223 +++++++++++++++++++++++++++++++++--------- 1 file changed, 178 insertions(+), 45 deletions(-) diff --git a/native/src/deview.cpp b/native/src/deview.cpp index 056fda3d..315e17f3 100644 --- a/native/src/deview.cpp +++ b/native/src/deview.cpp @@ -217,18 +217,31 @@ struct CachedTexture /* Some of it can be seen through, so it is drawn over a checkerboard: see SeeThrough. */ bool translucent = false; + + /* + * A texture is made with reduced copies of the picture only for a picture that is drawn at + * under three quarters of its size, which is the only one sampled from them (see WantsCopies): + * they are a third again of a picture's memory, and a picture that is no larger than its pane + * is never drawn that small. One that comes to be, in a + * window made smaller, is decoded a second time with them while the texture it has goes on + * being drawn, which is what `reducing` says is on its way. And `unreducible` is a picture + * that came back from that without them, which is not asked again. See Reduce. + */ + bool reducing = false; + bool unreducible = false; }; /* - * One picture to decode, or decoded: the path, the stamp the decode was asked for, and once it is - * done the pixels, which are empty when raylib could not read the file, and whether any of them - * can be seen through. + * One picture to decode, or decoded: the path, the stamp the decode was asked for, whether its + * reduced copies are wanted with it, and once it is done the pixels, which are empty when raylib + * could not read the file, and whether any of them can be seen through. */ struct Decode { std::string path; std::uintmax_t length = 0; std::filesystem::file_time_type written{}; + bool reduced = false; Image image{}; bool translucent = false; }; @@ -893,7 +906,7 @@ char RowMarker(int kind) /* ---- pictures ---- */ /* - * The three ways a picture's texture is sampled, by the size it is drawn at. + * The four ways a picture's texture is sampled, by the size it is drawn at. * * Smoothed between its own pixels, which is all a picture drawn at its own size or a little under * needs. As the pixels it has, once it is enlarged past its own size, which is what zooming that @@ -904,10 +917,54 @@ char RowMarker(int kind) * them, and its small text came apart. The reduced copies are each half the size of the one * before, every pixel of them an average of the ones it stands for, so a thin line is fainter * there and not gone. + * + * And from whichever one of those copies is nearest in size, between half its size and three + * quarters. Under about seven tenths that is the half size copy, in which a grid of one pixel + * lines is even, where smoothed between its own pixels at two thirds of its size some of its lines + * are dark and some faint. From seven tenths up it is the picture itself, and the same pixels as + * smoothed. + * + * The last is what raylib makes of "bilinear" for any texture that has reduced copies, and every + * picture not under half its size was sampled that way, at its own size as well. Which copy is + * worked out for every pixel drawn, and where the answer is always the picture itself that was a + * tenth of a frame of two pictures under a software rasteriser, for nothing. So smoothed is set + * here by the filters themselves, and is asked for from three quarters up: clear of the seven + * tenths where the answer changes, so what is drawn is what was drawn at every size. */ constexpr int sampleSmoothed = 0; constexpr int sampleAsPixels = 1; constexpr int sampleReduced = 2; +constexpr int sampleNearestCopy = 3; + +/* Whether a picture drawn so wide is sampled from its reduced copies, either way, and so wants a + * texture that has them: under three quarters of the width it has. */ +bool WantsCopies(float drawnWidth, float ownWidth) +{ + return drawnWidth * 4.0f < ownWidth * 3.0f; +} + +int SamplingOf(float drawnWidth, float ownWidth, bool enlarged) +{ + return enlarged && drawnWidth >= ownWidth ? sampleAsPixels : + drawnWidth * 2.0f < ownWidth ? sampleReduced : + WantsCopies(drawnWidth, ownWidth) ? sampleNearestCopy : + sampleSmoothed; +} + +void Filter(const Texture2D& texture, int sampling) +{ + rlTextureParameters( + texture.id, + RL_TEXTURE_MIN_FILTER, + sampling == sampleAsPixels ? RL_TEXTURE_FILTER_NEAREST : + sampling == sampleReduced ? RL_TEXTURE_FILTER_MIP_LINEAR : + sampling == sampleNearestCopy ? RL_TEXTURE_FILTER_LINEAR_MIP_NEAREST : + RL_TEXTURE_FILTER_LINEAR); + rlTextureParameters( + texture.id, + RL_TEXTURE_MAG_FILTER, + sampling == sampleAsPixels ? RL_TEXTURE_FILTER_NEAREST : RL_TEXTURE_FILTER_LINEAR); +} /* * How a picture's texture is sampled as it is made: smoothed. Clamped at its edges rather than @@ -917,13 +974,14 @@ constexpr int sampleReduced = 2; */ void PrepareTexture(CachedTexture& entry) { - SetTextureFilter(entry.texture, TEXTURE_FILTER_BILINEAR); + Filter(entry.texture, sampleSmoothed); SetTextureWrap(entry.texture, TEXTURE_WRAP_CLAMP); entry.sampling = sampleSmoothed; } /* Changed only when it has to be, since it is a texture parameter and this is asked every - * frame. A picture whose reduced copies could not be made is smoothed instead. */ + * frame. A picture whose reduced copies could not be made, or have yet to land, is smoothed + * instead. */ void Sample(const std::string& path, int sampling) { const auto found = state.pictures.find(path); @@ -934,7 +992,7 @@ void Sample(const std::string& path, int sampling) } CachedTexture& entry = found->second; - if (sampling == sampleReduced && + if ((sampling == sampleReduced || sampling == sampleNearestCopy) && entry.texture.mipmaps <= 1) { sampling = sampleSmoothed; @@ -945,11 +1003,7 @@ void Sample(const std::string& path, int sampling) return; } - SetTextureFilter( - entry.texture, - sampling == sampleAsPixels ? TEXTURE_FILTER_POINT : - sampling == sampleReduced ? TEXTURE_FILTER_TRILINEAR : - TEXTURE_FILTER_BILINEAR); + Filter(entry.texture, sampling); entry.sampling = sampling; } @@ -1042,16 +1096,17 @@ bool SeeThrough(const Image& image) /* * A picture read off the disk and made ready to be a texture: whether any of it can be seen - * through, and its reduced copies, which are made here because here is off the window's thread - * for every picture but a capture's. The file, stb_image and raylib's resampling, and nothing - * that touches GL. A picture no texture can hold is left as it was read, since nothing will be - * made of it. + * through, and its reduced copies where they are wanted, which are made here because here is off + * the window's thread for every picture but a capture's. The file, stb_image and raylib's + * resampling, and nothing that touches GL. A picture no texture can hold is left as it was read, + * since nothing will be made of it. */ -Image ReadPicture(const std::string& path, int textureLimit, bool& translucent) +Image ReadPicture(const std::string& path, int textureLimit, bool reduced, bool& translucent) { Image image = LoadImage(path.c_str()); translucent = SeeThrough(image); - if (image.data != nullptr && + if (reduced && + image.data != nullptr && FitsATexture(image, textureLimit)) { ImageMipmaps(&image); @@ -1086,6 +1141,31 @@ bool MakeTexture(const Image& image, bool translucent, CachedTexture& entry) return true; } +/* + * Puts a texture with reduced copies in the place of the one a picture has, from the picture read + * a second time with them. One that came back without them, or that no texture could be made of, + * leaves the picture with the texture it had, smoothed, and is not asked for again. + */ +bool ReplaceTexture(const Image& image, bool translucent, CachedTexture& entry) +{ + CachedTexture made; + if (image.mipmaps <= 1 || + !MakeTexture(image, translucent, made)) + { + entry.unreducible = true; + return false; + } + + UnloadTexture(entry.texture); + entry.texture = made.texture; + entry.translucent = made.translucent; + entry.sampling = made.sampling; + + /* Another texture behind the picture, which may have been given the name of the last. */ + state.stale = true; + return true; +} + void DecodeLoop(std::shared_ptr decoder) { std::unique_lock lock(decoder->mutex); @@ -1101,7 +1181,7 @@ void DecodeLoop(std::shared_ptr decoder) decoder->requests.pop_front(); lock.unlock(); - decode.image = ReadPicture(decode.path, decoder->textureLimit, decode.translucent); + decode.image = ReadPicture(decode.path, decoder->textureLimit, decode.reduced, decode.translucent); lock.lock(); if (decoder->stopping) @@ -1114,7 +1194,7 @@ void DecodeLoop(std::shared_ptr decoder) } } -void RequestDecode(const std::string& path, std::uintmax_t length, std::filesystem::file_time_type written) +void RequestDecode(const std::string& path, std::uintmax_t length, std::filesystem::file_time_type written, bool reduced) { if (!state.decoder) { @@ -1129,6 +1209,7 @@ void RequestDecode(const std::string& path, std::uintmax_t length, std::filesyst decode.path = path; decode.length = length; decode.written = written; + decode.reduced = reduced; state.decoder->requests.push_back(std::move(decode)); } @@ -1221,6 +1302,16 @@ bool TakeDecoded() state.stale = true; } } + else if (found != state.pictures.end() && + found->second.reducing && + /* Not a decode without them that an entry forgotten since had asked for. */ + decode.reduced && + found->second.written == decode.written && + found->second.length == decode.length) + { + found->second.reducing = false; + landed = ReplaceTexture(decode.image, decode.translucent, found->second) || landed; + } UnloadImage(decode.image); } @@ -1241,7 +1332,8 @@ void ForgetPicture(const std::string& path) UnloadTexture(found->second.texture); } - if (found->second.decoding) + if (found->second.decoding || + found->second.reducing) { CancelDecode(path); } @@ -1290,6 +1382,40 @@ bool PicturesRewritten() return false; } +/* + * Asks for the reduced copies of a picture whose texture was made without them, now that a frame + * draws it small enough to want them. Off the window's thread, as the picture was decoded, with + * the texture it has drawn smoothed until they land: making them here would hold the window for + * as long as a large picture takes to be halved over and over. A capture has no later frame for + * them to land in, and makes them there and then, as it decodes. + */ +void Reduce(const std::string& path, CachedTexture& entry) +{ + if (!entry.loaded || + entry.texture.mipmaps > 1 || + entry.unreducible) + { + return; + } + + if (state.capturing) + { + bool translucent = false; + const Image image = ReadPicture(path, TextureLimit(), true, translucent); + ReplaceTexture(image, translucent, entry); + UnloadImage(image); + return; + } + + if (entry.reducing) + { + return; + } + + entry.reducing = true; + RequestDecode(path, entry.length, entry.written, true); +} + /* * The decoded picture for a path, or null when there is none to draw: either this build cannot * read it, or it is still being decoded, which `loading` says so the pane can show that it is coming @@ -1299,8 +1425,11 @@ bool PicturesRewritten() * Invalidated by the file's write time and length, which is the same freshness test the managed * queue poller uses: a re-run that rewrites a received image has to refresh the pane rather than * leave the previous one up. + * + * `reduced` is whether the frame draws it small enough to want its reduced copies: see + * CachedTexture::reducing. */ -const CachedTexture* Picture(const std::string& path, bool& loading) +const CachedTexture* Picture(const std::string& path, bool reduced, bool& loading) { loading = false; if (path.empty()) @@ -1331,6 +1460,11 @@ const CachedTexture* Picture(const std::string& path, bool& loading) !(found->second.decoding && state.capturing)) { found->second.used = true; + if (reduced) + { + Reduce(path, found->second); + } + loading = found->second.decoding; return found->second.loaded ? &found->second : nullptr; } @@ -1346,7 +1480,7 @@ const CachedTexture* Picture(const std::string& path, bool& loading) { /* What the decoder's thread and then TakeDecoded do, here and now. */ bool translucent = false; - const Image image = ReadPicture(path, TextureLimit(), translucent); + const Image image = ReadPicture(path, TextureLimit(), reduced, translucent); MakeTexture(image, translucent, entry); UnloadImage(image); } @@ -1354,7 +1488,7 @@ const CachedTexture* Picture(const std::string& path, bool& loading) { entry.decoding = true; loading = true; - RequestDecode(path, length, written); + RequestDecode(path, length, written, reduced); } const auto inserted = state.pictures.emplace(path, entry).first; @@ -1385,7 +1519,8 @@ void ForgetUnusedPictures() UnloadTexture(entry->second.texture); } - if (entry->second.decoding) + if (entry->second.decoding || + entry->second.reducing) { CancelDecode(entry->first); } @@ -2921,20 +3056,6 @@ void DrawPaneImage(const DeviewScreen* screen, const DeviewPane& pane, const Pan return; } - bool loading = false; - const std::string path = Copy(screen, pane.imagePathOffset, pane.imagePathLength); - const CachedTexture* decoded = Picture(path, loading); - if (decoded == nullptr) - { - /* Nothing at all for a picture this build cannot decode: the rows have said what it is. */ - if (loading) - { - DrawSpinner(list, centre, pitch, bounds.width, available); - } - - return; - } - /* * Fitted, and never enlarged past its own size: a snapshot is judged against the pixels it has, * and an eight pixel icon stretched across a pane is an interpolation of them rather than a @@ -2951,6 +3072,23 @@ void DrawPaneImage(const DeviewScreen* screen, const DeviewPane& pane, const Pan const ImVec2 fitted( std::max(1.0f, static_cast(pane.imageWidth) * scale), std::max(1.0f, static_cast(pane.imageHeight) * scale)); + const float drawnWidth = fitted.x * (pane.imageZoom > 1.0f ? pane.imageZoom : 1.0f); + + /* Asked for with its reduced copies only if it is drawn small enough to be sampled from + * them, which is known before it is decoded, from the size the model carries. */ + bool loading = false; + const std::string path = Copy(screen, pane.imagePathOffset, pane.imagePathLength); + const CachedTexture* decoded = Picture(path, WantsCopies(drawnWidth, static_cast(pane.imageWidth)), loading); + if (decoded == nullptr) + { + /* Nothing at all for a picture this build cannot decode: the rows have said what it is. */ + if (loading) + { + DrawSpinner(list, centre, pitch, bounds.width, available); + } + + return; + } /* * Past that only by the reader asking, and then cut off at the edges of the space rather than @@ -2961,13 +3099,8 @@ void DrawPaneImage(const DeviewScreen* screen, const DeviewPane& pane, const Pan ImVec2 size = fitted; ImVec2 uvMin(0.0f, 0.0f); ImVec2 uvMax(1.0f, 1.0f); - const float drawnWidth = fitted.x * (pane.imageZoom > 1.0f ? pane.imageZoom : 1.0f); const float ownWidth = static_cast(decoded->texture.width); - Sample( - path, - pane.imageZoom > 1.0f && drawnWidth >= ownWidth ? sampleAsPixels : - drawnWidth * 2.0f < ownWidth ? sampleReduced : - sampleSmoothed); + Sample(path, SamplingOf(drawnWidth, ownWidth, pane.imageZoom > 1.0f)); if (pane.imageZoom > 1.0f) { const ImVec2 whole(fitted.x * pane.imageZoom, fitted.y * pane.imageZoom); From 8e250019d6a6e50ec723188965f66f25c73c04e8 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:27:27 +1100 Subject: [PATCH 48/50] Draw a picture larger than a texture can be, brought down to one that fits A picture longer on a side than GL_MAX_TEXTURE_SIZE was drawn as nothing in the Linux head, under rows that said what it was. The limit is 16384 under llvmpipe, and a screenshot of the whole of a long page is past it. Such a picture is now resampled as it is read to the largest size of its own shape a texture takes (FitToATexture), each pixel of what is left an average of the ones it stands for, and drawn from that, placed by the size the model carries as any picture is. It happens in ReadPicture, so on the decoder's thread for the window and there and then for a capture, and nowhere else. What it costs, measured in the ubuntu:24.04 container on one thread: the copy is made beside the picture as read, so both are held until it is done. A picture 20,000 square with no alpha channel is 1.2 GB read and 0.8 GB more for the copy, 2.1 s to read and 1.2 s to bring down. One 17,000 by 9,000 with an alpha channel took 0.4 s and 0.9 s, and a screenshot 1,920 by 30,000 took 0.3 s and 0.2 s. Reading is as it was: a picture 16,000 square, which fits, already took the process to 3.7 GB. PixelTests.ImageTooLargeForATexture keeps its picture, 16385 by 512, and its baseline is now that picture drawn, a grey bar across the left pane, where it was an empty pane: looked at before it was approved, and the test fails against the shim before this. The other eighteen Linux baselines are the same files byte for byte. The window was photographed off the X server showing a picture 17,000 by 300 beside one that fits: drawn, where it was not, and its other sixteen still scenes are the pixels they were. --- native/src/deview.cpp | 52 ++++++++++++++---- ...mageTooLargeForATexture.Linux.verified.png | Bin 56813 -> 56845 bytes src/DiffEngineViewer.Tests/PixelTests.cs | 15 +++-- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/native/src/deview.cpp b/native/src/deview.cpp index 315e17f3..2011c588 100644 --- a/native/src/deview.cpp +++ b/native/src/deview.cpp @@ -1010,10 +1010,10 @@ void Sample(const std::string& path, int sampling) /* * The longest side of a texture the window's GL will take, or zero where it would not say. * - * A picture past it cannot be drawn. Handed to GL all the same, it came back as a texture with a - * name and no pixels, which draws as black: a box of it where the picture should be, in place of - * the nothing a picture this head cannot show is drawn as. It is 16384 under Mesa's software - * rasteriser, and a screenshot of the whole of a long page is past that. + * A picture past it cannot be a texture as it is. Handed to GL all the same, it came back as a + * texture with a name and no pixels, which draws as black: a box of it where the picture should + * be. It is 16384 under Mesa's software rasteriser, and a screenshot of the whole of a long page + * is past that. Such a picture is brought down to the limit as it is read: see FitToATexture. * * Asked of GL by name, through GLFW, since rlgl reads this number only to log it. On the thread * that owns the context, once. @@ -1094,17 +1094,48 @@ bool SeeThrough(const Image& image) return false; } +/* + * A picture longer on a side than a texture can be, resampled to the largest size of its own shape + * that a texture can: every pixel of what is left an average of the ones it stands for, as in a + * reduced copy, so a thin line is fainter there and not gone. + * + * It was drawn as nothing, and a screenshot of the whole of a long page is such a picture. What + * the pane then shows is not its pixels, at any zoom: the rows still give the size it has, and + * enlarged far enough it is the pixels of this copy. + * + * On the decoder's thread, for every picture but a capture's, because of what it costs. The copy + * is made beside the picture as it was read, so for as long as that takes both are held: a + * picture 20,000 pixels square with no alpha channel is 1.2 GB read, and 0.8 GB more for a copy + * 16,384 square before the first is given back. Measured where the limit is that, on one thread: + * that picture took 2.1 s to read and 1.2 s more to bring down, one 17,000 by 9,000 with an + * alpha channel 0.4 s and 0.9 s, and a screenshot 1,920 by 30,000 with one 0.3 s and 0.2 s. + */ +void FitToATexture(Image& image, int limit) +{ + if (image.data == nullptr || + FitsATexture(image, limit)) + { + return; + } + + const double factor = static_cast(limit) / static_cast(std::max(image.width, image.height)); + ImageResize( + &image, + std::min(limit, std::max(1, static_cast(std::lround(image.width * factor)))), + std::min(limit, std::max(1, static_cast(std::lround(image.height * factor))))); +} + /* * A picture read off the disk and made ready to be a texture: whether any of it can be seen - * through, and its reduced copies where they are wanted, which are made here because here is off - * the window's thread for every picture but a capture's. The file, stb_image and raylib's - * resampling, and nothing that touches GL. A picture no texture can hold is left as it was read, - * since nothing will be made of it. + * through, brought down to a size a texture can hold if it is past that, and its reduced copies + * where they are wanted. All of it here because here is off the window's thread for every picture + * but a capture's. The file, stb_image and raylib's resampling, and nothing that touches GL. */ Image ReadPicture(const std::string& path, int textureLimit, bool reduced, bool& translucent) { Image image = LoadImage(path.c_str()); translucent = SeeThrough(image); + FitToATexture(image, textureLimit); if (reduced && image.data != nullptr && FitsATexture(image, textureLimit)) @@ -1117,8 +1148,9 @@ Image ReadPicture(const std::string& path, int textureLimit, bool reduced, bool& /* * The texture for a picture that has been read, or false for one there is none for: a file that - * could not be read, a picture longer on a side than a texture can be, or a context that would - * not make one. On the thread that owns the context. + * could not be read, a picture still longer on a side than a texture can be, which is one read + * against another limit than this context's, or a context that would not make one. On the thread + * that owns the context. */ bool MakeTexture(const Image& image, bool translucent, CachedTexture& entry) { diff --git a/src/DiffEngineViewer.Tests/PixelTests.ImageTooLargeForATexture.Linux.verified.png b/src/DiffEngineViewer.Tests/PixelTests.ImageTooLargeForATexture.Linux.verified.png index 86935c0aaf40c2c620bf9cfb0754a8838b1bcb55..cc95c9a74cb9525ef2cb88555e18c5cd947deab1 100644 GIT binary patch delta 8965 zcmZ8{cU%+g(sl|E0wkd*y^4TH7o>?aX$k^1x)6}2QbG?>HlZU3DAEKWiV6?X1f-Xx z2r5-XksdlygY=r0bH4MO=Y7BZV}84{zumjdJ#)=9_evf7Nj*I2EOg+5NJkg|YM;~T z>h9jtyW*}uqjv@Szr|-HFm^NU7w;2K=X;a)Z0wFb2s8ZO5T9r(B|9GK+%9`K*4}#G56ZnPKGM@bI$dL)HgoaziP5A=Su1i6e^_#+pR#dE2geF@(qyVzn$s{f=?hb`Q zt&^HGB@8vgMNCy**MI%o+e`IQuuO*9h;V?WXyQZ@ARzYXsIagwb$1}~r0s4@@+&8C zs6?`mtrV0YdEHckQIpbV9ug8ao%`zFlfc|6P9trrM%-aa{?~;44oTL!D-JX4N%nF& zj}@#I(QlJnopH^#j{-Aq#dUp%>@;AKv9WK?#d`TEtS}`q@BSf2C@SW}x35#KPUd>4 zSy>Uau?l=lMylZH)m(SkKhtpY5l4l*#Q(KA5OE>d+7?HJhLet40#IXCw?fG#{adsD zSwp5YW~{yQ@g?re|ID_g5k1bQjGAx6i1%=RbBtAJ``du>BOyFIBj%Sb)g^m-d#CB$ z!^qP_8Sa*v%6t3VQ{#Udp^E6Ws{+O%B1asfwOhomZwL942YzVe$xNi=<^{c!@>>I< zgDk)P;(n-lw`OZ$IjSMAL~_LY_BxeHjsFy@ZZZX1hTE?W`7a#yd>wbvZj}?J!>f*8 z=>LI@-dp+hokOGdZevgAZ2R56?3zN$(RVb$4?p#Gc9-IQuz!4NONiR79qs>q+sUrc z9Yoz#poIK{h_WPpC(I+|N)G*ojWT&(eGa?E*@brrLp)~@KGpBVuQeE>0k3P% z*g1xMH%G5W-T1F@i__@n=+Hy1%uwv^-Q^lhiGwhmwNl6u?FOMPG22jE4q0Grl3hMeU-s z3y?b%oA~v)Ry{HSIR<2P_O@>M-SpG$`s&^>sDH}X!sAWRW}c$F^7_y4`8X}O(o#T< z!zI7H)dxx83{&+LD!(i&qaUIjo$U9h`(p=om$vz*p?f!s^`@%Q%DVw^uWtv|{sR1E z;V41iLs{8{1hXI}rb5XsswJTl9q)Uw35qZRwOU%fGQFmLKMw>G_yV>Qa~gvY==45G z2EA!cmWnLiWsTQim#Ht+fk^xIuphh(WjC7+M^`NE8bfzj6(WLQM5sB_0Q_xw|avO%JY> zfGOujtuZerY=2bQFjq41S7_j;D=s);@3qZrhtCh*o)J;VsSgg&I9swtdrlJjlZD|H zooZNG$%HqIhXm~5YnmDlD6u9tj2Hdf@|C_H3%jgx{(e~IT~;m!Q1_O;J-awkEpRzd zn!$(LH4}&~e#g*}86Xe}MKE!Cjt5e>^Y!+6Cz`sb$45?&(cAl8Q_Hixb(m~IBFs8{ z;qnJLdF=g{ve9pvTLnGytU>gt`JFY5V+cZ39Wu5ay!z(}!{?D0!g^~`3a3A&x;6~? ztMnMLY%rc(gL}gI`Ldu=I9`+GB;HlD~XqjWp$yY_in@G+%jeTdyNl1@{4?$I&Yh7qf#;)mzvEnh5Ghq#w zZVf)xYDta#)UT5`)MCMLJ4RkDWPN{QAW%ZrV13?|mrcN`>?UiIZT+Lp-L(k-uWnWU zAntC*C2JGua;{j)S)FTiQCvXLEyJnGjKAR4Ni;73-Hd#4p5b% zAscFu-H7*lxV~7l*!IrWVRYK<;r`>7Po8)+f9<9eeaJR8D*=v=kAS^ezA#`wI_R8u zqSM)ki8m3-(P{oNmasyx6s$ALcU!?XdP#`~o&Bq$&-tQd++fBn77f(Rt)nzgjmCnn zhMaaaN4pRFzuOo)jIBESwew0*{v7lT{{T9(%AY#5ZOLO=5kBmF(?Of{us*Av*Ujz1 z<1z=UG*5L^E=#rbR+%>npJW+;{{#m@j}U~HrpD9LbB(@?{nxs)O2F!9_LXS#7cdLD zOakapsE@TF2ix{SLPA418bBl6lmOUMJN4eYMA~z_-cq1o#}kL6+(jahFB1hcF3{7{ zf7S@u-)yP%Thd&C<6fe81^2i(Id?6rtcD@guxUA5=hsXD4IuRJh%(t)cR6Sq6gxXQ zHr5M67#b0#ra0`Ocz+uMv`srZ^y`QTu%vXTZzug;nt7~c1HSZM`Ic8X>xX=EU z2xx-xFwgtwC7ia*Uyqq5rd!oMLluFBJ-V%7_tWk+ZW(YZGjI5AMYQDq7)g|Yw$tu1Wncp~=E3%wN=w%tUP*jeyl(n= zgL$RE2+dR{cj$q!6s*SJc_m*xV}j8PkwSRw!W~8@|rEv>Dmi+BQ#wMQX z;*03IaVIrMT1@!Mw@dfr2A7o9-fBrm_dA52cu1p0p$wu@uq$5`hS&9V#QKwz2! z2hy~vYOf>uOYc#=M6kcqHvP(jDjZskFAA8C=$|+|hoQ=ybINOBErkW{48NB5pH)Pk z_~S!F){v-#U1Gc3tT;?fb~la4HT33Hsu&?~Uz|~%?cS|5NvmylRIiQDbXc z=V$WbmnqESVlYbWeeA>G!#lhtKz0)=vsC|>13=<^*!YhTk!GgdbCwy43U$sD^HA;&G2 z*_o6YpFc3$Q1x+7aXDg>*1FCzmqpufq>Ng=<+dsJ>JKiW8i$9Pat(0Q7bxOb9&=xY zIhW3HE^G^7+Z24TzH}V9^%U*(q*Fwf1}(kZl|WM|vn^;snB3^>?~XoA_6Z4z=kZ?9a&U<{`Ks6?;Ku6%2Z<6g*)+7Y8PE>;@srS(d4gU$Xa%iL;hj4q$fR&(8JV@C zwlYwq3AiXv^5nM{=9WO7hrM->$2^w@d)@+~u>sH>em>$XiE*Ba-1Xsvp;rz)9Hm8?pDm6id_h^-|+I>s6Gu_K% z0n_j5fxpqp%~|#M`B!g=FVJNxAd$rxD|Sr3jQe4}rjC5>CpEOS-O91c%I`1$sY=1| zs``XzxR%m59&Ze;MG_>8wlf#c#|e+@P==PQ!DdzpsX3X$Q`gwGHiWY}!q;Nu=~jTE zy~d;CIrTm)^7EP?cN-$MwFOrFD*gtLlw*DS?hS_eHpYSUtNB^&G4=b=zhs?AED(R= zAvWP7Pa@7KwEx~|UCT;%M~_2cWet8Sl{5bel&$< zHA!Aep_Ju-uUd5$(>0V_7|^DMhX z_1ZOhmkgK2@l`KEogja@M|L!{!bJqjiSM0hh=}1(gohy!<3LcgNuDn>rA4KJqf81r z2wben*M3LsImi#7j!O9*K*q)je&$W8vuz06fe)FqMPT44DDG`DmC@YuF?>3lvBH;s z?7YJ$;>9;akJ-l3{lC1SKrgNu#Tz_n`|-ZggeP~GLPEQoJ8SC+v;c{XfQ?O7A-KXx zz5pLU=G6IybBl+IkdhPzZcrh^uW7g?q3c=-F&I{T^nLBgD@KJ7g#B5<`w|PntT6ta zp4qj-kEMbd2ps9=bD}Y%;-cQIJ5PhA6T)Ao2foBvF!R`gWy!$G(vASxQjQrV8BVlT z$w()>*NRcE3%97_jDkSiyZtTf_cXN1XaY($=PEF1>>kV*7PxIS2QPy}E7OX})aU3+J$R5JW=_(47?<@5=LYI^1wNK8P^}k zf7u;6sR-pbp}XA}71ho`e*A3X#OQDUrz08%&hp|E;Nv;4;)p$r&E6S$8_Pe;Z#WdN zaGNi$uYScM4FviwGnr(o)j+rl|FW6 zY{wCBBdiLFvs+XpbMcZNqwvm1>Pb?hc~D1Y378p01v=`p=IY(hGvcjg)dd0$mcP2l zHoVq8yg9h4R>L&Yx)ae5N=43gg<*0UL)gi)Q~btn<6g&C)8J$mF7}zU$N~+)8|!cb zUUqgcoV<+eKy^ z#0b{!Q2yFI$;0^YB^UPrVq_XUSE5} zqP_|n>)7RpE*SsvR~XMI)I+QhVY9c+(H{L<et~BdzncD!3|S|21d7IU3NqfxZb-Oic#zGhvKj^d2w%xcOwcSe6hLybL}B6prJoP^&~3N0E7`o zgIX5EfH0&07K3vGc~GqO;A9i$0BLid~|2XcTu3Y;el1e5BE^Hi@XX2}}co6z(0wjux0?Y#bqFvao17W!Y@!05Q zc3aW~=l-nIU;9~Kd+J8eQX%F(M~Mu7AnZ9tiG=%>*%nP<{YnXCFGRm=&+JLqc)e0* zBDsfxr!C#;FfZSXJW*Agi`pU1VqBMU6~sgJ(87CM*VHx0$`#t@d^MXJzZ=RFLsg$kV4ahKjkyk&8A zc9w~kG~{!%?^iCwn?iGx(CtZra&H1!+&1=_DN-tCQH#OgiVQ-k<^3Q?If3^(mfQu+ z607e6_?uwG+FCW<;!<6+_GZsVuB1=L-0<06Y|w8BtA}wEYa~TZB1~+Nje$EEh@s^3 z-mK?8=fOJ-V+}Ndx9O(ev69cn0r9?#hg=d*&;CdjBX`}Xh{B*y}lU7tS3GlO#e2glDDE62WMb)4X2jN3s4ppcnO26W4Z?QSzmMyC9?}ktK5$@*X%-0B`=ob_1ei9 z#>A4cy0M;4!GmAgH__tG0JN9Sz797l3U?hryIP|uBr`PG|Matsv$!Bg)w6mgvE@|0 zz7s;?isy~P>u$S!stLqsg=>#v8Oq_k+?rqf+G=}0^&Il|iv*vEUUcnpz zc((nY5u05jWn6f;z|WM5whE4z8?CYoe^a&!H2Lf>u+{bsQG#!^3BRrl zuaH70E4N_O=5;uSVC0`HbYzqaT`7;RX4NPG?Wb!7AAPsMj~B*ZaF-HAnc!6w1~Btb zQ0$qO(h^}4Rt4rmtKOx1Of=p_RPfQ^MFHeh#&ZPtB|GAL95_b*-~ig4!k_P`6+a>F z$8(3yh=8c)=G6d}Rx@{U_Uw0m?Pcz0PRSyQ$NZj|7+=$oQfi-mTK|0Ep-fO~P|XMa zN$_nhaP>yH*BTd^Oe|Ksp{}^26S=FdoPK{yqrTz`7hVGM)s@#(@2qgk7R$o^6rgEd z9z=SdKoqN^YGF#*I6QJTE97q@?s_5=cH}7R85|V}ldcDt*v}jZmE3*LAv6~rO9`p&q%g3*DLMila!3xJCI($<0(WsgnHv? z+OD*i%Avn+>AW>o4C3?`?}rm&?HrxoYmd=J>UAw+29d%TFM$QD1sOawAGLCjp;aYD zbPY1RXPl&5TSt8VBoylMv)TM=_{`M?w7){aRYN4$Oe0RdQ`zOQ%^slXLIcHkgp%I9 z29at?;Q{C7k%3%aOh5qsyb02onnsc+nRR+&i~O_k0s5Wesx^!-Da@cMgG{$w3!_u` z7s|c1Gc%)t9cnIqeXbQS7ZrJ2HDeHqY=ol;)iB@^S^p`Y&wl^icduy#uHW~16=!1C$VQi4BxEsO z?(0#Vm-5J?FmEN-#nYq5E(qJ*IBiarI2&^VuGV#@q89j+g)=dH**5C=K$E$3y|y3OZ3J8QQcxnk)BUIqa-{hsk( zv}&hP-dUc)TX1_??mUYGGeZXC&)juiQ-9c! z$`0!Sb-KgmdVr!F5+^Fzqei1mvZ(t4j}jP9kT1FdS2AAD<9n+IAZvc%Ap5_t(>Knd z1{`gNoW9wmf;)^)uPX0e8h!q`1fU)s1y7C6Qo$up;3;5*@*6dJX z4Q$eTuQ>X|padSZ$(4q;&@L~?J)KhTE8?&Z^~fPcA05*=P`0H6r5M|)2vZtjJ+`7T z!4mC_!g)GsFAFE$=pc@vww7P;OXIm1uvL{dc5A|wH#wD6b5Je3IFZ(Nx{K_3Zy$wU zkaf)*6Ci_OU8X$%8;F)$`1#iXSmaF&tX82yda-*UM?a5pIEu$_ihi;q9acT~UW@^W zZvcK{Gdm*u1=Y-BbPJ(C(KpV9XBVA8+35NU;OSU-D21Z9D+v67oMB?s3#lGl|1HWSal$}}NC0B)Yynn4OVDP}Yz%A;Rss}^VQglF4C9~X zndGone*AbuuV&uHiBIk5HB6Jf49R{^EPKT5J1g@q&)2PxMu4BnAtH(kh#pm1iUQS( zSJ?5NDExeUd|u>?bJxHXRY`EfD*TZ<6$+?e2l?I$R_?6L@% zfg|K*J*GB_1AiGsi&t)%vQlIyf6RFiJgT)LATs`tE|ugeFE&Kv6R_H!6zGioD|1NlXo9u1 zMgH$6N_p%V_v8}?C}-Mp+NybGde=0757RdphmYY|&A=XIaYdg9;OUUKNO5%~G6N$& zZQOe%I7Bo0uNIH&S0A^)Rx7|%HHh&=&GFWOlEla2LmIwXi#th&u7k~NRFmw6c&{R9 zmC23SW@KTW!S^!>zqtUNSt<1PH)T;FVN{12)XL*)N9WPj_xY018K$x`2muOtexjm! z2zmK2peaG_iubip741$Ie(Uzi#a2vIa^bWsi6Y!C{oswK+Yr*c`ul5?UVa0_Ti_(k zqEi8XDBAzSCw$h1R7}BtDU)gVe6M}J4@!6eaP!2&OQDCmfn-P=ZSA8zt+G<Fy9UtfMf}1DfKX=lF!Zrc#nO#z|4PE!2;&ZCikEel}b85 zObE7MV{9A_uf|_O?y)Ht!0H}zS{k~`cV?aER^rI48NO8YP>G<{bZl6>( zc_?I2y3@3lbc$x|X!135VYJ|P`QXo2CBnNya=nbKB+(rd80wjzz=i9;RW5_XX4XDP z;)iU}?=^;lz^#XZsqC}rCkQT)61Mk*vu@#ILu~4nq}8w+%p1ap{|wRkhHoh?wDE)vd(vudkeW6WH`QuG}#(er1!^?R9tp4#cBimPMYXHaG4UfDy zb&pRR3VVjIN^wHWSg!560@78V8RKJbn z!^0DPxz_iK(L~J>zMPP~r}XsM`cCSmZ(r3S%@&kM?oIY$D`BZ-^C=qx+R8yhE>hP uNB#QOJBIiQX3o3z7hcTiCx5UkJq_uPv+cANRQmxrxvuIO>lABa!~O@63F0;Y delta 8764 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 diff --git a/src/DiffEngineViewer.Tests/PixelTests.cs b/src/DiffEngineViewer.Tests/PixelTests.cs index b91b101a..4ed645ab 100644 --- a/src/DiffEngineViewer.Tests/PixelTests.cs +++ b/src/DiffEngineViewer.Tests/PixelTests.cs @@ -432,13 +432,16 @@ public Task ImagesReduced() } /// - /// A picture longer on one side than a texture can be, beside one that is not. The rows say - /// what it is, as they do for a format the head has no decoder for, and nothing is drawn under - /// them: it was a black box the shape of the picture, which is what GL makes of a texture it - /// was handed and would not take. + /// A picture longer on one side than a texture can be, beside one that is not. It is brought + /// down to the largest size of its own shape that a texture takes as it is read, and drawn + /// from that, fitted as any other. It was first a black box the shape of the picture, which + /// is what GL makes of a texture it was handed and would not take, and then nothing at all + /// under rows that said what it was. /// - /// Linux only, and only where the limit is what it is under Mesa's software rasteriser, which - /// is what these baselines are pinned to: 16384 pixels, one fewer than this picture is wide. + /// Linux only. It is past the limit where the limit is what it is under Mesa's software + /// rasteriser, which is what these baselines are pinned to: 16384 pixels, one fewer than this + /// picture is wide. Where a texture can be larger the picture is drawn as it is, and the + /// scene is of the same thing by the other way. /// /// [Test] From 6c5731b760bd5dc906c263d5e5c76bd15a313304 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sun, 4 Oct 2026 10:40:40 +1100 Subject: [PATCH 49/50] Close what this round fixed in todo.md, and describe what changed todo.md loses the items fixed and gains what each fix left, and for each item that was looked at and left, what stood in the way. claude.md describes the changed behaviour: the scan a batch carries, the Append that is refused, the batch a bulk discard now is, the list edited where it stands, the diff's anchors, the listener table and the second kept connection, the tray's held deletes and command line check, the Windows footer, and the Linux head's hidden window and sampling. docs/tray.md says what a held delete looks like. --- claude.md | 83 +++++++++++++++++---- docs/mdsource/tray.source.md | 2 +- docs/tray.md | 2 +- todo.md | 135 ++++++++++++++++------------------- 4 files changed, 131 insertions(+), 91 deletions(-) diff --git a/claude.md b/claude.md index 5b08da7f..57969e43 100644 --- a/claude.md +++ b/claude.md @@ -145,12 +145,25 @@ patching. `InlineApplier.ApplyAll` takes patches together: each file is read onc applied in memory in the order given, each to what the one before it left, and it is written once through the same temporary and swap, with the file's lock and mutex held from the read to the write. Every patch is told what `Apply` would have told it in turn, and `Apply` is the one-patch -case of the same code. One thing can only differ: a write that fails fails every patch from the -first edit on. Both batches use it, a file at a time (`AcceptBatch.Together` in the viewer, +case of the same code. One thing can only differ: a write that fails fails every patch that +edited, and any other that would have had to edit the file as it was read, while the rest keep +what is true of the file. Both batches use it, a file at a time (`AcceptBatch.Together` in the viewer, `OwnedInlineHost.AcceptEvery` in the tray), so the moment up to which a snapshot can still be withdrawn from a bulk accept is its file's turn rather than its own. A `SourceScan` rents its map from the pool and is disposed for that reason, and keeps its spans as sorted lists rather than -hash tables: it is built again for every patch, over the whole file. +hash tables. A batch lexes a file once and carries the scan from one editing patch to the next +(`SourceScan.Edited`): lexing starts again at the edit's line, never at a line that follows a +backslash, and rejoins the old scan at the first line start both have as code. `SourceScanTests` +holds it to a whole scan over random edits, and a lexer change that looks across a line break in +a new way has to extend `RestartFor`. `CanAnchor` and `CanApply` are answered from the last dry +run's scan while the file's length and write time stand, with no lock, for a file that had been +left alone three seconds when it was read. + +Two more shapes of what the patcher writes. A statement a Remove takes whole keeps its line, +empty, over a Snapshot call, as a chained call's does. An Append whose recorded line names no +call is refused, to be run again, when more than one call in the member could take it, and +passes over a call given a variable that `Snapshot` is called on: taking the first was the wrong +call half the time, silently. The holes of an F# interpolated string are lexed as code. A passing inline verification clears its staged trio (`InlineStaging.Clear`), which walked the project's whole `obj` tree to find the `VerifyInline` directories. The list of those is now kept a @@ -166,7 +179,7 @@ the comment there about not caching "nothing staged" asks for. - `Definitions` - Static collection of all supported diff tool definitions. Each tool is defined in `Implementation/` folder. - `Definition` - Record type describing a diff tool: executable paths, command arguments, supported extensions, OS support, MDI behavior, auto-refresh capability. - `DiffTool` - Enum of all supported diff tools (BeyondCompare, P4Merge, VS Code, etc.) -- `TextDiff` (`TextDiff/`) - The line diff behind a failure message and behind every text pair the viewer shows, which links these files. Myers in linear space over line ids, with three things in front of the textbook. Lines only one side has are marked changed and taken out first (`LineDiff.DiffShared`), since they cannot be unchanged and Myers costs by edits: a re-indented snapshot was all edits, four seconds for 40,000 lines. A diff has a budget of searching (`MyersDiff.Budget`, about a sixth of a second), counted in work rather than lines so that nothing quick is given up on for being long; past it a search settles for a split, which is still a correct diff and may not be the smallest. And a search that settles having passed nothing looks for where the start of each side is in the other (`TryDisplaced`), because a block moved further than the search went lines up on a diagonal it never reached. Up to 10,000 lines between the two sides a diff is always minimal. +- `TextDiff` (`TextDiff/`) - The line diff behind a failure message and behind every text pair the viewer shows, which links these files. Myers in linear space over line ids, with three things in front of the textbook. Lines only one side has are marked changed and taken out first (`LineDiff.DiffShared`), since they cannot be unchanged and Myers costs by edits: a re-indented snapshot was all edits, four seconds for 40,000 lines. A diff has a budget of searching (`MyersDiff.Budget`, about a sixth of a second), counted in work rather than lines so that nothing quick is given up on for being long; past it a search settles for a split, which is still a correct diff and may not be the smallest. And a search that settles having passed nothing looks for where the start of each side is in the other (`TryDisplaced`), because a block moved further than the search went lines up on a diagonal it never reached. Up to 10,000 lines between the two sides a diff is always minimal. Past the budget, a search that settles first asks `LineAnchors` for the longest run still in order of the lines each side has once, and splits at all of them, so the same lines in another order keep that run rather than whatever the search had reached; texts made mostly of repeated lines have few such lines and gain little. - `ResolvedTool` - A diff tool that was found on the system with its resolved executable path. - `BuildServerDetector` - Detects CI/build server environments to disable diff tool launching. @@ -190,7 +203,11 @@ the comment there about not caching "nothing staged" asks for. replaced, so the same reference is the same screen, and building one a frame was the whole queue's labels and tooltips, megabytes a second, from a window nobody was touching. Handing a head the same `Screen` is also how it learns nothing changed, with no comparison: the WinForms - head and `ScreenPayload` both stop at the reference. So anything a screen depends on has to be + head and `ScreenPayload` both stop at the reference. The queue column is walked to slots that say only where each row is, and the slice that fits + is what is described; labels are decided over the whole queue once and kept against its list, + so a list is never changed after it is put in a state. `ScreenPayload` cuts a row at + `Screen.PaneCells`, half the window and a cell, which holds while both native heads split the + panes equally. So anything a screen depends on has to be in the state. A spinner or a picture landing is a head's own business and redraws on its own. - Windows renders with **WinForms** and loads no native library. It is pumped through `Application.DoEvents` rather than `Application.Run`, so the shared loop stays shared. Only the @@ -207,7 +224,11 @@ the comment there about not caching "nothing staged" asks for. own loop for every part of the scroll bar, not the thumb alone, and `Present` stops that timer. An Alt chord is no command. A held key gives one accept or discard (the repeat flag, read in `ProcessCmdKey`, for what `ViewerSession.ChangesQueue` names), while navigation keeps its - repeats. A minimised window waits between frames as a hidden one does. + repeats. A minimised window waits between frames as a hidden one does. The footer wraps its buttons, and + gives a status with no room beside them lines of its own under them (`LayOutFooter`), as the + other two heads do; the buttons are the footer's own children, and a taller footer comes off the + canvas, which reports the rows it has left. A decoded picture is kept premultiplied, as the + buffer it is painted into is, which took a paint between half and full size from 15 ms to 9. - macOS renders with **AppKit and Core Text** (`native/swift/`), Linux with **raylib and Dear ImGui** (`native/`). Both implement the same C ABI, so the managed interop layer is identical. - macOS took the same treatment as Windows: a real menu bar, an `NSMenu` context menu, `NSView` @@ -238,7 +259,10 @@ the comment there about not caching "nothing staged" asks for. side is not told. A wheel is told from a trackpad by `hasPreciseScrollingDeltas`, and a control-click is taken in `mouseDown`, since the view has no `NSMenu` for AppKit to ask for. A drag reports the frame's own centre on an axis its picture cannot move on, as the Linux head - does: only when the space is what cut the picture short can it move. + does: only when the space is what cut the picture short can it move. A repeat of a held key is + dropped for accept, accept all and discard. A picture both panes name keeps a scaled copy for + each pane (`Picture.spare`), since the panes can be a point apart in width and one copy was + made again for each in turn without end. - Linux draws its own menu, so it keeps that baseline. Its tooltip and pane scrollbar are ImGui's, the scrollbar being `ScrollbarEx` driven in rows rather than pixels so its travel is exactly `ViewerSession`'s clamp. Its footer wraps as the macOS one does (`LayOutFooter`), with two @@ -273,7 +297,15 @@ the comment there about not caching "nothing staged" asks for. under half size, and one past `GL_MAX_TEXTURE_SIZE` is not drawn. The window is scaled by GLFW's content scale (`Xft.dpi` over 96), read once and without `FLAG_WINDOW_HIGHDPI`; a capture never is, and `MeasureGrid` reports the cells of the last window frame. An Xvfb used to check a layout - or a scale needs `-noreset`, or the setting is gone before the viewer connects. + or a scale needs `-noreset`, or the setting is gone before the viewer connects. A held key + repeats only navigation (`Repeats`); accept, discard and the rest act once. A hidden window is + neither built nor drawn: it still takes in decodes and fonts, and the first present after it is + shown draws. Sampling is set by GL filter directly, because raylib's bilinear on a texture with + mipmaps is `GL_LINEAR_MIPMAP_NEAREST` and works out a level for every pixel: plain linear from + three quarters of a picture's size up, and mipmaps made only for a picture drawn smaller than + that, on the decoder thread when first needed. A picture past `GL_MAX_TEXTURE_SIZE` is brought + down to one that fits as it is read. `PixelTests` has two tests that show the window and count + draws through a GL query, `AWindowLeftAloneIsNotDrawn` and `AHiddenWindowIsNotDrawn`. - Group headers fold. `SessionState.Collapsed` holds `QueueItem.GroupKey`s and `QueueProjection` skips their members, so the marker rides in the label and no head or ABI field knows about it. Whether an entry is hidden is always read back out of `VisibleEntries`, never recomputed — the @@ -296,9 +328,14 @@ the comment there about not caching "nothing staged" asks for. (`BeginAcceptGroup`, `AcceptBatch.Only`), not a transition of its own: in a queue of one solution the header's group is the whole queue. So it goes by the batch's rules, a snapshot the applier would not take staying in the queue with what the applier said, and it counts as still needing - review only its own members. Only the bulk discards are still one transition, since a discard - waits on nothing. A batch's record step is the one inline transition that does not rebuild the - list from the queue: it asks `InlineQueue.AcceptInBatch` of a queue holding the claimed entry + review only its own members. The bulk discards are the same batch with `Discarding` set: + snapshots and pending deletes go as it begins, since nothing of theirs is on disk, and each + move's received file is thrown away outside the lock. A discard under way is not on an owner's + listings. No inline transition rebuilds the whole list any more. An arrival, a settle, a + discard and a single accept read what changed off the `InlineQueue` before and after, whose + untouched items come back as the same instances, and edit the list where it stands + (`TryRebuildChanged`), with `RebuildWhole` as the fallback and as what the tests hold it to. + A batch's record step asks `InlineQueue.AcceptInBatch` of a queue holding the claimed entry alone and takes that entry out of the list, or marks it, where it stands. Rebuilt an entry, the bookkeeping grew with the square of the queue, seconds and gigabytes for 2,000 snapshots. For the same reason which entries are visible is found by `QueueProjection`'s one walk without @@ -512,7 +549,12 @@ the comment there about not caching "nothing staged" asks for. offer. An older owner never says the line and gets a connection each, an older client skips it, and a send that finds its connection gone falls back to the ordinary exchange. So a field can only ever be added as a new line. `ViewerServer.Stop` closes kept connections. -- `ViewerServer.Serve` is the accept loop with its accept handed in. A failed accept is retried +- `ViewerServer.Serve` is the accept loop with its accept handed in. Listings have a kept connection of their own, so a slow one never stands in front of a settle, + and a listing never waits for it: with another in flight it takes a connection of its own. + Sends that change the queue stay a connection each, since one written to an owner that had + just gone would be sent again with nothing to say whether it was acted on. On .NET Framework + the kept sockets have their inherit flag cleared, or a child process kept one open after the + test host had gone. A failed accept is retried at once, and from the second in a row after 100 ms: with no descriptors left a failure persists, and the loop took a core. A send whose caller cancelled throws `OperationCanceledException` and records nothing about the port. @@ -638,7 +680,17 @@ the comment there about not caching "nothing staged" asks for. payload's `Exe` (`ProcessEx.TryGetTool`): a library from before `ProcessCleanup.StillRunning` can send an id that has since been reused, and the tray would kill whatever holds it. A tool started through a `.cmd`, or one whose image cannot be read, is tracked with no process. A - move lets go of its process wherever it leaves for good (`Tracker.Release`). + move lets go of its process wherever it leaves for good (`Tracker.Release`). The image alone + does not rule out another copy of the same tool holding a reused id, so the process's command + line has to name the received file as well (`ProcessEx.WasStartedFor`): every definition + passes that path as it was given. A tool started through a script, or one that hands over to + another process and exits, cannot be tracked from here at all. +- A move that writes a file marks the delete pending on it (`TrackedDelete.Written`), however + the move was accepted, and no accept-all carries a marked delete out until a run raises it + again; accepting it on its own still does. `Tracker.HeldReason` is what the menu and the debug + view show. "Discard (n)" runs wholly on a worker. A scan that fails three times running is one + balloon for the run. Every tray keeps the `SessionEndWindow` now, and `Program.SessionEnding` + stages the queue where it is held here and then removes the version marker. - `ITrackedFiles.Version` is what `ListingTag` asks about the tracked files: the identity of the tracked objects, so `TrackedMove` and `TrackedDelete` must stay immutable in everything a listing carries. The scan removes a move by key and value, so one staged again since it looked @@ -674,10 +726,11 @@ the comment there about not caching "nothing staged" asks for. - Tool discovery uses wildcard path matching (`WildcardFileFinder`) to find executables in common install locations. A wildcard whose matches are all version-named folders takes the highest version; anything else takes the most recently written - Tool order can be customized via `DiffEngine_ToolOrder` environment variable - `DisabledChecker` respects `DiffEngine_Disabled` env var -- `ViewerClient` remembers a port found unowned for ten minutes (`RecheckUnownedAfter`), and the library's telling sends - settle, retire, move, delete, the first inline or diff send - skip the connect while that stands. A refused loopback connection costs two seconds on Windows (firewall stealth mode drops the reset), and a green run settles once per inline verification, which was six minutes for a class of 188 inline tests. Probes (`IsOwned`), the hosts and `InlineQueueClient` always ask and correct the memory; so does `SettleAppliedInline`, being one send per accept. Asking, on Windows, is the operating system's listener table first (`ListenerTable`, shared with `PiperClient`): no listener on the port means nobody to connect to, said without the two seconds, and a listener or a table that cannot be read leaves the connect to answer. So the first telling send of a test process, the launch gate's probe and each of its polls no longer wait to be refused. By port alone, whichever address, since the table is only believed when it says nobody is there. Not for a port that accepted a connection in the last second (`TrustOwnerFor`), because reading the table is reading every connection the machine has, and a run of settles to a live owner would pay more for each than the connect costs +- `ViewerClient` remembers a port found unowned for ten minutes (`RecheckUnownedAfter`), and the library's telling sends - settle, retire, move, delete, the first inline or diff send - skip the connect while that stands. A refused loopback connection costs two seconds on Windows (firewall stealth mode drops the reset), and a green run settles once per inline verification, which was six minutes for a class of 188 inline tests. Probes (`IsOwned`), the hosts and `InlineQueueClient` always ask and correct the memory; so does `SettleAppliedInline`, being one send per accept. Asking, on Windows, is the operating system's listener table first (`ListenerTable`, shared with `PiperClient`): no listener on the port means nobody to connect to, said without the two seconds, and a listener or a table that cannot be read leaves the connect to answer. So the first telling send of a test process, the launch gate's probe and each of its polls no longer wait to be refused. By port alone, whichever address, since the table is only believed when it says nobody is there. Not for a port that accepted a connection in the last second (`TrustOwnerFor`), because reading the table is reading every connection the machine has, and a run of settles to a live owner would pay more for each than the connect costs. The table is Windows' listeners alone, by `GetExtendedTcpTable` (`ListenerTable.Listeners`), falling back to .NET's list of every connection where that call is not there: 0.32 ms beside 3,000 connections where it was 13. What the table found empty is asked about again after a second (`RecheckUnlistedAfter`), so a tray started after a test process is found; the ten minutes is only for what a connect found. And only a refusal or an unanswered connect is remembered as nobody being there (`NobodyThere`). A viewer launch that failed gives its `MaxInstance` slot back - `TrayDisabledChecker` respects `DiffEngine_TrayDisabled` env var, behind `DiffRunner.TrayDisabled`. Separate from `Disabled` because tracking a pending move is separate from launching a tool: every exit of `InnerLaunch`, `Disabled` included, still calls `AddMove`. `PendingFiles.TrayAvailable` is the single gate - Tests use TUnit and Verify for snapshot testing -- The three WinForms test and benchmark hosts set `UnhandledExceptionMode.ThrowException` from a module initializer with `threadScope: false`. The one argument overload covers only the thread that calls it, which leaves every test thread showing WinForms' dialog on the desktop of whoever is running the tests, and waiting for a click. Never run a test that throws inside a window message in a build without it. `DiffEngineTray.Tests` also declines the tray's "open an issue" box (`IssueLauncher.Declined`) and records what was asked in `ModuleInitializer.IssuesAsked` +- The three WinForms test and benchmark hosts set `UnhandledExceptionMode.ThrowException` from a module initializer with `threadScope: false`. The one argument overload covers only the thread that calls it, which leaves every test thread showing WinForms' dialog on the desktop of whoever is running the tests, and waiting for a click. Never run a test that throws inside a window message in a build without it. `DiffEngineTray.Tests` also declines the tray's "open an issue" box (`IssueLauncher.Declined`) and records what was asked in `ModuleInitializer.IssuesAsked`. A form shown the ordinary way is the foreground window even parked off screen, and takes the keyboard of whoever is at the machine, so a test that posts input shows its form without activating it (`ViewerForm.Parked`, `ParkedForm`) and says what modifiers its thread holds (`ThreadKeys`) +- CI's runners have two to four cores. A test must not block pool threads while something in its own process needs the pool to answer it, nor assert that something happened inside a fixed short wait: `DOTNET_PROCESSOR_COUNT=2` shows both locally - `MachineSettings.Ignore` clears `DiffEngine_Disabled`, so a snapshot test that is expected to fail is run with a build server variable such as `TEAMCITY_VERSION` set, or Verify tells the real tray about it - `ps` is asked with `-ww`: procps lets an exported `COLUMNS` cut every command line `ProcessCleanup` reads - The native pixel snapshots (`PixelTests`) are opt in through `DIFFENGINE_VIEWER_PIXEL_TESTS`, which `MachineSettings.Ignore` has to leave alone: it clears every `DiffEngine_*` variable without regard to case, and clearing that one skipped them on the CI job that sets it, silently, for as long as nobody looked. Every call into the shim goes through one thread (`OnShimThread`), because on Linux the window's GL context belongs to the thread that made it and each test starts on whichever pool thread picks it up. The Linux baselines reproduce in an `ubuntu:24.04` container set up as the `unix` job in `build.yml` is - the shim built from source, Xvfb, llvmpipe - which is also the only way to run the C++ at all from Windows diff --git a/docs/mdsource/tray.source.md b/docs/mdsource/tray.source.md index 25a1e4f4..ccf4ba07 100644 --- a/docs/mdsource/tray.source.md +++ b/docs/mdsource/tray.source.md @@ -63,7 +63,7 @@ Exiting the tray writes any still-pending inline snapshots back to disk, under t "Accept all" will accept all pending moves, deletes and inline snapshots. Snapshots whose target frameworks disagree about the content are skipped rather than picked between; resolve those in the viewer. -The deletes it carries out are the ones that were pending when it began. A delete can be the last copy of a snapshot that is moving inline, so the deletes are held back, and the tray says so, when a snapshot could not be written or when a viewer that owns the queue did not answer. A delete of a file that a move in the same accept has written is left pending rather than carried out. +The deletes it carries out are the ones that were pending when it began. A delete can be the last copy of a snapshot that is moving inline, so the deletes are held back, and the tray says so, when a snapshot could not be written or when a viewer that owns the queue did not answer. A delete of a file that an accepted move has written is left pending rather than carried out, and stays that way through later "Accept all"s: it is marked `!` in the menu, with the reason. It goes when it is accepted on its own, or when a test run raises the delete again. A long queue takes a while to accept. An open [DiffEngineViewer](/docs/viewer.md) window shows how far it has got, with each snapshot leaving the list as it lands. diff --git a/docs/tray.md b/docs/tray.md index d5559361..b0ac0f29 100644 --- a/docs/tray.md +++ b/docs/tray.md @@ -70,7 +70,7 @@ Exiting the tray writes any still-pending inline snapshots back to disk, under t "Accept all" will accept all pending moves, deletes and inline snapshots. Snapshots whose target frameworks disagree about the content are skipped rather than picked between; resolve those in the viewer. -The deletes it carries out are the ones that were pending when it began. A delete can be the last copy of a snapshot that is moving inline, so the deletes are held back, and the tray says so, when a snapshot could not be written or when a viewer that owns the queue did not answer. A delete of a file that a move in the same accept has written is left pending rather than carried out. +The deletes it carries out are the ones that were pending when it began. A delete can be the last copy of a snapshot that is moving inline, so the deletes are held back, and the tray says so, when a snapshot could not be written or when a viewer that owns the queue did not answer. A delete of a file that an accepted move has written is left pending rather than carried out, and stays that way through later "Accept all"s: it is marked `!` in the menu, with the reason. It goes when it is accepted on its own, or when a test run raises the delete again. A long queue takes a while to accept. An open [DiffEngineViewer](/docs/viewer.md) window shows how far it has got, with each snapshot leaving the list as it lands. diff --git a/todo.md b/todo.md index 2a3e319f..1c95b9ff 100644 --- a/todo.md +++ b/todo.md @@ -1,6 +1,6 @@ # Todo -What is open after the review of `main` at 991bc480 and the three rounds of fixes that followed it: bugs, performance, and smaller items. Everything those rounds fixed is gone from here. What is left is one item that was never fixed, the macOS viewer started with no console session, and what the fixes did not reach, by area. +What is open after the review of `main` at 991bc480 and the rounds of fixes that followed it. Everything those rounds fixed is gone from here. What is left is what the fixes did not reach, by area, and a few items that were looked at and left for a reason the item gives. An item with no tag was said by whoever made the fix it follows from. A tag says how else it is known. Nothing under the macOS head has been run by a person: the Swift cannot be built from Windows, and CI's `macos-14` job compiles it and runs the suite and the pixel captures, which open no window. The Linux head was built and run in an `ubuntu:24.04` container, under Xvfb with Mesa's software rasteriser. @@ -8,21 +8,18 @@ An item with no tag was said by whoever made the fix it follows from. A tag says ## Library - [ ] A viewer that is alive and never binds the port is still reported as launched after `BindWait`, and its payload file stays. That is the apphost's "install .NET" dialog, which does not exit. At the gate it cannot be told from a viewer that is only slow. -- [ ] A viewer that exits 1 or 4 has staged the patch itself, and the caller, told the launch failed, now stages it too: two trios in different `VerifyInline` folders until a passing run clears both. -- [ ] A failed launch still spends a `MaxInstance` slot, so after five in one process the cap answers instead. +- [ ] A viewer that exits 1 or 4 has tried to stage the patch itself, and the caller, told the launch failed, stages it too: two trios in different `VerifyInline` folders until a passing run clears both. The gate cannot tell staged from tried, because the viewer discards `InlineStaging.Persist`'s count: it needs an exit code of its own for "staged", from `ViewerProgram`. - [ ] On macOS and Linux a tool started without ShellExecute still inherits the test host's streams. Nothing in the definitions tells a terminal tool, which needs them, from a windowed one: Neovim is declared `UseShellExecute: true` like the rest. - [ ] `DiffRunner.LaunchProcess` still starts a third party tool in the test host's working directory, which then cannot be deleted while the tool is open. Left alone because a tool resolves relative arguments against it and `ProcessCleanup` matches on those same strings. - [ ] None of the four tools started through `WindowsProcess.StartInheritingNothing` (Word and Excel comparers, Cursor, VS Code) was itself run. A console exe, a windowed exe and a `.cmd` stood in for them. -- [ ] The listener table is every connection the machine has, filtered, so reading it grows with them: 0.45 ms at 86 connections and 7.9 ms at 3,102. `ViewerClient` skips it for a port that answered in the last second; `PiperClient.PortIsHeld` reads it on every send. A listener-only table by P/Invoke would not grow. -- [ ] `RecheckUnownedAfter` is still ten minutes, though a recheck on Windows is a read of the table rather than two seconds, and could come down. -- [ ] Off Windows the connect is the only question asked, since a refusal there is immediate. Whether the table reads as empty under WSL1 was not checked. -- [ ] `PiperClient.PortIsHeld` takes any exception from the table as "may be held", where it took two kinds. -- [ ] Kept connections were not run on macOS: neither the rebind of a port whose last owner left a client holding a connection, nor the receive timeout surfacing as `SocketError.TimedOut`. And they were tested against a stand-in for an older owner, not a released tray or viewer. +- [ ] The table of Windows' listeners still grows a little with the machine's connections, 0.13 ms to 0.32 ms across 3,000 rows, and `PiperClient.PortIsHeld` reads it on every send. `GetExtendedTcpTable` was run on Windows 11 x64 only: not 32-bit, not ARM64, not with IPv6 disabled. +- [ ] A port the table found empty stands as unowned for a second; one a connect found empty still stands for ten minutes, which is every platform but Windows. Whether the table reads as empty under WSL1 was not checked. +- [ ] Only a refusal or an unanswered connect is remembered as nobody being there. A platform that reports "nothing listening" some other way would pay the connect on every telling send. Which `SocketError` Windows gives when it is out of ports was not established, and no longer matters to the memory. +- [ ] The two kept connections, for telling sends and for listings, were not run on macOS, and were tested against a stand-in for an older owner, not a released tray or viewer. A listing that times out drops its kept connection and the next opens it again: the tray's and the attached viewer's callers were not read for what they assume about that. - [ ] A client talking to an owner from before `keeps` still makes a connection per settle, so the port exhaustion stands against an older tray. -- [ ] The async inline send and every asking send (`TrySend` with a response, `InlineQueueClient`, `OwnerLink`'s five a second listing) are still a connection each. -- [ ] A connect that fails because the machine has no ports left is still recorded as an unowned port. Which `SocketError` Windows gives there was not established. +- [ ] Sends that change the queue (`Accept`, `Discard`, `AcceptAll`, `Inline`, `Diff`, `Focus`) and the async send are still a connection each. One written to a kept connection whose owner has just gone would be sent again, with nothing to say whether it was acted on. - [ ] Parallel settles take turns at the one connection under a lock, so a slow owner holds them in a line, where each used to wait on a connection of its own. -- [ ] A test process holds a socket to the queue's owner for its whole life. On .NET Framework sockets are inheritable, so a child a test starts without ShellExecute can hold that connection open after the test host exits. (not run) +- [ ] On .NET Framework only the kept connections are kept from child processes. A child started in the moment a one-off exchange is open still inherits that socket. (not run) - [ ] The accept wait is a fixed 100 ms from the second failure in a row. The case where a failure persists was run on Linux only, by using up the descriptors. - [ ] Apple's `ps` was not run with `-ww`; its manual says a second `-w` uses as many columns as it needs. @@ -30,87 +27,78 @@ An item with no tag was said by whoever made the fix it follows from. A tag says ## Inline snapshots - [ ] Verify has to change for the staged trios of a multi-targeted project to be cleared per framework: in `InlineEngine.Settle()`, call `InlineStaging.Settle(MappedSourceFile, inline.Line, inline.MemberName, VerifierSettings.IntermediateDir, SnapshotInSource)` in place of `ClearStaged(...)`. DiffEngine's half is in: the trios are labelled, and `Settle` clears only the running framework's. -- [ ] Verify's half of a Remove applied twice: skipping the Remove when the source file is newer than the test assembly. DiffEngine's half keeps the removed call's line, empty, when a Snapshot call is under it, which is a rule about the next line and not a guarantee about line numbers. -- [ ] A queued entry is still found by its line, with the member asked second. Three cases remain: a test that carries on past a failed verification and has two call sites only the line tells apart folds them into one; an entry the reporting framework has no content in is not moved, so a multi-target run can keep a stale duplicate; and a settle from the same member is believed on a key hit. Rebasing the hints of a file's remaining entries when one is accepted would close all three, and was not done because a batch accept finds entries by their `Variants` reference. -- [ ] An `Append` with a stale hint takes the first call in the member that has no `Snapshot` call. Where an earlier call there is verified through files, or through `settings.Snapshot`, that is the wrong call, as it already was whenever such a call came first. -- [ ] A `Remove` with a stale hint can answer AlreadyApplied while its anchored call is still there, because `RemovedAtHint` is asked first. (seen in fuzzing, and present before the fix it was found beside) -- [ ] A `Remove` that takes a whole statement line (`settings.Snapshot("dup");`) still brings the next line up, so applied twice over a sibling `other.Snapshot("dup");` the second apply takes the sibling's statement. `RemovedAtHint` only recognises a removal under a verify call. (read, not run) -- [ ] An empty `TestName` or `MemberName` still reads back as null from `InlinePatchFile`; only `OriginalValue` has a line saying it is present and empty. -- [ ] The F# scanner outside a comment still takes a tick after an identifier character as part of the name, and still reads the holes of `$"..."` its own way. Only comments and backticked names were held to `dotnet fsi`. -- [ ] Lexing is still once a patch, in a batch as well: each patch is applied to what the one before it left, and one scan for all of them would not give the outcomes of applying in turn. 500 patches to a 600 KB file are 0.8 s of patching around one write. -- [ ] `CanAnchor` still reads and lexes the whole file for each call site a run has not seen before: 0.7 s for 500 call sites in the 600 KB file. -- [ ] A batch's one write that fails fails every patch from the first edit on, including one judged already applied or not found after it, and the file's mutex is held from the read to the write. +- [ ] A `Remove` with a stale hint can answer AlreadyApplied while its anchored call is still there. The source cannot tell that from the same Remove applied twice over a sibling with the same literal, so it needs Verify's half, skipping the Remove when the source file is newer than the test assembly, or a Remove that never changes line numbers. An empty line over a Snapshot call is read as removed, which is one more shape of it. (reproduced) +- [ ] A queued entry is still found by its line, with the member asked second. Three cases remain: a test that carries on past a failed verification and has two call sites only the line tells apart folds them into one; an entry the reporting framework has no content in is not moved, so a multi-target run can keep a stale duplicate; and a settle from the same member is believed on a key hit. Rebasing the hints of a file's remaining entries when one is accepted would close all three. It needs the applier to report where each edit began and how many lines it added, `InlineQueue.Accept` and `AcceptInBatch` to move the file's remaining entries, the viewer's batch and the tray's `AcceptEvery` to find a claimed entry by something that survives a move rather than by its `Variants` reference, and an attached viewer and `RemoteInlineHost` to cope with a key changing under a selection. +- [ ] An `Append` with a stale hint and more than one call in its member with no Snapshot call is refused and has to be run again. A file with several such members takes a run each under accept-all, because each accept above makes the next hint stale. Rebasing hints would end it. +- [ ] A `Remove` of a statement whose receiver is on a line above the call still brings the lines under it up. +- [ ] A batch still copies the whole source for each patch that edits: 1.2 MB a patch in a 600 KB file, 0.29 s for 500. +- [ ] A dry run is answered from a kept scan while the file's length and write time stand. A rewrite of the same length that puts the old write time back is not seen, and up to four files' source and maps are held for the life of the process. `ASecondProbeOfAFileDoesNotReadItAgain` relies on a second open being refused, which was not run off Windows. +- [ ] The scan carried from one edit to the next restarts at the edit's line, never at a line that follows a backslash. A lexer change that looks across a line break some other way has to extend `SourceScan.RestartFor`. - [ ] A `VerifyInline` directory another process creates can be found up to a second late by `InlineStaging.Clear`. -- [ ] Two Windows-only tests assert that a send to a free port returns in under a second, where the refusal it avoids takes two. ## Tray -- [ ] "Accept all in" a group from an attached viewer sends one `Accept` per key (`OwnerLink.AcceptGroup`), so the guard that leaves a delete whose file a move in the same sweep wrote does not apply there. -- [ ] A delete held back that way stays in the menu with only a log line to say why, and a second "Accept all" carries it out. +- [ ] "Accept all in" a group from an attached viewer sends one `Accept` per key (`OwnerLink.AcceptGroup`), which carries out a held delete, as accepting it on its own does. +- [ ] A delete held because a move wrote its file is marked in the tray's menu and debug view only. A viewer showing the tray's queue shows it like any other, and the wire's accept-all counts it as kept without saying why: `ViewerResponseDelete` has no field for it. The hold is let go when the delete is raised again, which another framework's process of the same run, having decided before the move was accepted, can do. - [ ] An owning viewer's own batch looks to have the shape the tray's had: `ViewerSession.EnqueueTracked` replaces by key only, and `BeginAcceptAll` takes moves and deletes in queue order, so a delete can follow the move that wrote its file. (read, not run) - [ ] A batch that begins between Verify raising a delete and queueing its patch can still carry out the delete without the patch. Closing that needs the two tied together on the wire. -- [ ] A logoff also skips `TrayVersionFile.Delete()`, for the reason it skipped the staging. -- [ ] The session ending was confirmed by sending the tray-shaped process `WM_QUERYENDSESSION` and `WM_ENDSESSION`, not by logging off. -- [ ] A process id is matched to the payload's `Exe` by file name only, so a reused id now held by another copy of the same tool is still tracked, and killed on accept if the move can be killed. -- [ ] A tool started through a `.cmd` (VS Code, Rider) is never tracked as a process, so it never counts for "Accept all open" and is never closed by the tray. Nor is a tool whose launcher hands over to an executable of another name and exits. The tool definitions were not surveyed for either. -- [ ] "Discard (n)" still discards tracked moves on the UI thread, with up to 500 ms per killable tool waiting for it to exit. Only the queue's half is on a worker, and a bulk discard that fails is only logged. -- [ ] A scan that keeps failing is only in the log. Nothing tells the user. -- [ ] `ListingTag` can answer "unchanged" for a listing built while a move was briefly out of the dictionary during an accept and then restored. -- [ ] `Tracker.differing` is never pruned when a move leaves. (noticed, not touched) -- [ ] `KeyRegisterTests` registers a real global hot key, Ctrl+Alt+Shift+F24, for the length of each test, and fails where something else holds it. +- [ ] The session ending, which stages the queue and removes the version marker, was exercised by sending `WM_QUERYENDSESSION` and `WM_ENDSESSION` to the window, not by logging off, and its wiring in `Program.Inner` is read, not run. +- [ ] A process is believed to be a move's tool only when its command line names the received file. A custom tool that rewrites the path it is given is not tracked as a process: not closed on accept, not counted as open. The command line is read by a call Windows has from 8.1, and was read from PowerShell children only, not a real diff tool. +- [ ] A tool started through a script is never tracked as a process: VS Code always (`code.cmd`), and Rider when it is found on the PATH as `rider.cmd`. Nor is one whose launcher hands over and exits: Araxis, Sublime Merge, Cursor, Meld and an already running Rider, from knowledge of the tools and not from running them. None can be tracked safely from the tray, since the window lives in a process whose command line does not name the pair. +- [ ] "Discard" on a single move still ends its tool on the UI thread, up to 500 ms. A move whose received file could not be deleted in a bulk discard is untracked with only a log line. +- [ ] A scan that keeps failing still writes a log line every two seconds. +- [ ] `OptionsFormLauncherTests` registers real global hot keys, Ctrl+Alt+Shift+F13 to F17, and fails where something else holds one. `KeyRegister`'s internal constructor is there to give it a stand-in. +- [ ] `TrayVersionFileTest` writes and deletes the real `%TEMP%\DiffEngineTray\version.txt`, so running the suite removes the marker of a tray running on the machine. +- [ ] The `MenuBuilderTest` tests that call `menu.Show(0, 0)` briefly put a context menu at the top left of the desktop. ## Viewer model -- [ ] Past its budget a diff is correct and may not be the smallest: two texts of more than 10,000 lines between them with 8,000 or more of the lines they share out of place. A block moved whole is found whatever its size. The same lines shuffled come out as nearly everything changed, where the longest run still in order could be kept: anchoring on the lines that occur once on each side, by the longest increasing run of them, would find it in the time of a sort. -- [ ] A pair is still read and diffed before the viewer answers the test process that sent it (`MessageHandler.TrackMove`). The diff is bounded, so what is left is two reads: a million lines a side, shuffled, is about two of the sender's three seconds. Answering first and filling the entry in afterwards, as a document arrives `Reading`, was not done. -- [ ] A screen is built when the state changes, which a scroll or a drag does every frame, and `QueueProjection.Rows` describes every row of the queue to draw the forty that fit: 0.55 ms and 1.1 MB at 2,000 entries, for each such frame. Slicing before describing would make it the visible rows'. -- [ ] `ScreenPayload` clips a row to the window's width in cells rather than the pane's, so about twice what a pane can show is encoded for the macOS and Linux heads: 3.6 ms a changed frame for a 4K window of 300 character CJK lines. `RowText.Shown`, which the WinForms head cuts with, would serve, once the model knows how many cells a pane has. -- [ ] A queue of more than a hundred pending files is looked at a hundred a pass, so a row that is not on screen follows its file within `count / 100` passes: two seconds for a thousand, and five times that while the window is hidden. -- [ ] Every arrival (`EnqueueInline`), settle and single accept still rebuilds the whole list from the whole queue, under the lock: a dictionary of the queue and an ordering. Only a batch's record step does not. -- [ ] The bulk discards are still one transition on the render thread: `DiscardGroup` and `DiscardAll` delete each received file under the lock. -- [ ] A snapshot discarded, or settled by a test that started passing, while its own source file is being written by a bulk accept was handed over with the rest of the file and is written with them. It is not counted, and a discard still takes it out of the queue. Closing it would take the applier asking, before its one write, which of the patches are still wanted. +- [ ] A pair is still read and diffed before the viewer answers the test process that sent it (`MessageHandler.TrackMove`). The diff is bounded, so what is left is two reads: a million lines a side, shuffled, is about two of the sender's three seconds. Answering first and filling the entry in afterwards was looked at and left: `Refresh` does not open an entry at its first change, a second arrival of the pair while unread would be compared against a placeholder, the watch that would fill it has a budget and a hidden cadence, and every small pair would flash an empty pane. +- [ ] A queue of more than a hundred pending files is looked at a hundred a pass, so a row that is not on screen follows its file within `count / 100` passes. Looking every pass at the rows the queue column shows would be better, and was judged not worth the watch knowing the body's height and what is folded. +- [ ] A snapshot discarded, or settled by a test that started passing, while its own source file is being written by a bulk accept is written with the rest of the file. It is not counted. Closing it takes `InlineApplier.ApplyAll` asking, for each patch after the file is patched in memory and before its one write, whether it is still wanted, with the core answering from whether the claimed entry is still queued. +- [ ] A change to one entry still costs by the queue's length, a tenth of what it did: 0.1 to 0.24 ms at 2,000 entries, in asking `InlineQueue`, which copies its list and builds a key an item. The first snapshot of a solution, and a removal that leaves a solution with only files, still rebuild the whole list, and an attached viewer's `Sync` still projects the whole queue for each listing that changed. +- [ ] Queue labels are kept against the queue's list, so a list changed after it is put in a state would show stale labels. Nothing in the core does that. +- [ ] `ScreenPayload` cuts a row at half the window and a cell, on both native heads splitting the panes equally, which was read and not run. A head that stops doing that has to change `Screen.PaneCells`. A changed frame of CJK rows is still 1.7 ms at 4K, in classifying each cluster. +- [ ] Past its budget a diff goes by the lines that occur once on each side. Texts made mostly of repeated lines have few, and are still split wherever the search stopped. +- [ ] A bulk discard under way in an owning viewer is not on its listings, so an attached window or the tray sees the queue shrink with no progress and refuses nothing meanwhile. A discard-all from the tray during an accept-all now waits for it to end. +- [ ] `ScreenBuilder.Build` for an entry of 100,000 lines is 1.5 to 2.5 ms a screen. (noticed, cause not found) - [ ] Both sides of a document are drawn at once, and four things about that could be better: a drawing is not stopped when the reader leaves its entry, though between two pages of a PDF it could be; the pages of a PDF that is put back because the other side stopped inside PDFium are dropped, and drawn again once PDFium is free; a PDF pair's right side waits for the left's first page, which is what lets the two be told apart when both stop; and `Withdrawn`, which takes a rendering back out of the state, lives in `DocumentWatch` where it belongs beside `ViewerSession.Rendered`. - [ ] Which of two PDFs stopped inside PDFium is inferred from whose pages stopped first, not known. A thread descheduled between landing a page and asking for the lock, at the moment the other side hangs, would have the innocent side given up on and the culprit put back. -- [ ] `TrackedWatch` closes an open context menu when a file is written again with what it held, since the entry is replaced by its restamped copy through `ViewerSession.Refresh`. The reader is not moved. -- [ ] The two tests that show a pair is not diffed again, and the one that bounds what reading a file allocates, were not run against the code from before their fixes. ## Viewer, Windows head -- [ ] Between half its own size and its own size an enlarged picture is still scaled on every paint: 15 ms for a 4000 by 3000 pair at 400%. A copy there would cost up to the decoded picture again, 96 MB for that pair. Decoding premultiplied (`Format32bppPArgb` in `ImageCache.Load`) measured 9 ms, and was left out because it moves translucent pixels by one level in five pixel scenes. -- [ ] A picture drawn from its scaled copy sits on whole pixels, up to half a pixel from its exact placement, so two pictures of different sizes can be a pixel apart relative to each other while zoomed below half size. -- [ ] `Uncomposable` is a picture's rather than a size's, so a scale that failed also stops the fitted copy being made again at a new size. -- [ ] `RowText.Shown`'s tests are in `DiffEngineViewer.Windows.Tests`, beside its one caller. They belong beside `CellGridTests`. -- [ ] A minimised window slows only its own frame wait. `OwnerLink`, `TrackedWatch` and the document reader go by `Hidden`, which only a Hide command sets, so they keep their on screen cadence while minimised. The head would have to tell the loop. -- [ ] A status that does not fit loses what is past two lines, behind an ellipsis and a tooltip. The footer does not wrap its buttons or give the status a line of its own as the other two heads do. Whether a scaled display shows the middle of a wrapped status is unchecked: captures are unscaled. -- [ ] Nothing proves by throwing that an exception comes out of a message pump in the test hosts rather than WinForms' dialog. The test reads the mode back instead, through an internal of WinForms, because a throwing one is what put the dialog on screen. -- [ ] `TwoKeysInOnePumpAreTwoCommands`, `ATextEntryHasNoPictureForTheWheelToFind` and `TheWheelOverAPictureZoomsAndOverTheRowsScrolls` failed once in a run of the whole solution and passed in the next and twice alone. They post keys and wheel turns to a form, and someone was using the machine. (seen once) -- [ ] Footer buttons leave `UseMnemonic` on, so an ampersand in a label would become an Alt access key. (noticed, not looked into) +- [ ] A status loses what is past three lines under the buttons, behind an ellipsis and a tooltip. The footer was not looked at on a scaled display; its tests enlarge the font instead. +- [ ] In a capture a footer taller than one row cuts the last rows of a screen built for the whole window, since a capture's screen is built before the footer is laid out. The window is not affected. +- [ ] Between half its own size and its own size an enlarged picture is still scaled on every paint: 9 ms for a 4000 by 3000 pair at 400%. A copy there would cost up to the decoded picture again, 96 MB for that pair. +- [ ] The picture baselines were not taken again for the premultiplied decode, apart from the two the footer moved. They differ from what is drawn by one level in translucent pixels and pass at the suite's 0.9999. +- [ ] `WindowPlacementTests`, `ViewerFormRaiseTests` and `FrameWaitTests` still show a `ViewerForm` the ordinary way, so it is the foreground window while they run and takes the keyboard of whoever is at the machine. Only the hosts that post input, and captures, are parked. (noticed, not looked into) +- [ ] In a window about 560 wide the left pane's header runs into the right pane's with no gap. It shows in `FooterThatWraps`. (noticed, not looked into) +- [ ] The test that an exception comes out of a message pump has only been seen to pass, since failing it is what shows the dialog. +- [ ] `RowText.Shown`'s tests are in `DiffEngineViewer.Windows.Tests`, though it is the core's. They belong beside `CellGridTests`. +- [ ] A minimised window slows only its own frame wait. `OwnerLink`, `TrackedWatch` and the document reader go by `Hidden`, which only a Hide command sets. The head would have to tell the loop. ## Viewer, Linux head -- [ ] The body is not told about a taller footer. The model's eight chrome lines leave room for two rows of buttons and a status line; a paged document in a window under about 450 px wide needs four, and the last body rows are then hidden. Fixing it means the shim reporting fewer `rows`, which changes what `deview.h` says that field is. +- [ ] The body is not told about a taller footer: a paged document in a window under about 450 px wide needs four footer rows, and the last body rows are then hidden. `rows` in `deview.h` would become the rows the body has room for and the model's eight chrome lines, with `MeasureGrid` here and `Renderer.grid(for:)` on macOS taking off what the footer exceeds its allowance by. No managed change, a `DEVIEW_VERSION` bump, and both binaries built together. - [ ] The machine's fonts are drawn, not shaped: Arabic is unjoined and right to left text is in stored order. Colour emoji fonts and CFF2 variable fonts cannot be read by stb_truetype and are passed over, so a machine whose only CJK font is the variable Noto still shows replacement glyphs. At most fifteen fonts are merged. -- [ ] Accept-all reads the Shift key's physical state, so a latched Shift (sticky keys) is a plain accept. -- [ ] A held letter repeats its command at the keyboard's repeat rate, so holding `a` accepts repeatedly. Only navigation should repeat, as on Windows. -- [ ] An idle window still turns sixty times a second. Each turn compares the screen's bytes with the last one's, asks after the files behind the pictures on it and waits out its sixtieth: 3 to 9 ms of processor a second. Waiting on the window system instead would take the managed loop, which also asks after its owner and its files each turn, being told when to wake. -- [ ] Nothing in `DiffEngineViewer.Tests` fails if the window goes back to drawing every frame. `NativeIdleBenchmarks` shows it, in its Drawn column, and is run by hand in the container. -- [ ] A hidden window is still built and drawn when its screen changes, which an arrival in the queue does. -- [ ] Leaving an idle window alone was run only under Xvfb with Mesa's software rasteriser, with no window manager and under openbox. Not on a GPU, under a compositor, on Wayland or over forwarded X, where what the window system keeps of a window that is not being drawn may differ, and where leaving one alone matters most. -- [ ] `deview_capture` makes its ImGui context without `ImGuiBackendFlags_RendererHasVtxOffset`, which the window's declares, so a capture whose draw list passes 65,535 vertices comes out scrambled. Nothing captures at that size, but dense text at 4K could. (ran, with the flag added to an older shim) -- [ ] A picture larger than `GL_MAX_TEXTURE_SIZE` draws as nothing. It could be reduced on the decoder thread to fit a texture. `PixelTests.ImageTooLargeForATexture` holds only under llvmpipe, whose limit is 16384. +- [ ] A minimised window is still built and drawn when its screen changes; only a hidden one is left alone. +- [ ] An idle window still turns sixty times a second: 3 to 9 ms of processor a second. Waiting on the window system instead would take the managed loop being told when to wake. +- [ ] Leaving a window alone was run only under Xvfb with Mesa's software rasteriser, with no window manager and under openbox. Not on a GPU, under a compositor, on Wayland or over forwarded X. +- [ ] Control held for the wheel to zoom is read from the key's physical state, so a latched Control (sticky keys) scrolls instead. GLFW's scroll callback carries no modifiers. (plausible) +- [ ] A picture brought down to the largest texture is drawn as that copy's pixels when enlarged past it, not its own, and nothing on screen says so. Bringing down a picture of 20,000 pixels square holds about 2 GB for a moment. +- [ ] A picture between half and three quarters of its size is drawn from its half size copy under about seven tenths: even, but soft. In a window made narrower, a picture is drawn smoothed for the frames until its reduced copies land, then changes once. - [ ] Display scale is read once, as the window is made. A change of `Xft.dpi` while running, and a scale per monitor under Wayland or XWayland, are not followed, and a placement remembered at one scale is used in pixels at another. Checked only under Xvfb with an X resource at 144 and 192, never on a HiDPI desktop. -- [ ] A frame of two pictures costs about a tenth more under llvmpipe since mipmaps (opaque at 4K, 27.0 ms to 30.1), probably the trilinear sampling of a picture drawn under half size. Mipmaps also add about a third to a picture's memory, drawn small or not. (measured, cause unconfirmed) -- [ ] `[`, `]`, `0`, `-` and `=` have no fallback by position on a layout that is not Latin; only the letters do. -- [ ] All input comes through GLFW's callbacks. A release that never arrives would leave a button held: GLFW's own release on losing focus is relied on, and hiding the window during a press was not tried. A two finger tap on a real touchpad is unconfirmed. +- [ ] `PixelTests.AWindowLeftAloneIsNotDrawn` and `AHiddenWindowIsNotDrawn` show a real window for a few seconds, which someone who turns the pixel tests on at a desktop will see, and the second asserts exactly one draw on the first present after showing. +- [ ] A press in a window that does not have input focus, with its release never arriving, was not tried. Hidden, unmapped, minimised and unfocused during a press, the drag stopped within a turn. A two finger tap on a real touchpad is unconfirmed. ## Viewer, macOS head -- [ ] `Runtime.open` cannot fail (it always returns true), so with no console session, as over SSH, AppKit aborts the process after the port was bound and the patch is lost. `CGSessionCopyCurrentDictionary()` is the documented question to ask, and was not used because it may also answer "no session" over SSH while the same user is logged in at the console, where the viewer opens today. What would settle it: print that call from an SSH shell with and without a console login, and run the viewer in each. (reported: plausible) +- [ ] `Runtime.open` cannot fail (it always returns true), so with no console session, as over SSH, AppKit aborts the process after the port was bound and the patch is lost. `CGSessionCopyCurrentDictionary()` may also answer "no session" over SSH while the same user is logged in at the console, where the viewer opens today. `SCDynamicStoreCopyConsoleUser` beside it would tell those apart except under fast user switching, which was not tried. What would settle it: print both from an SSH shell with and without a console login, and run the viewer in each. (reported: plausible) - [ ] To confirm on a Mac, from the bug fixes. Two are event handling that no capture exercises: - Keys and clicks queued: with three entries queued, `pkill -STOP -x DiffEngineViewer`, press Down twice, `pkill -CONT`: the panes scroll two rows. Stopped, Tab then `a`: the second entry is the one accepted. - The scroller's knob: dragging it scrolls the panes while the button is down, and the scroller stays on the right edge through a resize. @@ -121,13 +109,12 @@ An item with no tag was said by whoever made the fix it follows from. A tag says - A turn: Time Profiler on a pair with a long PDF. No `CTLineCreateWithAttributedString` under `Renderer.draw` for a turn, whichever clip AppKit hands over. - Text outside Latin: `--diff` two files of Chinese and hold Down. The same symbol for each frame: the new row alone. - An enlarged picture: `--diff` two 2880 by 1800 screenshots, `+` once, and drag. Time under `Renderer.enlarged` for each frame: a blit, and one 1560 by 975 bitmap a pane about a tenth of a second after the step. -- [ ] To confirm on a Mac, from the smaller fixes: the six changes that redraw a window when a picture lands in a partial draw, match the page keys by the character typed, leave the other pane's pan alone, stop redrawing a window with no room for its picture, take a wheel's click and a control-click, and return from the pump on input. Five are event handling or window state that no capture exercises. The check for each is in its commit's message. +- [ ] To confirm on a Mac, from the two rounds of smaller fixes: ten changes, eight of them event handling or window state that no capture exercises. The check for each is in its commit's message. - [ ] A live resize still draws the rows sliced for the old size until the mouse comes up. It needs a frame callback in the C ABI. A press in the scroller's slot followed by a drag is still AppKit's loop too. -- [ ] The managed side still slices the body for a footer of one row. This head has 64 pt to spare, which is three rows of buttons or two and a status line; past that the last one or two body rows are not drawn. -- [ ] Every auto-repeat of a held `a` or `d` is handed over, including ones queued during a stall. `event.isARepeat` would drop them, as the Windows head does. -- [ ] The title row has the footer's old shape: the subtitle is drawn over a long title. -- [ ] Since macOS 11 a view with an automatic backing store is handed its whole bounds whatever was invalidated, clip included, so the clip test probably leaves nothing out on any supported macOS. Two routes would make it pay: `layer.contentsFormat = .RGBA8Uint` in `viewWillDraw`, which changes how the whole window is stored, or a view of the spinner's own. (read, in Apple's developer forums) -- [ ] A byte-equal pair of documents names one page's png in both panes. With one scaled copy a picture and panes a point apart in width, `fitted` looks to make the copy again for each pane in turn without end. The enlarged path stays out of it by drawing such a pair from the picture. (read, not run) -- [ ] A drag still pulls the other pane's centre into the dragged pane's range on an axis both can move on, when the two pictures differ in shape. Only the axis the dragged pane cannot move on is left alone. The Linux head has the same rule. -- [ ] A hidden, miniaturised or covered window comes forward up to a tenth of a second late for a patch arriving over the socket, since the managed side cannot interrupt the pump, and `OwnerLink` and `TrackedWatch` do not slow for a window that is only covered or miniaturised. Both need the ABI to carry it. During a scroll or a drag the loop turns at the rate events arrive, which a 120 Hz device makes faster than sixty. -- [ ] `+`, `-` and `=` are still matched on `charactersIgnoringModifiers`; only the brackets are matched on `characters`. +- [ ] The managed side still slices the body for a footer of one row. This head has 64 pt to spare, which is three rows of buttons or two and a status line; past that the last one or two body rows are not drawn. The Linux head's item on `rows` is the fix for both. +- [ ] A title's width is counted in cells, so a title of characters a fallback font draws wider than a cell can still reach the subtitle. One that fits exactly touches the subtitle with no gap, where Linux keeps a character. +- [ ] The zoom keys behind Option were not tried on any layout, and zoom reset (`0`) is matched on `charactersIgnoringModifiers` only. +- [ ] An enlarged pair that is the same picture in both panes is still drawn from the picture rather than from a copy, though with a copy kept for each pane it no longer has to be. +- [ ] Since macOS 11 a view with an automatic backing store is handed its whole bounds whatever was invalidated, clip included, so the clip test probably leaves nothing out on any supported macOS. A view of the spinner's own would make it pay only if AppKit gives that view a layer of its own, which cannot be checked from here. (read, in Apple's developer forums) +- [ ] A drag still pulls the other pane's centre into the dragged pane's range on an axis both can move on, when the two pictures differ in shape. Fixing it means moving the centre the frame asked for and clamping to the wider of the two panes' ranges, in both native heads together. +- [ ] A hidden, miniaturised or covered window comes forward up to a tenth of a second late for a patch arriving over the socket, since the managed side cannot interrupt the pump, and `OwnerLink` and `TrackedWatch` do not slow for a window that is only covered or miniaturised. Both need the ABI to carry it. From c6c7ae6b6512649285d7254a370f160208a51900 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 4 Oct 2026 12:16:07 +1100 Subject: [PATCH 50/50] Rebuild native renderer binaries (#928) Co-authored-by: SimonCropp <122666+SimonCropp@users.noreply.github.com> --- .../native/libdiffengine_viewer.so | Bin 2243416 -> 2243416 bytes .../linux-x64/native/libdiffengine_viewer.so | Bin 2472264 -> 2472296 bytes .../native/libdiffengine_viewer.dylib | Bin 460408 -> 460408 bytes .../osx-x64/native/libdiffengine_viewer.dylib | Bin 460408 -> 460408 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/DiffEngineViewer.Linux/runtimes/linux-arm64/native/libdiffengine_viewer.so b/src/DiffEngineViewer.Linux/runtimes/linux-arm64/native/libdiffengine_viewer.so index 9a874716000184b576971122ab798ab9845325a7..59afe83eea9375daf036e948dd1af0463de1db35 100644 GIT binary patch delta 252119 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

I|Z;+R2q}`!ZgUKmXR@D$e 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 delta 423113 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 z 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

}OUVdje8!t+EMut>aC<9Xdi@}S;i9v_`&h9*x| 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 nr`nSl3z$Q{>HF zR%%qPrA3-$7K%%PS&FuqmRlJYF>y=W=l4AKzCg_0-_IXEd&Ir3bI(2J+;h%7cYVF) z_KIe=S2WAX45&B0nV0z2|BfQk@y*!V0lj@UnpE*P$y*k0WW@n}Ova`Xx?19T(Q}p8 zBbu_St*f(ffsK7PH?;_{bXU0E(Sd-RJa<2Rc*4+PnU+CMNN*vfPu1bSanI3o(0dymI0>Zp|bF{E)YFa z%^jI7{k)ac?7ffyzN>dgoB&zhYc;zQ(#Lm~4qc!_cQIRNA5-{e68EH0g6Uc4Wmjl` z$>$qcxUhySq-Rm+(>B1Ac~ll=>208AQJ9EAzd~7CL(3wj z>{$Ht(gTNDP2Dl4eR!Quqw-Xi-F=`Mb)Q}C9->TJc!?)324@EE(Zj2rGMUb{#c)};rp zA{kwY%aM(OOE7WSa*y@t6&l0>#`VMj+IRtGu(~sd zUYzqEzId*nmt*kl7iBOCu)!FYYA~{2Ep6)FUoX^>uowcLy2I-B4tHEGLw)A~tIPW{ z6vk%UN^WgUyX{F?1jzDSpt}}Kvu1dbM_FCw?T|g<1XsYa#3rz2!f2C##pgo@HrEn? zS{JATBRPEu%1SRj}NhG}wYVJm>;CgoF1^&}5RCZbBOjer%R21#` z1qJwPb)F@MCwDKN1e^oRyH86;U*v?AEh>rVrbm~#gD%JnQJT*eBb6eqcT3@i0YZ|b z3ZcqH?Da@QgB0x(0 zaK|87$r?kgEb@pR3D$;RWWDPPP;dS%Ha9w; z_Olf@Hi^?+;;bZ`Mz`4U=$1{p3ZotZ#Ru6$aVT2!+m~oj$Jxx#w^P_3&|yiH*a%OI z^LFLP@d2W3*E z3@y^plf1n8mJ>WdxPstY6$BR$L02V$nEFcdoFhF=peqbr95$u>fNZ?9}56wlyZm^z%44o+|(n^Tucr z`UKA{Wq-s(s&h-3e{AzEtW-cFZt)!zxr~b3hKk($ikw!;X2&L2j$T27GV%=R57A7U zGvDrc6T0p5-I1p-uNLGo^pXXd7TQ=Qk0jMbv?4 zR_CFJ!~7-)qrV}ldQ1glX>7Y?NOysW=;IIJ=idQ?#+pK;6eO1v^7)_}=e!u_ypO)M zax6>l-?2}3z#>kUAhrRaJs!ZqV;TgKC4DGnHzttF+yelhqgXOr;@O=K`8c2;)=@wB)9z}A(mgbf;Ozto zv~q3?>uPOh>Q<9vJHy8T4g*7byxXALwdDBb>kxr<#!aoXy-w+l)A=dG@3jj`x4u3AEVCuiy7mBhvvMA zzT>vMUK1V4Z93#lA^ailggGay0|l-|ISL-AvY;^vplPeCPW52~xeCgdOjL|JKm5fq z;=0!P;-V0T)U>>q6~wilac-65gZU-M4XY~2JrA~$PXWqN;I1MIMv**%&j3t&pX5{j zFU4z0dHfM}OS>FkbKXW!_$z^pA3R!pw}|BqZmT9Gu;RgiYJ(zHdq`l^SAQs8t~ud` zFXFq<0DTn-f{gGAbWy$^)EJfXl#wS7}BA&?IYNlp|8{^785+v`y*KUVVi11%cqw|u-}GFt@|qmXJDQh zp?VePR%H`L)~_QW7YMSpDqA|TzK?`lAHh~U^-5@GHnu327As?ZlMg?}S z;oXByUy$DQgGh_`5s`ZM0g;yRuP!ic_*1I-2fIAHv08M2RZnPN!q!);nQf^AI*QJY_2KPRlMaUKIZfKQKLi$_eYu~0s}J%U{xG1cKKpSF{P+hC)A zOL)g6>ed^Ha`%6fpO@urseI;tlpmJmov1wS$?~@5PbETMLI`^j!TgpiA2^cT9~q{m zoMr72n}x>-p!p>+sWjzd7R7^5H%W#cx5X^W$I9|WWo&+8dq=CY6bGtM2sw}?{M~K& zdpR}FeDopBPEDIIHRjtHTg-Z<>5b`WG{_vH6cGU)Y6lQ8jz$kF9@U?Z>}RGxukSyya)M zWqe^^@_xLHEC|3u0DvL9ApppP(<(Fsi^mXN^=CGC zLc>;e22zA?!Y{N4T)lfUzF!6P@Q{j%tN#Tm>b&Neb+1_}4A!K*w`oV*DbGQl2LX!=5 zAv-pCt{QTb^__A;9sWIQIJHoH`8&p^E>^34$EHk6QyoWG$+Yfj%n{al`a?D5Th{v7 zY3ixNEbH0fYWiXJ*Rx-#`33BQ=iX7<7Oa1i`!FZWvpQopTV1h*NONrN#lZnq zxBt3XEHx#f#=AhkNV&cP+nq8%9o>OdnRij`HIrSM*SelP3{i!qygRT=w!6H0g|VRd z9n{)kY}ot_&HQIz(v?-02Jzf*^mVIyr;kWXRc5gI3%dFB|B6QbpY5(#5+Kh`bC-Oc zx|cn(poefEnb$&0Pjs?%A$MTu(bU2Mjp4(f~3*qTM7 z)wjN2cNTS0i>I=%#Yt+lFW8F3VQSB*?5oA$>fAQ$@5QZ~*xI0x&<{2p4CzUBKm%WW9FWTWJuqj~~$iYhj)iEopibi@AI5 z9LZ$oGi>P65$et$wqg5&< zPb?MUXP2x1ktj)|`2=?L<&}P?0$}dL@C2(X366AD&e8YmU~i}GZ|X&brQ4}8=72Xy zE3*9jb~Zmf-S_wj#p{N_80P$e>em_8Vn^+axr*B7Q|4Hfpf>-M{k$y1cUTS;A~w)A zOj2>b9AZ_QeO(&Vv94jcVSOv~I)^bms-5f1BA3MLpk*6RgXpRoO}jBOCEmm7@z zjL`<){zl&X6V@ejue!7i`zO<;HvgDKIXl-Z-X_WYw2dusPE_Y?V;7wJ%oAGE{=xwa z4>59yEcXRm4j;a9s}R!2oiY=mOZ(zhc5?ZIdMyDZX`71F!|QKlgItjb~}Og8pZd)XjoRfZmcD zo7lM5hSdCclWfVxO>Ea|J!?)Ej~tE2kKM)pBg zjyfukCA>bT-^lvpk7YbzBj~$hb12{OeMz+^!O|@CF{8&Co`!C_tJRh1SpB*_3#L(; zkWX!3J}U>Sd+M>om4PiksE4kSW?2+ZRnn)4-ej4DCro_u+hD?B-@w+aY^=^tVPC8a zQR7nB`IX}me)AdRKKu3d%-%4K|rq%79Mp@MQ5H&>#3j;M=@Eqs}WHC68#S+h3+ zC(Qf+5;>EwT@ZT}+g3h3s3l7{ZwVE_6n>-i*<0FWBTX!N1KsYNc@^kb+L-5d7wA{{ z&G!VlG3mgR^4Z|`eb5{Edu-hs0haaeDqfqFS#gE?0T}^Yi2bM)TmhJ*beU_Qx@f>%t1E6ZwcsKYsS|KnUaSir z5!|F-=mqOt*vjgxn$Nx7Wh*qZ!WT!l>qQ-P#n|AM#8>bRO6{ z7Z$G&`#hfuFw_GM3%d&ATAiot&hsSn2vPqaM6f6TK)6Ic z4;Cf)=rJh)u#w?ylIlm)p$(YQx0G&p#9mMl-!CctBD8=WaF?HeJ<%?Y>A6~@RP%aS z1O@Rg*09{SdOMDHCY3G0exl_e3i)W%AU`bcUw`iHH+#-P9{-k5MFp6grI&z_ZepZv z(C6&VJEZqONd=zrWldocxJiYx+!8H@MX&Qa@xu1z-vHW8CxX=DE)uMq|M|TWsed0| zP5g=1C|R5A@HG(2sam2*`gQNHZ{Kd>cvWD36XB^KbB@0#V5HxdMU#stLb&1zNZhf~ zOt2~Z?*=yOqCG#tT=)z0&R_@~T3rc++$_cQBXNBp7x_#eV0$N2cFD%)d7TPwtDqaI z4ta0C%@)5CqGrCsHoo&rXfV-o#uixfql`Ff^Fr#^hG@FXTOvdkIEAXb+uJN+O%q2O zO)8*VFJyrFfXSHAw3E;>&SmV*Yt*9K(q1q?mJbz)e(F3cd+YZ?0i~iv$AE}NZU<;L z9r059_zEzwYwDaG0Ke!BF&z9ILWEl2s@jgxZ3{7a5>D7RdWWrXN5PX}ms zZC#A#0gH1!fFu<0ZaGlKpOOTvyD);&ze1~f!5!%C{O|wL9XJ1nw1EOfqgiNWX-U#* zl_WL4gI(ClBiU)vuLBBprC?5Qou48HahY=g-fe&sq_jiAk&+@IY8**gAe;zOcbEC1 zV3yB65TJa%L!ib+0X2wF9Rhy9x_9v81<3*ZrcJQ!nKgBCK*+4nQa<|)QhGiN@2GH5 zK3V{&*G}xHYn=u)q4GYG7`g_W^hfOYRt^yj${po8Z$x-5^IgcMZ-JiWRfJ$kRtUBn zn7jxcM!qSu%~rfy%dzS=h*K^|s=dZ7ewdXDSPnkNcM2HEm)oISJ`Cb{`jGdgBr8NT zw-X{_)_|@=vxeuSWke?;4+kioWb`3Dw}hfc0SH4Nz>JNDpueGzch?1Vn@ztl*LzJI zE&fBQS`|{&esynv5g-jT$gzhpu6ko#?KLsH8v6Q zbR&5jZ%BfV`DqpS>C2~4xpE)p^Hx5ozh?xD^!F^S*QsaUMU$aF5rq0xmi8p})GJHt zN7DA7DwlXuDe6Nscee;{?Nmo|PC{B*Oq=Xwn&m0;YTQ0+1O_ zvb&b-;=Y87X-pten{!zzp}Q<@ROOdevX?$+;yCr1E>A_jJV%Fj2LzZzI@0!EB5j6y zRd~Av+hvvgXNlCB(2Ro+UFK&1q9v2i%yR-pnpvGmpc*bq3Cg*3B@0;J#1UC84av~1 zLWa)&mcdv_2J;3llHrldT-24Q_qab{Qizcc=x#qbBR}R}f?E zt4|uqDPW|L*F(!SQXVyD5({w>hX8<^SdXcsZ@En`@mMKJ2#JE#me5E9U^eHv)j|w& z61CJprfVW-=JU3qd|9>>^G#IcH{dVS;dYe|@EFDvxOnt0fIk)jdh8COL#8xHb8dc z2vG?8`D<*?#(1@P7Bg=0b5teLF3V5A;GJ~u+Z#81*7TXvUz}VqYvnv>1*x_2a+i*X zcr5{@$!vY>A=0#^V(NWWdKBhUnGfK4wA6hxm;DB85&a?@C-`CD*`135Fx{L(`;ab+ zjfB}Kt6TT>n=$)^$s~LEaCwox=^|kc?wwy5e4aZ5nC4cmVDpNCYsLI-lAwkQ2AJPj z?%dZcTpH~wmae#T2XtDwT3%({Hb*$t1Hc=h4rmpC76p`BFbAd82n<(rnLpP{e$z`X z3xnaD-!cOn;26S<%J|XcLR`8XA#NtcIUk~xR^qXWs$w&smE^HfP>Stai1JV>pC?Fu zLryjUd?7#W`pyspvFyTmdQu+mDFq!5BD8YAa%+&Ag>EsAxGt%CuqmqVSki^5hp<`s z?7_mIa(+%&F~35?f9{Q)G(DOBPoW-ERD{jD zibh=Gf5Fzmr!WPwEP^3;fs18-*rd^}%yOZ3K_Fe|4_xf{hwXxfOHvbvl$3N5$Y9vW zGXZh+4?`ukF)R%|DeZBG>Epqm0|%<>gQ~Q7_k9`m{Az$g0dGr{(+-By{V=)| z`Zg_U-R2v$6|X9M!E!cdTQjwwD|>ZYry6h2y7rZm9*_3v2E~t^-xgfc0bNs<(45Th zabrg^wrZ~%jQ*73zN8_fkS8r84DY^iDo%7OUr+#^_i!CQ<`I6F#BcJS`0aK429NL` zWC;4#?V#^?f%r<^wgxM{xN{_&a$S}&Srhmr1c~nRZmU9^4Y&Cq25Rr%{B^DM;E>5M{Hv2 z&CHbu7Y6-TGYOBxUjGQ+E%A5%C;n$Te)1#yB#FP0@TWeZ$E|vWm`4@DWQAw{lR>(~ zucN0XJ@u~&IKPo5+FIC|)G}g>j;g2r-(eHp5OSRFl2~i8{3g4KOMT>Hy>xs%HR-AU z8>q+AWTiQsS@TajJJJ9`l{zV|0j;aXX$Y2e(w^cZc-rjP=G;9`QKaz(Bc;U`mjB~?p z07Tz9sMwu5r#D;PP4MB)+5as@Nz$S6F5 zVXk24oNvV=nC3=;fApaN@m{wMD2DW9UToYBZz+RQGIUCY&Yi?ioMvQXp$=@5F&;8r zH~3~`>(6v*LeF#vX$TQ$h7dQE8hq`+;RfHB-~d#k<`|4_Y6roM2H&c|+>NHD=cV{W zA9^LzfzYYMxjzxJY4^@ls9(R-Sc)5s1L0aW*Sn%HZIRK7biG&1c-=c!m!kqN2zYU> zFQ~-kd{-bKR5u5dwrOjUgSsq+t8k;chk@eSOB8L+SF*gopO?V39?{JK-G~z)dX&Jf zR|GXzqS5Z&Nv+u(h^k_Oa0@sel2^Jdv9w>6eH_-5w+TOaNpjvt#V+qROOZIGZJilp zTT-rX2Grt!UNX2)PsVMT_&|xkruzd(0%Q^{lMqVMEMZuPVb5U0G&~wI#$fq~adK3D zc(-dUc@qs(8y)CcbRzZtv|*=mBTjkJipD8qE}|6yTGw%Q_%2P%*{Yqb9orJ610)qr zF@(D3K#t@Igb^FUZB1x2v?wGa3Nz?P-;nV-goGoR4q#1t-H=!ajH33y0E}pa2pWcr zs^a4w8#;b2j*vM4-+`RL79vXoeLmkxO|JZwgvn&KI2i2AcO^pn=Kx>xMDs z(BgywWG(>k;JRV|eHEFjz{LMXw{-L|M?vKT3Xh|3_;H)7S#X>yIoO9V$n_nlPc)7| zq?PT2NQKyy0d5gkPtKWQNO*uuu91x4GUddGkc7pl)#WAw*+UI40Og)cxp6 z;yxakcFusqF6(aK;UAP4c-&^#{g=gR=(i8Y2FXjT&Q929xy7GZOeQ{k-D+ri63QR7 zmed3hTTOuOk?Os6%t1(cfX)1(kz>qv04Ejdk{`qR3d$UfO&SQP{#!^s9vj%uO$N1M zieW@-4l38V0SiEdaXDyuLuxwdnlKC*ouL9k$-+tEb;Bqq$mso@L>I4aSfkS{lO)ej zpb9(nsI{*KQAj1vcA1y;!*o-IMC!Ub&_bf((5Ymxv%7*FkRvexjYwQI2Ykt%B$+S_ zTJ|jp>XhM>4h8PjAUnlSU&O8QCGOQe=vN|e8D-!yRs=2)posCcMS^i0v8r;uC zJ?J?II%c0WZAqq=A^kFRZrv3>dDf)qv!(`sGKEa*E*O^n6$3yrM7v^wBb^yn5nK?8 zp5YW1%oCB=-P;HVS%r#t3oxcNj(eM+BaemRUnJmJerpNRJ#;IO{+-_&iod)I6}oZ- zx@#>lBaMYaX4uXh&N}Q4p7cjFIp7)62&oJ^dgUG%-3sD^^b(Lpy`;htKar5jlnbTf z%8nJ{CR3qn?4z!+4?HLYWaKcKXb9bqCz5SBA`!~25O^mE zjDa{55`u9oIgOA}9Q$44&S2qF1W(LJWu3li>mYp*k3z{KoWf@4+5nNPGK$3Qg#s;m4yS{%Ke*zJ$a+0sPvLx@gFff4`zDV$5Rd;fXzg!Ax%4dD_{NC0w+Rp-c7Y57qRr;7(;^@mkmLT}P$ zDL27wR76aMMh2axn7~hO@(h2^>sCH#e?DKm84!#n^sKR)m%>SQ~4HCr0WJpOc z=KrS@m4r|{Qi`MVXo`Fi&g=u_;$A!{NpFK&7i|?$!x51_y6~<6FtjVz3l;dR1tL5| z0fRq-JT@)((;|i9O@HaVp43`^t6J25MW8Uo@!sc>KM7*5bJ?IZ2Z4Ta?VJ(Dt#B}Rs{1EdmHMkJEdNH0Ui z=hTZ_Vm1$glubkt@%KSK9(iP`V_9VuY<(wF6i8T&KXKV)Yl?$H2|7XfBzt?Zu&juuNrj}Q2dHFo4LKL*n$6=} z-J(++*J%wyPGWVs$+-*}%S7AivScWzK=2&qdAY@r38P2 z;O_uVmvP*dL9)v5zfrUhMVPA=)9hUDwHY*gJnFf=u{l!%QBfRUbxLuXvf!Wa*Pydo$)I$rTYjm25JZQ@!(zn z&6RU+AqkC-bEb^ve)3@s<|s>RK+|pKl4v_q(Qun{EhWVJA)qAWC8UsnushcR_I)^7 zjN$WK+Rw1MTZz!GFLH&`VDgxXBIH-;^P8j`*8NcH$hdGZD{vd3N6ZQYmOc_t@4t#l z82a_%%9XW4EgZKxLMj=~Z$Lm)@J?$^)2&h7Pcd@WL~>W(*i48y4Ev~L!DX|gA7eH! zMoh|3%N-)Q(|j=@lcFnySRLvcxB9WURyI*YZQodjn07tUuZ#GdnXpEh#enZPAcoAT zDnw{lSs zKXyUW_=km$k24m^fH*AgUc>fO@7fGe&$|dMhXPvQ%N7tAv<(?c(1obcG*-@GsRe%B z^C8oSYDV2>o z+|1FYtLS{>_~TIt6-bGExXc%z7PpGL+=nsJCJb#+k)7b_0fM@F8lLRV?p9|sZc9gF zRcH$+*KM>ATQ_rbq&`*~>PJTr2CYqfqpf!5+<1fU&_sO8fn!4Q_%|bR{Y3PA^-sw1 z6l5u0fq07$yHmn{1|0oI>>VJb&4kcx(i5bf@w|#U892Ffs6ll>1kCBdfvO>TsZm%3 z&!RR`A{8R&0z0X&_{+{O@v6pA7o{5|9j9xx5~|53LIzTF}mqb^bn39Y2MQ_w^KH-+34Jh~QV(wdEFLhGUH`sM%dY@KZ^wQZo!J&mmKbjd%p#lfcfM;18-BD; z*j$~)P*GA&d5OTs>jXOGp}^w9rm(!Dk?Q(vcK7J>>gwfe*0C1qCMSFCSm%~~mkVPb zNAUjv!9U~z27o`X-FF-tWIw|Cb%r|G#bZ0wplxhTVS9(Gp770gg$o$H6B@u1(=2WY zrL%ZcX*E(p9TLhV)NBKk7O~s10YD|IEUu5PgTC-5MkH+JjX8>u6C=~8FqP27cITMy zA=iGfL&F9f@6hb5uW8+&Nw}g}r{fvAW-vZ9U#x-8zMRhh(`g zyL`N*I&}*3J<(DP@nv04gsJtXu*oN;*B<+d;x%soWcD8O3OjWoNDY65Jv?EHh%+JX zXYGL3yP|GeT~>Hb0nf_Bb6TFkns)B0H5AvjH&E!Hl6je$;;S@j7M4y^6tQh0Dq?Ud zuiTd<{m|GE@&pMVokZOyO2+FYH(&WTTO&$v_`78sc?xExBqP1vq|15W@d`HQUnJu; zKpmCDw>kd=jYQm*(D${hu0%AoUldP&yuQ^rIaQx$owy5cTJ(&Zcg4AuEU>z~M-<}G z8H=o$;erDngJSq}oXcUv#d1UXJ2f$YrG10><=T_%$d7FtRVG#pV|HgQt@Lrq1T|&^ zP_y!o@uSRXEG)2SP1%fv>jD69U8V1a_A0fd|PC)?o5G4KS-K zHro@A#cwI*qrK|GlxMNGhACYL3LSitkg&|^N`dNPcX{G{Xx=aZP%G~EdrVEyB8h>hQmslHR3w~#)@p%nOhBvR-F>pc2C#b3NznwOW*_^tg) zax2{Y%0^?Ot+pz$IKab%W+zz%EiO$(iwA!1~Wfm-n_T0u76NkBATEbY*L$iz7JfdYkz<@ZgBxWhA6 zxA8yxrpT5F>tfIP3G1$sJ`36u^60q9ZCdjZc(wu0a_gQYA`_nr=$G2713C~*Z7OUh zBL}>8?9iDW;#Tp^5y5tEFktF!o5;_2EZ8}om}mSQs13M`MyWf=}x$_cH< z%<4a!!Xd-Wy`*xl*oloN_&%KCz!Eg=%3(OgGMbf@+qZIYpV!7d$MPQd48z@QBnL_5E;y6c$gz|KBdq!5%40bC>JZC+w|ryDrF#DXYwNg*O= zbL0r));=XUlm;QY;gj*!xGIwo-*QQ6#81%8TLi%uLA@k&$@6ySIqc%Q|<5yl~M18m18AWHsVbq@DIUMKH(g8l@ee;J!dAc38uCO!sbcZSgIO#p`hNI`!f70Pjv&k~4wjCtfVzz!BAOA0)uGX-=> z)+N?p#iwcLn%FNS`cTzs%I-kXkN#!Ei|B^Zh>6mOpT7uMeIaXQBOVu6r92LNGRZfd zFrse5)vyrT@q2v-EzbUB#RA=m{lOs}_;cgCwyX0W9s%(bQbbcY)v4%G8giYCyGp!uL zX7GnRyK{y#*nd|6j4C%-h_IY9fNb_WpknBo znaQURhHkgz0$zsO(~lV~Mi8O-&BH@PP8`1=Quq-6&fk#a8S!M4?qVWlNPim!%%QoB zA3^2pr+iu@=3xhKVV&Czf25`@dlrC*+x!W(?lR*F`Jl5ILbZj(d$HlCu# zoC!R9Me9po;dTICMJZl@0ad;ozb=tP6r4+{^W}-`i?adEX91X_l>8=_=2)D&EOYZP z>yMfMKCgfHg{@Jvac10=c=(4-JDbVnxPhZ(@cEfsUFZXjt7EjEI0VMf58lzz~}~ zro9I!is7xwTgj7&S1E)+%qSFVzq>phGj2?sY|b;uJ#DTyI8m>C9@BDE!p&IJv$~h$ z@Uv9MiCdY^3V0b`2LKU!6KS#I2t`~xIR*5FsIm=toBQkF)sP8yKy$=|4{>uG;3O-- z%VkXx^&o453Rxi!t_^1=k0H7il#|H%B6Qt6A#yT4ts>-gK;YB+NkZI0gS4H?$?X9U z-J4&BDv8b|q{San2g1Yeco67S%h6xc(GQ3c%T>I?#CLo^!F{Kgc*zzK+RO$s(*F*9T??e51$#W^RVqj>uO!|ufN%@v7#YAX<~ zBnyOT=tY}>7*DbeBw1bND*IWjKU+GEZlbP-&r6o_Poz}6NUE~;bwecTW*_ z%NKvc|8BxRNJgnJer<@*4ADLaEU>-v0{6o6C`#K1r8pY+sf}Q!TOG2;Wc>fM}3cmX5!_CoHdVQGINt-=CV55NQ z@uBSDpUr)nqdLhGLaEDqK97Z6Y(4Z#xUVos13}&YJ#;2iA}Zofne2<-k^8%naL9vK z{*k8%2mVu)|r@zLw%f^}#n_;iO_}C4gZPmCu zTCY!dD7KF21e`_)5C1csjl~VD_k-99+zNjwh~*UdIclRe)IRefR$D4qQKtqCV_aUb z{OZV(OkVhr5Hc2IK?*J1j2oCPZ(A-&7F!sNltuu07hz%uDHzkq8Fnhfb${9im)E(l zqp|j$ko7q5ZSGhop(?hzAFx4uk^1voR>0etf4wW@36finvAg&Q*qDUcRs5?w%GxV2 z0wl)FJf1Uzg%l4^lkc**#er(u`|OS4?&_y@_F8FQ)vjo3-%>hgsjC&=8oV2X!V!~^ z#h12YQ8yc?hX%1Vm)5Dz3}U@X;(8oFG0sP6#3ECEhQ}D_ZSf(vWJX?$Gj}mclBeOE z#_r0ckw6&w5H}25dCju&axMRNY(xO3>{q|USzwx{YKos#j)1(0orPR(S1<5$G|y!Y zLV|do!;7tK^5qFZ-wmLOMf~|ebVNwngbKe9K=HkrjRP3J9MonzAoS%J)TEUpULT*Q zS8Rrg;7o2eaR7_>yJL%5w}h%+^P$dT?ros6(Q={rQ`VK&daL`aZ13OCsZU#3`zvGA zlLOfDD{j>>fHf}dsE+N=2A1|yuk~lgileK1)?etcZ_`2j#Snliww87`1cOc9qIZt1 z&BCu*gMNfOCF9V6OKzj*e*PwcLL{0~aW0TPfW3XSGch@KwN1?tvW0x`01_uEmPK6~ zs}{tt>}$`eFUGLi*JG+QjHzTn2mijGP^*8a&$a z3xII!&3oY3bs#m$*Py&uL$RSnD*lp%)Z{4qt&%(y#cMI#;=wz4K4=cmX{G|0JO%W+ z0Wbsv6Tb$*+*mlxYF2PH> z$_JXK^RqH9NdF-7f^@#jKO+5gU$)|(#&!Eh(F=b;-B$hBj(>u>&d1OIh34UW7UmSI zVg5I&qqmEP;s`oNcUxvlylJ~p_4~f8)~){j_4}YIBI=E3k{fT#;HwSSd5hlgxvG8G ztXreh*L$>03jl;q$VNTqS>8WZ<=B*3%~7Moz65H904~|%`0qu+1u*MC>C{l zh0%x!Ef#V!swHBwW3D%z{dU_K&=Ej9{(9Yzbn3dH-Val-2|LBmqsA%RWeoA2K8|JF z>8uuvW4rJ4YSuM~IxuN7@-c0CTHXAJ)w|nAZMvR4b$6J$cO2VvcWm|QA5pJ9#Ma&O zW5M^@s`ef%{$5Wdkgd3vP}7C=GNxR7Qx8^hZ=yOFW%q+?F2K~2;zh6S?4|pyny~Id zIQ{fzxVH^!Jd6e2L&vb(`~JqavD7mxtD+AzZzQox_nS0nuh;Q{HL;`Z&9RiAI#)-t z<`4X9c1InkrcU=H7W<(6)05E>=#T<&9{$APWFsUY6}hBBd=IxzH_V`%f00CfgqUX8 zeo-iyRvm~w7cmq;A-o?7QOEly@S^9Yct*4P)tm=`sg*BAGQWpmHS$3ZFTm~E#0Ed? z?|<@LBH}MUBZQBCkZPSLOB&;aF?>?!(}!(q-}w_?w@tx2`sR^GS<%C8>aOlAz%xue zRf{EiLe!jEY@Mf5-Sj_%zy0$G{OE2ZJL8#{v>YIeo%`VnB-e0AO=DaZS}?)RmMq_sM^SVfA@}F7{MRBO? z1MMqC85uDwQE-&oqHcMAYu@W*+*01WYx$Sk<;4(aq}B&oKUE1-xmlZ{Djgd&f{-wp zJZqicowV&$l&949BDCsNmDy^OPTGR1O6-tjXJn7==$=`7gOifZPCzaknBgdo=~0m^-VnYD$p$OPKaWH6^)Sz;9&y^eq@dz_dP| z(8@8JMHr)=5gJP;xCvSOJ?L8GF0#^VI#!A|eCXq^*xCFJ2yCekQA`f*I0>|iI$ z;#~lW)51s_=HmycT0S2@k4Q&~6nBwwY5c4X?)J7(e-}t(aIt4` z9eZbeQJ4QcT}Z?m3wl`iM&BUEDeZ#@(%$-Kwe3)N>f5f?F1Si_G5p|ThCXQ!{ z`{#sXo+TIh#;z@_qqOi%A4r1H*%5Uj{?nVR#7(vuAi{l=KP5q z%g|aIQdcpB?y{ko^+AkYh%=-IgP(0;e?Pp^;tl%dw@^%N*tbe^*HxNEt@)W03$`Vs zNN3R=;LDRpe4~Z7>clCehtGlEqIxXcoQAMmV8c}hzp3%MN>B57SdW~<1gvt?0=s58 z@lgVuPT;OYdq$u~c=)9dEzzK~51#X@q-Z1*667@ewd4iVehI;ZMBVs?w%MSx82bVW zpfH-b(mRAMy+8lO?O}vi#xn`QZT1F5*q?6@8Z|ekm?RG(c;7cDFE+msR;Y14#o=VI zlGa))qhgLZ^#<`k_1Hp0!f#s=CGpCH3_=+NVj_GhOmj&A+Ih4$jiVU%-QdY_=0rqNg)@V8+#?D^D(^V`x6Q9RWAjyD0 zhlN>RMy^zfjU$h#1M*h!g5rGmDaZXl5mNQf0g+n`hY;k5YX)Ff5%CnWr_A!0ii2Qx zN;b9awUsiag8ZK=%USV{0;mCqftdGv12DzZKLoup-lml{w7$}=W+vdo=j&i?S$)LR z++b}>eI?0pRCHxOD(Z>eDQH}We55%roZnv$s2^1X)JM`hD`uXMg}%W<6#ga;O9Dh*5#JILmR5WBf@TM^K4Z_$B zT_~{MAD8k=sO)Wdieyw2qsdIrtwfL)JMOD5V zWx}NATWD+jlor*p04Ofi_WLQr{lV7T3vB!Ag5ZfjBuW1eEvm87BH||6V0HT+>rLcv z17e$$ha_(K5rhX=D5c&ASCn&Z{vbxpM4&6N+; z&wIStLb0o}8ft@)Hhj4|ksMB|HgP|Q`tjz5T22eaU2{kexhwHpLv28SGD-DqsBH^S z+SHgwIy=iBG+249p;jY6X1oGzH|UB|J(C@cM76fC5Biz|CrmC37xm(cqjXEdHjJKfZ$ zY0-H234}x{aa$6!S z<0CcSV5PC+pDtoG@BIKNwgPMA)xtZP-Xpuh7R&0%ZKFCv@dPMdQ&VZHXcrWXe^(t- ztcI8NSp)Z3yYDlk7grOnSBQ6;;ftmPQJsiWbkLBaH zhGiR(gV8qA`=5D;8TfUwJbW8oJ07ewaKwmsj-PjWjx5tNHp|hF&g1w9@hH~RhF1|^ z$r17pop1AbDQ>eBB?Rj-{OrN;-Zv(Lki!b^*j{`3I%+BJxOwR zJ?-OGieKbn)WM`rULCl?AG`z-`r-agpxP#m3yDr$?C<53JQj{WSYVg(c`s=XTPaOi zst1T#8Gk?ZQMG4@gZS(wR?c@ETF=(#7ljU*H{t$AJ})&$t);Z2rkxf~LTM@Wz~PGs zP@>C1XK*p76^!yy($yfK29xTDHbk%tHk(3Cu@f-kAXW;)Py@p*jloduzW zRns6pPI@N}@T2eVSzT3eSpy%FcctvYkBML$$2Y#+mLD)1sWgcHNTzkhrs7L^M)Ju+ zBp(cip^G98mYA4y5@EdNN*|)eYcrq6$2$wl3blrzN?nH^iUzxTh2X{4>bA6^+cx)n zA8>Jl3!fusAAkUZWQUu?A;ke&Hu^8D%n}XA7=ucej z0%xFLbxAdH20E+u#5^GxgAKy7!zyaXkAk?oixyF9#EU`JeDO{-9EWBYf8pW>3J~BB zBfWhf9iF1ZlT`3qb%Y+U2Y~*ERXBW*uEwleOzJ4(Gtd+$f&w?LXYn013BfyW5jm?< zyz7icKeLyh=66ykF|9|!UxN!ly|_UZW=AP`z~Ur*v&+&~K(6q&1=4PP^J@LDp}oW6k=l=60`|PNFQA#Rb25Kz5vT9;V411GEM<|m7SRzqDl5Y@ zdqIg1^NTK9Z?8psd~wf z_S$RVil5E=1V)~Y(e#ND@j{>5@-)ft_XujnPU`qHh)?nP;%d0kK?ymU3|+Xz=d$>I z$D4>P$*UxJ&o0X_;K2^j#ul(JI?P9_q zzD7pge_xfI_9oJb);{Dv1#5TAO1S#REUjHvY%pG&LyQo$)(WfO2A$jVdNWA#+br#w zuF5Qjmrm!lA{7!K=}GIJ;TF`_E7N=c--*X+n0vg4sd*Ys56G%#=n?4^q_l7?SN=nO z@PV9A<%_pZ&;qJ!vi1IuuAl6a9kakK4e+ zZQcn0+HeVrRvs!Ehr^e@@J=edR7(5gA(EvS5l+t14s}za8ofD72u1_xy(#K_9u=xggs*(FpGxbn<`#WXX0%*iz>NP_e zg^qJB@;w3CoE}P3_0#7xcMqk5;n(LXarAkpecMBcs2)8HLf(9!sXdk8YSli$gRj=U zr($XP1C0XsaNozm{2L}xV)_^fw`u9PFrf~(qiyP`v>GrT7<}||LR>3}djqz?NR{~7sJ+rMDbJ#g}B9puc?ufMNJi? z2(@?sg_>)3uol(t1884bl=k6ecLi0N|NquZ4E@o#f`$S61PbJU{SkT=UPrRIdh@t@ znyI(aBPOW{wTZT^Ov5OPRW;%U)_set)++d^9fZbjrx0Pps4LvjlTa{L4+Kq+iF0<~ zeePtIb{QwLXf!V|5m+7>x}Nd}T0|0s{2j3^;OvKsV9F_TaCd(^N&={J$=c z$I(=!=Smn26%>HvE@_hJxGAeKbE95EGac@qKxDBMMh6a-k(DeH^W{7?MAU<}LIY3w|54kQvWQWoDXy&k=tY@KXYqOA6&jWj>4Y`(=JLSA8l-3rA7OvP=?=e^Wg(!CZ0#jOd^kzneqBhjfLLQ zw)9oT1^xJs&!EdSg z@acL%!av%Qe#+Edw{J>q{fQKai9p2bnfT4ivwFc1Suo!2dSN^Y#`8m>pp0+7sRhI+ z6Y34YGqnV-^HwwXR^feaYAi-+*Q%a`SNioyFF~sRcwmE6KWO-d_D778Q!8{f7B=#y z^Oh@dE-sHmV~ zCxW7ag29dj#jdeo6iX}@V+rJj1Y;R{u)dg>h=~R@7VOv(Of<12Vq!Un1uItW_nSTE zD*C?pp6{;@o_l6ycXoDmcF*?Rqgll2ziAK^brj*{zk$1KOoj}iHl0Ls|IyL`Ux(5I zL|F#9My1YnwVGT8$pVcN4+CjgClPDn`;z%9bNKchRCnv>U^OitNUu7HO-i?Mv@ue& zuF)7Qcr~IdI74X{g%8_F3*NYgstunzE+lKD@GLuY4RZCn_sAzogeq<0X;75#bu9u< zVHf0i!D{%nk-oL7Mp@cGQX4y~>EZyX4LU8jQvAR@&bWq+DEGfMfSyR^2msO(rr zlXka&_H`Cj%4V)YfQN19QfJYzY!4UN`Wg2B?53wE}O-iWZH6n%tK8fC5$)1q`;|eY3P#e8T6x5=jv-%j6Y^Ykw

TCkH~zQy(aRxmJ5`7g@7a4Zp2)bL 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 F{{bmvgsA`k diff --git a/src/DiffEngineViewer.Mac/runtimes/osx-x64/native/libdiffengine_viewer.dylib b/src/DiffEngineViewer.Mac/runtimes/osx-x64/native/libdiffengine_viewer.dylib index c80b369d66d43755098b1fa3d81e826b89f1d1cc..9378285c33e68245929f6a94c379a7f33320d0cf 100644 GIT binary patch delta 130383 zcmbrn34Dy#7eAcmAxMZxFvJpqAoc`9EJH%V3>jjNC6?N2DVh`|CK|zb4B_I@g{D*+ zZB2@@#bdngJW?NCdr_thRwU>UT4Sg-htNiV{lCWvSZz`oYFMU1Z^)a&~5=aZs=S$G>2K6b~8qNE^*KLOE5hPz3gcU zNe;`xc|Nj`o<(7WX2HhvA7x>>yAAX#3gb~2oG%Nr+|1~i3U_5T+oSl~#{T?Q?QNYu z`7BnP%}Z~?31r^31xr+2&V?7TTzz4;0Y?pm$+il>TKl;Mlq z)Juvb^-$o5sF6_#QKOeBWcmYY!>Hvgpt)Tt<}Q z!ax#S+7XvwPnio`MwD=A^PgM>JZ8PS)$Vj=rsQ(Gs^n7d|H9=?rr@&H4lZ9kVefW} zGHw9~3OgwjW_oSE>cu~N#O`)$WVbv~yeyjW(Hg3gJ=5iK#X7F?Z=pqle@sfDG0NcI zGuY5HCWn+;8_0&xm>ffB-b8~jkKbME1!W(iqK6R3=J?=!;s9+l1ObaPjp*4NclnA} z1-&doK#xd+zW^KjZ7BwS_GV<0%7;D_0#8^7ftNpKKSqYx-+74oj)NA>djSe#((WZT zwxr&7CCvwks$JYJrEe#suYj6wpjB|aSjX=?jVf#Au*qs&fUZTk&Y%E)Esl%i z@Z|0V)qr!59gb>fzkS~$;!%*`W)y(j&2%YZ9eRYQEpU}0j(3-+fRH3%&x!cgUBVM0 z?h}-}6DN{_NyG#2FSm$?!4x9SoTS$NpCS&r&${<$Y;WV1FV!5dl{#ZT*p+8P(mv30 zX}g|+U~qxngs*vToj`1bUE6?n<5eEJHWT!qiG+lL{9@ob&0oC_T&HRHd>GCSsSDpR zR7@w2=rq_;-En1LoW=3Tl4@Q9G*?n6h)>C8PkJ=2JXY3Isa}%@EIc~6QkxPSABm$# zoXxKTC-**E9o?|@RiUvXpm=x-QS6Tvz4HxP)NK|!9^IxTLwRADm~dCL<9_MLF%{Sl zvl5XCM=J{7GSrJ^o1&}N9#TTlR6?;5QQR?;DB8>X4~iEy3yKTof#Q46g`nu=HQ3^~ z5;b@rKM7+}2TV2Z1fnY`5P~lI8e|J+Q-RdshlJ!br%O`dL~00;IyJGCq26NjBrmTx z55YG|2#zfw7(oQzE=6#tBp4|PUY-kr<^DyGW%aD1+-1o<>!^?ZVQ=>gQ;+|{e!$bm z|FFWIozy;mvnIVv{!QM4)P}UV7<^!~hhMR2y&4$TzXUJTf+0Tt4xG?I`1IRsORosE z{%!Vaue$Ae+!oOAdwg8UovGw*aLHYhlDl5FS!>H+^TNNOiL@NU;-_e{)sY+Pn2=}D zk~8`ITcj>@;Zw2N^o&>sr_TIYk5EefsElJjinbEr8XhXPAkiH8Pq15glEs8jqIt2IaIx0F!u3!>T3O2%k* zuXl6fwMr!0Z`^>YFfg>o=iXrL`_wn?L<#>zY6%z?#{u5u2AkHWMN}+k+qCKA!xP-q zozLOj_=^;Im$wEY1_O&63=Wb{W6<;-#?JNWs@mdN&DgZsLx5{_oOZ|S_TmYCP|SU9 zv9Dt5s^0PJTx?_YZXr`_)l^u$hApDb)oi6C^pvdkjDarhXaKEO3J%;lO3}?^zH6L3OUVRzRB|Y)>OYNV1<1< z`5!MJhQc2q+WrD&>enc6;dL^@A+(gbM*IyyoyXl^v-^!y8yB$rej)wmzKOo$G_UqW zhjJQUt3dJmDQ|;p7}kLT$DkYq+r4E$O%y=W7R@hr5J7H%GBS&jK`6C=#l*Guo5Y1U zq^3@Pv1M^Bre$uBe2{2@oLXLzn+>*-Pdds`U@j*MhLJpiPx=4ka}W$BdV-O#Tk2oI zR>yq=g%9FcaQ_i%zw0cye={{Go^9)2Up-X7j`gn}IrXaIrOga8d>Pk{hQJIc2r|NZ z&_%fgg~$QtwnxVdcku)~ej5y*+)HUXq0hR`S`LV;S9s+)BEioQ$-A;^#en+C*s3rH z1)_@L>f&X@wU|GG;M6bg;3~S}b$OG=FUy-8epcS>;m74o7C$0yGI_SV$>5)JR(Vj2 zPe-I6(Aw-_Y~-M&K07hm#O{vtcZD$kL_-l+-wl9})JAGA~j)A+^AjftZW<-an?Gb7Mzpa1e3`;P8HykW(}lY`&ATPyk54I6H4a7A z%0EM;5<(kg`KPkHB9*TxU7jY(SIY9GR6e_O`SfSyF<{USGXXxJG{RtsFhdfc^p&?M zU2cA^{LF)0O-4Rd)TMn`lTkzM-G3whpC8CO%9~IgCU3%c6L}NK>&lxrZj?9iypp_` z$;*hFuQxz*y!cll^>qf_7s~rRbbnFapT)h%_!A0#07OQOT~9_WP{t1YMRdYE-do<} z^C)?f$s^=V7H=(Y_VC8?CW8mbn;c#ZH{{oq#Pu34E3U=-@dbjr_&*oe`7s@Rzj8lr zy}*LT*6`ineq4Nkbsby7KF9qy4p*zTFf3M^A7*jP596cU1-)^N(t1WXdPJZ+66KL7 zkK|q5<;_IJo)(LvhXn|6KtOgoKaK~v5qt!~!gv(KqadD_br;+^uXwSa#y0f*88;;G z{_{+EDam(;`?33Zmhw`dZ#(y6@OifRrAXiF=Ops!bL_8|UiF>sejIj=O&Ql+t#_7f zAJ?$!t+Ujcp8gQZAJ;%KHSPoX8CejFhhP9h`4Iqc6Gk)AP)sC4`R8X@-c(V{8{$$_&BxPS@zBNnrh)0c4mA#b@v(OH(`jHaE48o z@Ki16%O*@*t^R&;*ZqlMikfwTHJcn;bI>U?#hD!l58lh+CeQ)p8s<}M)#O>~*?gu> zIjNS-XQ!v+t8I?6%$FCapZ~}jPfb-@|HwX`+EM-I2X=MpQ}v%??CP}1>hfbOZu%g# z-7)sT^sm)9-?MQu-d4{aUGvH!b?8x+`pWz2uA{8!OuO3V=&p}uPFK`}d93E_57e5u zZ2#;T>b4^+{M8|9|0B%t>Idq!!z>&Vt*FE7&BQKhnZxW%VsrKMAyzi2xw`GpuJEKX zsycZ#Yd>eAI(|RfG^dGrW){nxlTat~5Hi9Xiz6n}qQ&Innq_q^2nn`0gC@>mk#oa+ z`T+ss?QnK*?iID{O!m>d##JhXA^K3ly9?=Rtmgf=HT!*DEA?1wR^|1r zb*{`n%9UQ3hVbk#bajh!cLi}Vem{eqdc8y7y=)ryPseI8BtT9qWiGiq>;P*pzmw{} zl8u^QN4@Q23+BhD7pAj=^GB$^f5UdzXRx1fQ#Q)3$!q^h6nV-1oU z`Yqi@4o9Oj&-$7TNFJ)z|CW86+(MYpElBe3ugAoWl3@_sT2P8tmtVOC(?;%yY33rAsl$+_Ps&Cdm_6z~Uil zQX@8HaeMX2c=q1nK=qID?CZsC)T*DeqQ!O99($M}?Pay)6s+idwXbb#n|>f852^J3<3gxS0qIv?7yGaOX32+|k|l z>(7M2`L54c?d8!8r;A4yABHOe9Hy)kOE7c{au-B?#@<*ys@kQUvfSX`!#~Op(9@s) zxRd>}e4iTCjP2H}>W^7#R=k(T9YRKb-cjC!x(AbHJJ<&2*ea(!mBM~6t}cG?Q&w?hL_>%BF$q@)?GK?54Cnjv zneKv-pR$Q78~H}LA6tIP)~#gKHf)#7D8^MljH|$xY-e3o)l(;IX9=rLt0x*WQ+gwH z;wNlmdRx`}30s}s#@FW)*`&K4vmesOsp%iHHmmoy_zJ%9KbrK}M}kYRyCqvbV)fSa z^Bn~!W$Z&fVsqDY_N^%%UEKR4mc6F6@16bZ%rpPeH&}TTC1bCG5CsFGlUt} z&g@a6I=N#p_Xe)T8Iwi#7vGol3NryqHD4GgCh#6f1!10w1_}>$8DB;XtRvrxbtVD3nD4D2 zMY@em2!Rk)jSXJkzFmNzT+Ce`2+Cqcd~UOB;}yU>lrIr=QSo9`wr_oHb#GPn%li6b zgQ%V(0Sg8(x3G$phb;w*Gnw;K&=c$tIKrL4rT*nlxy8+`M0)xypks1l3YX}&`1=yw zKjGj+PeQn^J9^}X_t_{t*gOalWh#kb(A2mA#KHKuE8M}wjntg994w;`6mat(x)`GG zCln0-Tda9@9>BiVO_hJ@47g@qhid%%7WP!HWj~rhk>{}GTUd+!UEVhtfB7x}&V_W} zqYiWz>$q-loI}v!8=!JpZlbY3Gj*v##YIuB(=Z4AqQ)XKxHv9iy<<9|YNkK{_Ih~* z5|j@EjQ@t1B<5^v&o;k`=zT}a(`2k@3)``wtGyAJ(>eo|Ve&1ScTOjwM?;@E4V3s% z=s~QrV7cNZ&wH1ia)sE>TETY$ELNpW-=Vr_z(b2>%cK^pdqzMrcM5=yh*ekmixpbg zqGE_YL%2W@kKV!-zFECiI@w7x|BVZ8k0LpTcNuT_vrpfwZLcW>DUsn4EaNR;hd?$+ zGy+leVXUKogt-2mhXNLUR{0AdFu9aMoFPLA6&?gytRpGI>KGLU=A(%DeyWP~A3+i` zUO}mBF3)<8#lB^-uiiw(2~Z!_cC<#(gr=GAf+X(*RI)aO_oqC95FH2i&4R^C#J; zes7OZ$G^v3emkh)-A;nL)kO-4>mZs)OFTUUHr9v!s?0umJIMZXWvq048+Gr9Vl%`% zrH*^YO)qz&Fg6yTk`@#EIN)g8TJYxQ$l{tQU(n6vr-kZiwZ5Ft(?x!W5a4A$iIQCO zn51CXXx}?T^Cy(h63n~rC>`*K)u3y9wxDi$S7-q};30nlRnab&u{lHp>1nbE3gVOA zWy$Y!wXbeZDoe(SqWK64c}2nWV2OJF+}Gokne(`pVEU}vk+b~uHVHzyDJyk@J{RkF zKzctREd@`R=jZNk*e!57%eN6ild+E5d|RBbz3F{`_R{7c^|*Bed)B|lQU6|4!mGZl zO?H?DL=RQ74@uv56I;Hqmc6UMJ{;~UA#;g06EMi~3Fg9Ipg%(6phJr`IG{eLOv+|LtnSz5uHi#MJ9nQ#B6*H<^${}!1nrq6*fXo`5>+EK>KNP?C<7{TdZzQsBB0d)7?rGM#;U(sKb_Jn}ZXjagsl(Z!27jP_( zq^1#Ahb=vlZ6W>IpHGny9hdQxO4-Cp9NyrOIy zNH_Gfg9bIB@*?TH=s|GOwOI3oZ+bej=@*ZYZu4Bi!!92n?nTgxe3$U31PcTkK!WL# zmee+j-CWT=_#(9G5hNwn=N_N8p7fmioL5W`Fp6Nw;ch)Y#2}vI9`bsY646wMbQOFD6hO!g={2S}@el7d)buUWw zwSbXSr)VZj{lzl~XUO_eX)!{gXG(Lrb&M9W5=omqlT@SJRRp0sFu(9sGVunis+TtLCDM2&YTR}H zJt1nQBLM9cp%Ci(5-`{T>Pr|yb|!IkNf7cK{8gwgdF_kpn<8MOzD2E{sZR*hx0FDp zJJ?PrZP3or1%yExNr8e%pz3bj1po$NCPSDk!1>+v%1B|%eIzkVnt3BI`0s9e@3T#rF=hIc*C&+t0_P`Jl7P?h z?#ugVlZbyUz?5E|!lDtSEhVXUhV&@pF%~b86qe3qov;I>54WG>^MDuYm>-OEGeQaz zK*9`>)h+vaOnc?k2_(B`6urWG3a*Ft%_$AO%v-x<)J(mEFs^6$T{S@sM+}fxnZI&j z6M+W#qNo5dbyb8kG;_U?&Wb+@w@(9r=fZ2yuyoKOul#@>as5JEaR|Y*&|R{^UGfgD zG{4r&Ex-YeA(#~Ng-(KF@<($%z-*4EP`N+xh@q-j3<#Axx(iA%-SbiYHA2WMi>vN$00NgJTU{Rk2w$XsQ7`p-Q!|NzH!)ja&%#d*c=RE;2 zT^~RqnwV%p5g+Dc+NYuF#+7XMr!neVkJ#f+>s6kD*&#xJuRj)ZTCZeHchpr6Cot=d zCh9v0Z1#>W_VzUCb{daEct}8}D3m8a}vX$ z8V-SUOiEozEpU)&Mt{(O+tl?%Ra(h)#P#7H&qm!X8(NxxHDq~Q* z%J5Jp3(Kmbrgvn0v)cHKq}lA!vo4oD_5&r5y_Xf@+Zr0Cj?ilbJDye39)eZc+Xnw2 zy5i8JAvB-+i8X(3HBQA=Zs~&w!1FHa#{UNkwQl@hmk~wp^Zot{{}{2evfO_6q%2tIujRuI5H{UyVNjg?N2Vs9PjzeqTbh|LHDTjH_FZ(@ zzW=31!Xr|Hp5dD%{_FpVKi-WW@(kZk;twGFNiXPqq`SgDSS$A!7TYsuT(kdV&`#p} zxvxg|HRyBH=UZgW4ehC|Ln^sZ-PfQ6g2f3wSz=AVq?;T~oa{pzz5hZvu72*T(R~ey zCem$XrHJ_#gP_Dh|XRSxDAuHk+_YJx7cY;qYW@1#NjrOy}rA# zJrmU}+U_`PKJb*qBu|FMEFmm*Zz$2Jt3uca? zk$40{vEycS%(37ROvP4o)RA6sUiS_vhQ&*~SiLX2r3?0VG zbCN1V9a*}}j?k&toI6Ag?c6;R>feifOB#!ClJOyoZq?oug{kxXy-3&lM4s#1z089O zypzDQXfNuCn z5M4-MZK6aKKGD$B z83z#(hf#4%DF3Y%4TR<&Njwy$1w$4?S`ExGsXwP<5_{VapAU@BB}S;IZb&lNtaHCqime!XoNw%?|;3nAJSa2Sw; zrnemu`@l=Fg#?+Lbn=0B1TXMdM-PUf-w{u=U>GD1-AKaWdhoX0FjCZ>XlRx9T9w;| zkp}=iTUenK(sohI_8Bxrgt$Ti*SWe07fQhHCy3Q2s6<|N-kDwocihQbl>%1aW+1-%0U;_8ke zBe4-4>ZEpq%YL^!CrF+X&*T~TeQ7yVDTftHNZ{BK94%V5UFcgADlW}>2iDrbAt&%CgodQ_UkvmwU7ZC6w_fEm}TROu?|1R%qiod)E6>9QeiMElLk=}>G zG~^w@%=S%)U5$pJ9luexAeCY9QTP^X1ld7%mFy)6`GrQ*6;6B5BM~9WxDe_jBf;hO zlZ(OMLi5S?)Qu3cqC+hB8yiCBzNUpt#^3QFbE#XRc&t@h9I_0;LK|6lhSO(=%l33} z5&AD_!)|H=5{kY(q_fLt<1Zu^`<8$63n9YO(qvJ5+8EY9yP2I7Nu2T}Cx03Qnr`$G zmvy&LND)a`AX^$@_gS~5QzoIn3Vz6O{Q+5e?q$O+$|p7RNdf zCvYHY@jOiOJdpu?LG)gVKluMo;dP?j2QHJNT&5ToECKlhAg@^`!g*?LWcY=GKA6j5 zi6t?Tv{}SM;LkS4Uud+;$P2Lkg_MzW=nMPM<2AT^@=UHLqcvvMMEnk}aMK1RL#pXFKg30^ygk{qrg_8e&N}M2w zjZCvkDFf2v_5TCa7X`dDm*xm((bMjuxp*Of^y+T8(=GKn;)9(r_dvky%Yxw?nm9#dJ5X54g zuVTqmc1l^v-63r`6WgE~ISWW7VAJMz-VqhVgEcibl#aA@+)aK7kQk&5i!ZZY2bu(9 zd=l}wFY(g0`ioXw<1HaAEtQmGD-YDO8E8MIHvhEhac!Z;g z`%vNR(oUjbH#KVw!5P#8o0&z)+@G_+BqRyp>DGLbFZ3K#N zTLEj!Vt#{r>TjVE47LFiC^!txz#khN8$Jybk87p{OKpfgkQRyuk7#h?Fi{q;F@nJU z0u>HV&}Wkg(LeCVmT5=lz*ItZk=)nZ<|FlZK^Cjl?~+Y>h1;|aQ7QJ@G)oJEGA#}# zd5T0V@<&OKLWOfqNJs1_{SFao)!5eK(PKd0GYcfQHw} z-V8&#z0c;jDV*e3&@&%AG)FS{2G@c?XjzQmi#dNo!dsAVJGrJIjb<8@ZQ|`=I{&y4 zs2&$yjeBeA6Cm|QYysHB={S_OT{>kEznduZ;8FMg%XlO7SxTLxibbFV!Xy%%d@(Hk zU7BkIq3I9V>}dc!L8(dv_SI#@bz<*Vxn}b?oV&OxXjfAs>{N z?74U{1VjeI;pK3imLefIK$lH8eAD+(k~5pYd=2hNd&9p2j7}~T@kdFdFymZoKZ;YZ z6u;^N7K>Ms_Vb9;O9uC}gO$szSAnR&5tp%+xi#(TY{e@?DOAIA$Rnec#q_s2lj9+H zFtGO02#QJUK3LqQCB;)xb(pM=j*u;{NWbt79e?)+nl6hs(>9=h5YutR>$LGUM{+z* zB_Otf=>Q4NLeP4!)3~OQiftgL-#{nwy;ggO!Vz#E1MYjEHV^milF%5NBWVopEFWgV z!M~}9K462d*tFd#5Y+0}NEhN=A6O)$-!tqPe!#8=>}bOm*|b62D)sSY0KUeR?$_Zm}HN>^D(=T8hqQqBhn;=Ru? z%EU0=G#tpIlqV02#flIqK#CQRmIKE@`sd8U6>t&H?P>XVDs1e2_Ou24<@pB5W>_2> z#c%~BZKx-e6t`9?iL^}pjFdDIYbw-$lvkvZNEafkc|?gR(S?mBM>3fLN4GBim5g5F zl_eqXI$#Qo3<`oq1T#b0R3vkx1l_(&u%67TFje~tl zUfT1U#hxAww0n#j8BFb!ekBsL$WU~8>2Cp%VJP&hIgn~2Bk;!(2@L6T0g)EUaiB?l z1V%G_VcUmi3;8lubpS?Zv}htHCQ4%fA$DV2Y|Zyodo5}&x+ryz*U99VTS1w8hP=-t zsxOIqx&Gu&i%+yPM|MPK@DgmC7WUWo!FIQ;qaxg6w4rKLBv=VsM_FPWv*HW^{p0bm ziu=ezp8qIDQ7sXK@BaaQ)4{Lc9>OuA<~0eA{8MzJt<+*ls4t1W=w9|P1D{%CrvaM= zR$1!le4(D@3|fQ;6(oS2kY5mRL$EN`7OZim*o)tRt$`#oTkwM{Pm&_kg$Pi*Fcbe? z`h<8WI1W5RMMFiqp&}$cBhhit!HaM8_+SAAa};itg}V?z`7$>za+!kfWOJ84D+e#J z^u)(VBJOplcw^T(kXMUIM{wKUZE%{r^xl=HJebPwpyB_c zJe0~W{O@vqDnIx_x&4ZVK_DS~`~pHrxgfy)cexO7{{KVyxPODU;cfqB2@lBm9p+N%b;@yD7Bd4$i`P~{`n2Ih;TdLx1?eYTC#lHd+A<^pi zm7kr=7Uy?sx!O%*mMHO1-Z)88?kAuwJ_}fU_GES|KSB-J%$l8;t?pUDHl3)a=4x!; ziM9=2S|JRN1vs%X82US+{~uWCJAnnXpWvTAIUQ#I9xcqQUg zUG>;x_86A~Rau>%8mdbtvnX7~RAm!?YN@uJ%+~!hrP4x&;`LfD$n3qq!F+#ipvE~^ ztDmja(`q2-d+kCu(IW3#GzQ(t{p}a(Q6wa~i(V+9g*z&l^g;xF5d@>>*)o9cC20kH>OE1eL0Fo{D<6C| z;JC?m8M~l;v6|$krTK%0wIh!3$`2n&aSV$u`G6)#llm$lU+ z#wut-a25!Un;90X+_Q|cL|U~2cuBQ8Ub%qZ882w{W2UlOb+-d)8lxCC>@ND?{3N@gx-1r()Pua$DDeW6(K4<_Af{S0i?w#FRL-#Y2jF^~2{IKR#r*e+ z|K@Z4FyHu3T`v0z_OtDQkzhP&B)HgIQk&!dW~ZZw0nhBzoje3@+>o6PpoHwSm!gE* zPEX%>W~W%YwmT5?6YFy>2g0R3X=;uoA3g*N0|m*Hw0ZpEH#7>Z87c$T(b1l^tQ8fn(WiWH z2DUEh6|Nvcumq(Zo=P|)3JsLh8eLKg9QQ5+$16v{F;2MPIh%49iz0aQHO4FINQ^%| zhnJjBu9jt3+@Cs#mPYYCWo~~MiOR{nTrUwM??VA!Qim z%8nD(j>&MUgsfyNEI?K#=s1lVlfCfqn`2nq=wW~lEL<(ReFhOEm2U#UXnIlYP|EL$ zBQHdW$WJsB7(g!tT0_XevCw z;y2MaI7?pPtFewtSo0|-91<)nr+&Bi3_22N(RzjcEOw_Up7^Kcp>Z9>q9Sz&LmEyWdKKhKCu$LO zq-;5*uxm{Cjo5KxgZpS*8sigEF5?#<)X&kPaqPHpb^2*78pA{o4#)DgqChy&THN$; z)S;3rwjb&*%N9 zEMaZHxRA%U!%+Bw)W5w535VN@l6%2}_P9N0^n4sWkuKy-OIMMrp1F`9H(HW|14TP7 zkp~&lP9dVf=7qi~$$Q{MgDAjh6Ud1Y8xVpP76d-xJLE`-e;^YhyOu`U@ zM7kw%!Ugv*YrcLLg`&rrFVBN@oTlYiR9t4u=ju|Vj9=LDV+y8XDbkJeE#Wwl=u>6m zfCuaF3rmE`VUaxrZ(x`g>#uzDaB8j)p|CvfGn_5E99*w8fLTi6FSLR{|6x6}`vIiG zt%qVQr{Y9*DEK=iMhgG&Ha)VGGP z*Z%0ycm$9z1~|T5qY}nO z%4?m;S^Qn9L%pq&fEV*of_f1jf@^{Od-yz&whHJSQDr*rtm=R8Hpo_?h~kjL`IWI-l7HK#iC%FHa^53^R>}%R!o#4ZH@_{7!=O}Bi50e z8LLHL5#0iWre*o@@cM_h`QR)651c#t;po?HO_V>2gvWw60dcrk>`RSSjna4!(-NL9c?fNRZ z?JcF19`>dZ;KPe;h=fhk{8{kd&6)qbYU&ajoA%cxwSkRQx?$^-3ZXH}j~A&=F;B!} zG!(buFnlsCC)$y{040f&v5SP+IHjd%EPb-^cpsL3+syKBR16x?M>vwpnDaF@CsSQz zlL9STHc{l~ZS4My=2iaw5-rqBw{bz#&*Iy9GtT7)LM*RE(0 zqW}&yo6Fo43_kQ09kf;DHMcDd)4J=rgJqRX6)DP==Dcg6_CDsT^RJ}9X(Bsq8+ zl31MHYyW|P7k>eUkYERZ@a;X>Q2r0S=-xXKDiXG89GtJt|GSr7rE+~+LgZnSzoMkwWa57zkJICXjtrroP! z-+D_ls`57=y9=s-)GvctL9$pNk)GyFaG8Md2hrlb0(syKd2gZn%kn-F_cDr|1^^KZ zdn)nh&(HQ$3ci$>!iPU@FCQqk~>T~j~5RG;k2{wH20Etb8)zpJEPf!;+{dLB2g7lbyp9P z8w)P@JjQK)u^YVZP$cVmf0)`olD&DqL1iNl!gC6J3E8Iy`|kdFW1XAAal4kM9oK4f z($n~R5lejVmO7w2^MAO)KOYMKm}*Wd7mtL;baE{FQ0-&c zoX4ZepZSEk^$|AXNg(^@aWl127Z&`avl7KdJ{j!W2NQCnU3^j(_Vtr-YGsr?4e{OZ zHgUMdA9rGXpEjyBu(J?OY~o_=+}j7!PlSK(fKkl(G{}GWXwVR+cFZ8YK#=hFdoYR_T`h(;0ycC=!8iwhY&fYLIyeP)3HkW+ zunX<9Ij)jKXFCEh)x7+gP%;iUQ25!6;fMyvGN6Jw-s`}No-Y6y&FlJO3$GC8AK$g<2F%Ad};;nRTS35n|Y14ty`ott90TjJ|vukGgPMH zAJ%=TbWrDZUUy3wp!)jh(TWnPUaF+eP?R>6M_v&g=e+}-w6~M~siKTacnL5JO9$W% zBw7myPJ>T68qrS{?Q<8^ltto@3rctXDJp)2QZ(@wjBXemQ^?UCx0lVlbXA|BLX0jW z^aHBW)wjJH9(z^yEu+}gaa(n*j50L5%5cF`uG2cR$s&CH8nSQ^|E+`P#sRfl zcwettR;jOMcF^0GRa)05f*`OQ4Yu;kFxla12Yo?V<&)ueE<;MhiI7JKP2JF&{r~`q ziv0vk>Vr7SDxj>eA$=mW)OS-;%{lI>e?NqA(gq4shI!g}sjdEow=z&2+g3m0t-PY1 zZ>w9%DKY&;MW%b@cVEZ_UAn8F>2u@eOv{l zfvUIGmsU^`o8SMH%)fXW1`@PVe4Nv1n)acHWz;>I(xJ+xgVTBUwt8b95Gc5)Pxnz8 zhKwI1%ymU{BlnII9e3|T1e4|=+kO3>{<)9R(#`;Z>fS#DQRlURjE(P$fS4-bpAdX3 z!JA5W;V%Mz?FWEc3EmoTv77vzEa{CBIEfH%Fo`E31`h%*`m;NHgbs!yp@-kr$M`Dk z8bxjbQ4Q+HC%>HLhwurWlngOSZAv8#U@LzPtUUssPy#D&W96TDURp+|C<$!9z-dpzdoa)QlnZo5_Ao6Hd!q)lCSH} zW}U8Tf7%@F!8tMa7TGdfBl*;S)0>cv`OB~0fktR+YQO2dBUCMym#0TuYltfjNM&2V zStP!+hjEWz1${c+l^c^qNd~GuJ&Y<&8*;Xb7Dx31{BSEt;%8hjGeQ`fuu+eyq|~*W zZF2JlAA7(Z)J>mX#Z)K&i6zh4NYsMPy$Mk2L7J$Gnb3Kf3|RzIIw9pUR@f-UM3=Gn z9nep;ZkOzZ+Q!FEsTo1paVfV7vhoHurvT^-s~sl)HwY|QRiO*t$0feuP&p8Iz(hgOHxU4 z9*8C_!wSy^!{Xy2TKNTRK#4OsgWBSG%l3R3zNMu;u(C49-jFI{1-ByNC25UrqQ-wtQTnoW2i+iCCeVP#gfCPK%#eW;;njPgHqX;iD!!R8B|#=q+GG-R)bP6;Qc-%m}duz-_`Yb2Bn2> zb9aq~E%f>|l&T4a#SV&?PGc1C5&R(|bsw4y>_ff_1!VDB#C6=nYF6bJ_|^Sizzd(; zTSFIPCtP?Vp;gpPg6j|7V0HXVj&;0=Ue8}KHa*)L&1?%|^y;BuaR~TX$Mp=fY9qZt z-}DuVsSTIc>k0l!?a0KlZbejlQ%LkJ@a3K;zJY^z;WDu$il5`4&geAJXNPIf`W0%2 ztJdA1@9|eUn|8u_WZ$3RYaY`A`}Z?$;`0Q0GS;DPVn+@=!o@#oriTV7SUtTUDTWaW zwf}90w?g*ziidZW*$QsXKVgnsM83w!CfqH(#;DI#YO1 z8fzo*=X+roI?ju4Em%{JP{?%mTX^;W@D#BOb1wSe5DKv@ggt__fQz?1=fD;BFg#Jz zECN_8Hx=<}ke+<)8w=J95i*eyE%Ss;>^M7< z*Vj;L_YGAE1Y)U$h~;0V0~^4 zrA6b-Zd5b?-0&RVCcPH!PAWK6gRhg%=Oxntj0{5jRafCq#QQ zc*bh|W(_4c-~c&?)3oC!67Cv*Wwl-}P-$Rs0F0{fU_!qS;cg#x2zhuDYS=}-QC4gt zDi-rvSVRoJ06!W=8bt)?jL)*By`eh-m3E!40Y*))D5#cL0ep@5Zh1bTw##h>sF5~X zslxdN`u#wqqh;zTDc(SjhQ5V&71jiS{ZT@T9KQwt7rW_Jj8qB2S&3;#bmKyOUQNZ? z#F|?c%A&X)6GGcwbQ3CfUCWk>Iuc#ZUjd|r{%cJosKcT9B%#q2DPkmaLIH)+pJZ@^ z%3Q|9t4LSVQ%K-UU}FefbW#tmr340kiCTQ~Xi=5V5R_ovb@lbJwUm10q5&xQLtj!$ z8Pv?08;$iP{KH@aq3{41@GW(*7mOzYkyt%j=*6fz{Ow>8E9i7LqK#J>wo9>YVojL$ zUjd+&41ruc4R{b}6zmQ>coPl$Sj-o{CvuK28AbJ7e1ISa+2#f7Gixg~LMm;-A^1SZ zBbK!IlX_r>mlaVNUoi3~PyZ`e|G2i&uY3S7`C5Fwu8v}{U)RVx=u^GZv4rZ~b_G?7 z$w0irg1T3C%uw!E6&P8#-H!YXrPv1o<3EE02NDk>ObQPpj_zS+FYeKM{e|fFxl)^o zyz5Hh=)30cj}yf7xJ?>ejowQjQY7pH>M60#mb+0*)(M(QStq@a@Uej0JjTKe*Oid8k%(toa}v{bv+(aQ!aAE`sS=vl!^ ztXerxe~N4M2AyffGl-^X;;;>Ma!a5-roQ6zEkYTsMN|ybi|Z@n)txo;ga%3zpE;yB z^ziCfn5(XTRUhjPcx+c)@rqe|FR`=Ux1kcOKWLy-uQeZ$e*%7WE*;A%{X2qMQ`#%L z#_iShrVSC$9~<@9hDy^8-&K>!*=oc!)jaed%_!5pflI(@Z%~Q`2KgwYg^8Cyh@LZz z9{%lopAvD1s#aegg4Xsk>a9bRzy@Zrx6{0mwjP|O4lAI=ziOaUwGf_ijSn8KPYF?) zu$e!Xwc}`<1z-n$+ODa1Ta<*gI0oYo51lqj&P4Ko90IJxORMs*Uvx+$?-l`))5iO4232N)0 zf7?i@X}=$6;khiu$p36vIOfvu$SLWJkiVXh9$27;yDd`%RbR! zSh(L(f4`;Uete-HMVNVuce3G+#*UJ(G0IK&WJN+h;X!XD&|BG!%LS_j^6{u)NiAZ5 z5AW0KsjwO>h#xvwITDecAO~PP8ZHH}mk9sZBCk*tR_z>3WQYgC>@U>`h}Ug-lGcGq*r<@W-EV$5gc z>ezdu0sS7-{Vf=XUDF_J_~XYt=%}94_)S}C2GWCjJRqg?(JyT1xdujnKn@>S4X>aP z$w7j&JRyb9?HWkuy%Gn2%xfTn#1W%UK7AUy80TRu_$dsC#rvU>b=>F{Q7H?8yu1=e zp?_Eeb`hTmw8B=XCuG}80=n5cO`jj4W)$;x77;0b-y=#F*HZXP>bs|8GUVT@HDF*o?uQ777zZKXD7RxB zg;)!~FL*5z6(8`KaYUe)cMlG*uL6ybn5*+l= zc2iWw&&y24BeDW>MWj=uGLOgpBuh*Rr5)5=ZW3R)*9ez~b;sykn<)*H3i{Y)O7+n1 zRw5Fl!otAx|d#ZVj$E@+WIz^7MC`DZzG%uQ=r@r?SDg?CI?&+Zm~e7e+S3 zk_eRJH7XkLEt+@3WD-TZ7G=p5@B6~|l+*l<^Cc(k)f9latLTT^BP@@mvG^=;aDJ> zhZH9rrDVbTBisvX<|P7hlQ$Mf2M`woA#I~Lr0h5gN2&(x)3h7r#jm}fSNzSJSJF>3 zSE|{w_#+5GekFVk$B4zDA58esv)p|O*`yr%#JGnd*doZ&nUZQ2|~)NrRMQ`G&Nr^k{yFY=L< z@kw~-OT^I>s!hB7_xMhnTM}_45Q0+on~t>2a|{VbkMO%Adfk>vlxl9Rk8P<`Q=7Eb z=d@HB+B496Qo|c0EB!FfMZ{b&$DWR^IROd4+?gxv@M$3#gLJz?!U%;(@*n2A)< zSF~0_)GinG&*)nHqJFlu(%hf=1nr0w(Z~M^zOSfP4O5zQ@SRK4N!)z2>o00ox1rQo zky%k5)*YE(soc%#xP~m~<8u0}Fs$fQX`!zOQ(CK+o9o$ON?@Jb=FcJHWs`K;NkKZa zy}AB(m{MaxVpD3fcnedoaEQ121gCi~RGuuiVe&D+@;*a6LdjIG&kNXDZdT#V_37bC zjXq)2mNNgUR_29j^ui%YSkUa>vZuI9jyKbfhbw{B-7jF!E2dQU?H5XdWysk~qE8=D+9<7*&{0Xyg)@5$Q27Adho3~qnv&?Yhj=#|fH8^slD0|{wcc!f zM_Xlw`b#-|Ogp7%%Y)^}V~hFM;(ASP&VMc*iueb(B9>GDY3j_^^e@^e?S0Z4(eR$j zxqi2u5?7_Xn}W-mC|%>l-uh6J65f1|c&4t+x8oKfQds3DBpCGIyJNmU!$u_PyG+WM za#KPuto@_cY_D{z*NpB5BORbFuZi!o!R1k7Kawc^jy|is(yHO~-KZTun~>;~y#;C% zWP=`~fF|Ivuj&WdE0G-{%8INJOLF4vj?YA{Al@`3Pj7)z>a-!ambCUMpU_C}*g*+X zUwuWN+5t`^|BV?CAWP_B5#6D^=>;?wM6!7|oS zvw)vaWbMni(moHV#XMuCo*ALkjqC}}p?u0|uCoJZPLl}$w4oLz%KR&#YV7Y^#T&P0 zg+K1+@sgz&69Q-InHBP@G1S3N~0vD9wM|63Hp3qSVZntU%1`4b#64+&2El}}W z*I3bhLc-JMbH(Rt|KX`<9~I;(`p%9@$MUm3g%EzP=zn)qLc2DRgn2z`4wf6pv#Sai zegafnA-C!7PE^?gjtFMZtL%Wk@zeUyPRbbngc*W?3z6~~U*M(axt)~oGShJLsFM=W zz|TvNjwI5GyccZlx`dJW4VON+v(h!_D?CF4dJEQNTrgc4g?5at@V@o+tj!LL3l?e=9I8}&YA#oeRDiBGCUPIms(JSJf8jBNqxKgiK zCOQO;j9%w^^?_!kvD$WuKHscF`_Shoc?5{+qq{0KN6ELYc|5G-p&Tpk1?5QG6Xgh8 z3p&ubI1J9Yc)&TAAXs88jE8z;0iG{LH!K>U80VHXzw$5Z-MT8B?VW&xUPdcca|p-H zbI0RnJh#Yu!BfXQ@mwWg_lb5rA%{4h)(#{JCQ&HFp?V{s7W4c`f)t?^^rBEx|B-wf zi4Ga)54tKX!kS2`l)Fz05<`C!PPd`&t0<5I_Q&X1R>v<^tt(G{tPk#{bc()F3xvh` znDKYI#jG6)#x!!i#ZrbQF<1F;@Ft~W@@MEmC>X0>2YZmQIa={o9_gpLA^N^iOMl!= zX;ozak#U+HeGHvAr|0w8P4q62iY>5e9ki(Q62~7jE5_$ECRO!&}8`te95 z$bM-xtT^idad|g|0s_nu3mh8eF_+GPG!zA`Ur?$dz5(3;rB-b;r7EddmZu8gs4tgk z6GX>N+JM}Re3&vFzI`x}r5CK|d!p}Vf?>0s2(#lRhsEksqmUP9clFg#O1QNvF?L{s zp#LNyj66UKx|dEizs6^P2ZREZ-}v17xOW;0D+;5DtmWePXIV?`1HEE*C86{CfI&+0 z8geZx7F;hDB(OjH8xKVp1@1UW7ANQzPV}TLT^@Mp&elppwec}MuRG-PI;P+3uGH&S z9w?ah;0qo+6e8ee46i3|CJXpX@pmrw6~Js#D1QpBRxLZ7?r+Qc4Rn9CSRdI#X;D2N zFhjja@!eSHCvEHh;qA@idd%Mc@z=TQMIkLjBE6Cbp^!bwTEt}E$)iK?#``^w$LI0;<6Do{eO>1|*SXGh zu5<3QpL4@LmtN4?w!+gdUTQqUPMxkH5$a?O>8p;>kVyTLas3J@udNtT%@$-X$Zub0 z>3b&OJ@tWvkJZ~R2*XO76efO97Eh!*VWNfSuqP<|2}i=rCGkPv zFnpj;TCf7B=$>AGK&?9o_mW%IAy?}KQDi3(q{I%Ub)AH_lLPSi1lbmlRJybC8OB!rUg4(DW$V;QTh*}eVtLtzkf`(I*ao5eKcuR^Qow_s8F)t zI|TTw1yv3g9ZIfdM-AzyL5sqLgVUUWQaQYQIqk5Eu{Sxf;EZr|?=$0tVaPSBsm)6cYbV#I%E1_N_)_t((y&T}4pID0aMQ$_{VZ z-4!E=fQNLZtLWslxX(XQ(f7ee;%`zwS5dL#_EiwjND2rlIg%X(O^QjY@jxn01)rel z9G_2a5yD3~luxZAV5qZpT(^x(J)vx9165@BB*o(DJt^!lkZ|+k- zH!(%&Hkvkd!*Hp?9r~l2Xrx@qqcYuvNqKae>U9@Qm7TX~On1>$8F8D^8J53Ic0B+O z|3!U!@V>Hpw5|vE2mD2uJ%pc9N!8q?|03s}qFUL@%VqwwDU19WRDwc!qBoNMCt(+v zxALwFCG-?k6rX$aV^7gaY@xe7MOBXqe?muD=Z9jv7lL&up2ffz*3v^5sAexwdn8t0 za5%EM4JMv=6{bvy`DGaQ1s-0)X@0m3J~QfMi~7Zu$$nNA41NhR-hbaF-_>#VrNp*Q zh3C8ug^RzqbqTu5k@L0JZWNI%D)$QGqq1*8&8@L@F-QhJ-vz6(3q|*61h4d3G#VeZKPqY)+bf};3x39EV7V~O$^tPYy zjeUTul{d1q)4o|7(z{1!`~$qmZ!j|zFZ;u`>g;DP9NOE^M5`J@$n5moSaHNTOYG;Z#FCuw74k-*J8d95>ak zpin>tM)UF5U~XDap3e6d<-B8(Aa-6xv?4#eKrA9LP(^*N)&zfOg0W{3l^P&wwO$V; zQAVo0E7C@Nfo{N1gHB@siLO7OyQc2yqF0l5vE_va>h-Sj(Egnob&aMB5FPz0LkRb@ z-rQiw!$UrQRuf!Iy)3DP>KnM#w{&NK_{23?`dRnK@4Nz^l~*ZjplH{q4;*qrANS@? zm>-^?vWx~+eyDIo?ZEtXK$1I5ZmI>8IZ!;e>0MMrdj^TR)yH2)%;unbVW^ts@+OeP zpzjlr_99IAqU>YLtNxf)YOt^q-UlzSl7;F9NP{``{xEOaKYo$rUst!L1r8DEqT!@M zHqjB-aU^4Wve?`b85FdCfizYAGbr`Cqf{O$TU;l0B-2n)v24E!+^k@L3tC7=YClv2 zdb=RowN(qWuE=!$G-HNpkeqyU47(xIz8flr3UQn)!-SjIPHw}+mbzZ&r2Mc1d{#zV zp>ULxKf;&uLm2*`9V0|{ce}4)#=pJTj1$svE|G1==A3_)s*V&9O84^= zHBxLTv;Mp^Cp!0|+fdC>;-b>^{PNKv+%Mx9idXTW%Sg0#h3ZOADKb0EJczS_Mb^uq zsR$w7(vi_ZRUFUKFJr{Da+zl!8MEKKDv^(>^``m@tsN^qsqFbBR4e7da(L|5E@9Tb zb_uUp()VQdsTe38(a29loq%?yv|`CO3(LY9lZ-A57ufKVnorU1QhC(`PSxvFTIQ#s zf>P!VTwFrTb+@#jzs8HT_9vvId+H%tFhRIiJ%55V!?g}*Y}UXlEUSYPUQ$`S7M`Mm z6JVd$52^e_;af2Slhv@V)N|zFb_sv7p8bwdkBMTC*pRk;qKFgK%*P?b9P5jBK&33H zElLaQ^;G@oC{+6szmD!Y*GFkLj zO1m85?7tdr?v+kSUx?~y0nwtY5Em#oM*OTa%%sOL;+QffgZ6$dzE;|2P}?ssTdri# zS6_&DrO6>GJyo<(n)uTvQ^ip4G6z`!l-zUm@jjSageNrQwzk-rof~v+s%Wk>JV=hy z#N5iYGFe6Nd4tcl7@ut>ZJQ>3D!DKSIXd|_8ZuoRFY#+lIFhOU3^7fdq|Gx#L)6gM zXNVs4H~vRPtj^ufkgr_ln`Kk?avg<*l9*I=5jbFA&X^wi2^Vl@D_{IZwPuMFF@Vm_ zl7-B3w(t^nDP*=7R<55NPhMa_iZ2l2Jq3NQ)9%^A$I%NOScgEd;rz;?`?JM$#le@3 z#p2Y&m+90gPTY67^eHqwWRwMw*~agt4s(Q0nQnVD{mg+CYtk2UM7+2{Z{~=W$}CJF zeksPpp7@p3JjxS$f9&GIb_mI_xSsUky8LSNR4(j?*aH>&FlNkZk1`B*BH9cDny{M< zibaHZmgo|gq(?Xiz?y&i>;N8Lc)*{RG0Z;GSR{Wq>iuV5jmxW(DPFh^`h>j>bQw8u z{3I3)o65gC>fHC*=@Qk$#gug8U}j@Tbq2hAe~Hgmb8pLJ?IRshAJVt+qK$L%7#PUg z=DmSV(w%q=!3T_?(sRW~WrR0PnJZekZ5$1@jtY)~`9p>GXZ4Oy_FUoN{ssHGz!&Wz zdd9ovW73O_&}27R=3=LugEwo^G%R6ebrTfZ=0X1RM70`!R%0^G9}lb^3i2Tju7}%I zAA=2D)gw5iXg4Z&)6{vw)Hs9Fml$*eQvzyVA*V%U%_?n-&7W6xauJ(tLhRbY8YUpd z>>_+$qq?|He*?HVNckNh9^V&X>Ad+Xa7Z<(|CMl$bwmX3C32x{3W>b*jBjZALh2Zv zxkATLJqS9A5}&6=UtgZ5mi_(2zMQtDUdU*9S{kYZogN8w`(YAYJ5wEl>H`hWCFVgz zyPRXdOqPoIxmdZT^;k^+ZNHSu4d9>ZugGci2|hoAs#@+~9nV-|P!JED6J2YddQ|PJ zaanV1P!*(jKK=|=97WGm*Zu+zghE!>>|m`AqsHuk*kyUUfaIie`ANm~Ic|vS^mfV4 zsudzyuC99gN<+RDp?(e~&MJhHo0C^dx%0FIOWuehZ-6kPnK zn|)SR=Fs}OQknA~wK{T>0r*#M<7DVuch8aUe9$zlzg!HB+PMq9YflF!CH$QU%ad;syXf}s2yIyqX zT)C^Z1|wT4F=)bY;ViA-QN-O1-uyOvIOWe5KK6s9uEs=ns+1tAiCfe%K{ROc2tuLH z7_1aD?2McbP305?whl!E$OAs?0dGv@1vTQlN|-SfC8k+b+LR!Mn`VL(p75CyC#)Jw z#|O-k@o4MDlnTF)?*ieEvfOV0D#zV4V}bDW+y*uHR97V(mpWI)D>6eIWI}(vKt@N1_OUfOnqEr=jt?wH<3B_@P$%at57Mk zFnOY1%I5!1h<1ftvRWEx;A4Hs`8(7m+bGN|hAJ+<&{ngk;r3z+_inh$q@IIfAuqB- z%uKb$7P@c7s#hviTF8@+Td4IyVJh8CS`fPzL$}eV3q=dtCKWL56p5lznTUvpkUspc zF8_&6FBJXCxA=*bJ?xL-B)ePp)GvOf7Kx%=l|in;0DkrAW{m^IJuKl5F1i(erqzj} ziv6ptoYT1IpE43fBNx+PWQ@(LA}&DOB5d7EcjJY(xJtDbiBU?sO7!g_(Zru@95+= zB1P%>BYmDEIw@5u(!nI*Cr;DjB+<-mUw_2$`*VJ?+sC~x`KOOl@M3(PaQ$(buvpw} zISEm5Uk4*(^RlTtNj`c6_Tr&E;+gc%`a#AESE&V@kRaf6y{1+I2sVVAx2_pgperke3C(9h!9%5n9v=Aj|%}+;&xMlhjBZ z`~yWU71hG)K@Mx9F^6UylwnSS`aUXWIB=bZbOjJR&s-2-fW-^7<)u$lMZU@O%%IKR8`7tqIJtegF5-WVAUE=-WQVJ*UPF5(?q^J zcZ}J(mxP~DHE~-P(D5Da?rDhgYVf!Wq^V_jT@JNu_B*9a-!=J^g`6noe|#b8e3X6WODCsrs^oujuKL+zTN=; zgqwUV+iNv1S+_}G8Y`DT=SVm!$xd{aL?ipxj#6Ru8hNh}H7a}$A>60xg#1Qo_uD`* z^tgwt5S3~lUCT;7R;S2__@kRLu>R3ad>Ha#ei_7Sas7)ntPtUD9$n;K*~gH9S~wJ4 z2QEG>*HOTF;ZCNN!pHLrM4}eV3YVOlHO{AKwVCtA+V`AZwrbCHh9$}Q_4rnZiiHS< zeVgs)JARdm#-DF~N(|c3klwBoUByP~yb9ZmJFcb0tFRcop)(y?h55L?UFhyAF-D}* zC#!|O9j%cuU#G8EW4b0GoOZ1i^{YMwl?BH+e*GKrD}MkCKfV)Nxk&A>j_}QT?^2lI zmhMXHsQwyJy`mG`mY5M?mLpN0adSSOPiUX-j5`_Xv$9p|>oVs%e$BV~=U0Ht?=c)_ znX}f?i8aDh!wYU?^_6mX**`(z^7xelpR-1P%Je2{$@x1GUCC>;Yy#dNB)|BZY=n$A zY3+BSs*~>lEUiI?k21 z5@NgTq5YbeLsWY$x}!5z(&Dw)(p_g29a$@C#~L-MU6OD}AN#cXIjq?yqcP5vkiVtV z+c-wzeStT(=S{f%j9+OKV^s-3#rb@>qxq&fawW9auGY_xEie~^PQ{3hzFm@VhpRmP zN)y*%g>c3SqIIIR619RZt;2@+4p?u(OTbxy3u2wR#Nol8oNyYHgk$g~B2%&mcTCaZ zE`8hnspAlz4KyQJbX1zIpu@=`60MBSdbAgx5lvo?o$B?7_MylQ*wz5=t3AY{IG^?B zLdsh@-~@aL$bA%ZpaEP=ISmRY0jmNSxlAb`w}?C3$H+&jrY?~Fe6M;x<1-4_Aez

}OUVdje8!t+EMut>aC<9Xdi@}S;i9v_`&h9*x| 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 nr`nSl3z$Q{>HF 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

TCkH~zQy(aRxmJ5`7g@7a4Zp2)bL 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 F{{bmvgsA`k

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≻ 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 VUBBIpR3R^$OG1*>(wEK2{}1wVtjhoZ diff --git a/src/DiffEngineViewer.Mac/runtimes/osx-arm64/native/libdiffengine_viewer.dylib b/src/DiffEngineViewer.Mac/runtimes/osx-arm64/native/libdiffengine_viewer.dylib index c80b369d66d43755098b1fa3d81e826b89f1d1cc..9378285c33e68245929f6a94c379a7f33320d0cf 100644 GIT binary patch delta 130383 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�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 Gfd2=^8|o(j diff --git a/src/DiffEngineViewer.Linux/runtimes/linux-x64/native/libdiffengine_viewer.so b/src/DiffEngineViewer.Linux/runtimes/linux-x64/native/libdiffengine_viewer.so index 072ba222215ae6cd10121ad6ffb6d23f36d85ea2..7f232f087e048849747ea58c6bfd8938c44ecb7f 100644 GIT binary patch delta 426361 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