From 4b411bf8799b8392a25b1d55d935fc2e26c0255f Mon Sep 17 00:00:00 2001 From: James Maes Date: Sun, 5 Jul 2026 06:54:22 -0500 Subject: [PATCH 1/4] Document VS exception-break behavior during sync (looks like a UI freeze) Per-repo failure isolation is exception-based, and several of those exceptions surface from native libgit2 frames; with Just My Code enabled Visual Studio breaks on each as user-unhandled, pausing every thread. A measured probe (269-repo live sync, WM_NULL round-trips) shows the message pump never exceeds 70ms outside the debugger. Co-Authored-By: Claude Fable 5 --- CONTRIBUTING.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bbdb1a1..25da803 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,6 +37,26 @@ dotnet test gclo.Engine.Tests dotnet format gclo.slnx --verify-no-changes --severity error ``` +## Debugging in Visual Studio: expect (and silence) exception breaks + +Per-repo failure isolation is exception-based by design: a repository that +cannot be cloned or pulled throws (`LibGit2SharpException`, +`InvalidRepositoryPathsException`, ...) and the sync engine catches it, marks +that row Failed, and keeps going. Many of these exceptions surface from inside +native libgit2 frames, so with **Just My Code** enabled Visual Studio breaks on +them as "user-unhandled" even though they are always caught — during a sync +with failing repositories the debugger pauses every thread on each one, which +looks like the whole UI is frozen until you press Continue. + +None of this happens outside the debugger. Options, in order of preference: + +1. Run without the debugger (**Ctrl+F5**) unless you are actively debugging. +2. In **Debug → Windows → Exception Settings**, uncheck *Break when this + exception type is user-unhandled* for `LibGit2Sharp.LibGit2SharpException` + (and `gclo.Engine.InvalidRepositoryPathsException`) after the first break. +3. Disable **Tools → Options → Debugging → Enable Just My Code** — the + debugger then only breaks on genuinely unhandled exceptions. + ## What CI enforces Every pull request must pass: -- 2.54.0 From 24344ab3d502f34c7082df17efb9e25e4566a974 Mon Sep 17 00:00:00 2001 From: James Maes Date: Sun, 5 Jul 2026 07:10:23 -0500 Subject: [PATCH 2/4] Responsive workspace toolbar: action buttons can no longer clip off-screen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The toolbar used Auto|Auto|*|Auto columns, so nothing could shrink: with ~40px of slack at the default window size, any width pressure (narrower window, Windows text scaling, localization, longer count labels) pushed the Sync/Cancel group past the right edge — measured via UIA at 820px width, both buttons were laid out entirely outside the visible region. The action groups now drop to their own right-aligned row whenever the measured widths do not fit on one row (UpdateToolbarLayout + ToolbarSingleRow/TwoRow visual states). Measuring instead of a window-width trigger covers text scaling and localization, not just window size. The selection summary trims, and the run progress bar narrows from 160 to 120px. Co-Authored-By: Claude Fable 5 --- gclo/WorkspacePage.xaml | 60 +++++++++++++++++++++++++++++++++----- gclo/WorkspacePage.xaml.cs | 24 +++++++++++++++ 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/gclo/WorkspacePage.xaml b/gclo/WorkspacePage.xaml index 1c03cb8..5ffd62f 100644 --- a/gclo/WorkspacePage.xaml +++ b/gclo/WorkspacePage.xaml @@ -15,6 +15,28 @@ + + + + + + + + + + + + + + + + + + + - - + + + + + + - @@ -305,11 +338,18 @@ x:Name="SelectionSummaryText" Grid.Column="1" VerticalAlignment="Center" + TextTrimming="CharacterEllipsis" Foreground="{ThemeResource TextFillColorSecondaryBrush}" /> - - - - + Every column sorts (button, composed automation name like + "Name, sorted ascending") and filters (funnel flyout; the funnel + turns accent-colored while its filter is active). The header row + itself gets subtle chrome to read as a header, not a data row. --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +