fix(app): the window stays responsive during a sync, Sync all says where it stands, and the table follows the sync #169

Merged
james.maes merged 2 commits from fix/167-sync-all-responsive into main 2026-11-11 01:51:39 +00:00
2 Commits
Author SHA1 Message Date
james.maesandClaude Fable 5.2 ae81e0097b fix(app): review of #169: the retry action keeps its guard, the order is protected by tests, and smaller repairs
- The result bar's action is disabled, and does nothing, while a retry cannot
  run (a path recovery, a load, a sync): Execute alone does not ask.
- TableOrderTests checks the table against the rule written out in the test,
  step by step and over random runs; it fails for an order regression that the
  earlier tests let through.
- A row from before a reload is not put back into the table.
- A batch hands over every report even when the handler fails for one.
- The monitor names what was running at the time of a stall, and does not take
  a process that was not running (sleep, a debugger) for a window that did not
  respond.
- The status never shows more done than there is to do at the start of a run.
- The folder button says so when the folder does not exist yet.
- The UI test for the header cycle follows the third click; stale comments;
  the live region is announced once the bar is on screen.

Refs #167
Refs #168

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
2026-11-10 19:51:00 -06:00
james.maesandClaude Fable 5.2 f426a2f7b5 fix(app): the window stays responsive while a large account syncs, Sync all says where it stands, and the table follows the sync
Progress reports were delivered to the window one by one. A clone reports
every whole percent, so 281 clones are 28,662 reports; with the rows on
screen they took 27.5 s of the window's thread in a 60 s pass, and the
window stopped answering for up to a second at a time (23 stalls, 11.6 s).

- BatchedRepoProgress delivers reports a few times a second, the latest per
  repository, and what still waits when the run ends is delivered before the
  outcome is stated. The same pass now has no stall with the rows at rest.
- SyncAllStatus says for the whole pass which account is syncing, which of
  how many, and how far along it is, and holds the result afterwards. The
  window shows it in one row above the workspace, with a link to the account
  and Cancel. It replaces the dialog at the end of the pass.
- ResponsivenessMonitor writes to the activity log when the window did not
  respond, for how long, and what was running.
- The table's default order follows the sync: the repositories in progress,
  then the failed ones, then the finished ones (the latest first), then the
  ones waiting; when the sync is over, the failed ones first, then by name.
  A column the user chose still wins, and a third click on it returns to the
  default. The row of chips above the table is gone: those rows are in the
  table.
- The result bar is one row (Retry failed when something failed, otherwise
  Open folder); Open folder is also a toolbar button. Fewer rows are built
  ahead of the viewport, and rows take their new place without animation.

Closes #167
Closes #168

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
2026-11-10 19:36:21 -06:00