jesseduffield.lazygit/pkg/integration/tests
Stefan Haller b96b8a9753 Add RefreshBlockingInput to buffer keypresses until a refresh has landed
A refresh from the UI thread returns immediately and applies its model
and view updates as queued UI-thread callbacks. A key pressed before
those have run is handled against the stale, pre-refresh state. For most
keys that's harmless, but some handlers turn that state into git
commands: pressing space twice in quick succession in the staging panel
builds the second patch from the already-applied diff and fails with
'patch does not apply', because the refresh after the first press is
what moves the selection to the next stageable hunk.

Notably, this is not just a regression of the recent change that made
UI-thread refreshes non-blocking; the window was merely much narrower
before. A blocking refresh parked the UI thread while the scopes'
bounces were queued, and the event loop drains pending keyboard input
with priority over queued user events, so a key pressed during the
blocked window still beat the queued state updates. The guarantee that
the next keypress sees post-refresh state had already ended when the
scopes' state updates moved from worker-side mutex-guarded writes to
UI-thread bounces.

Fix it with the input-blocking mechanism we already use for commit
surgery, exposed as a new RefreshBlockingInput entry point: it begins
blocking events synchronously in the calling handler, and ends the
block from a callback that the finishing step queues behind the
refresh's own updates. Keys pressed while the refresh is in flight are
buffered and replayed, in order, against the fully refreshed state;
since a replayed key's handler re-enters this same path, a burst of
keypresses applies sequentially, each one seeing the previous one's
refresh. Unlike the old blocking refreshes, this doesn't freeze the UI
thread: rendering, spinners, resizing, and mouse scrolling keep working
while input is withheld.

Blocking input is opt-in per call site rather than the default for all
UI-thread refreshes, because most refreshes (the focus-in and startup
refreshes, say) don't produce state that the next keypress depends on,
and blocking on them would delay typing for no reason. It should also be
limited to quick, narrow-scoped refreshes: a full refresh, or any scope
that pulls in COMMITS, can take very long in large repos and should
usually not hold up input.

The staging panel's stage/discard/edit-hunk refreshes use it now.
2026-07-22 08:31:11 +02:00
..
bisect Make integration tests using commits more robust 2026-07-09 11:56:27 +02:00
branch Make integration tests using commits more robust 2026-07-09 11:56:27 +02:00
cherry_pick Keep selected commits stable across refreshes 2026-06-23 09:20:05 +02:00
commit Make integration tests using commits more robust 2026-07-09 11:56:27 +02:00
config Test per-repo side panel config and re-application on repo switch 2026-06-23 14:15:18 +02:00
conflicts Auto-dismiss the continue-rebase prompt when it becomes stale 2026-07-03 18:30:02 +02:00
custom_commands Make integration tests using commits more robust 2026-07-09 11:56:27 +02:00
demo Move the new-worktree keybinding from worktrees to universal 2026-07-03 18:53:05 +02:00
diff Allow cycling pagers in reverse 2026-06-07 15:51:57 +02:00
file Only prompt to continue a rebase/merge if we started it 2026-07-03 18:28:07 +02:00
filter_and_search Convert keybinding fields to Keybinding 2026-05-25 15:32:47 +02:00
filter_by_author Make integration tests using commits more robust 2026-07-09 11:56:27 +02:00
filter_by_path When entering a commit in path filtering mode, select the filtered path 2025-10-09 09:58:15 +02:00
interactive_rebase Make integration tests using commits more robust 2026-07-09 11:56:27 +02:00
misc Offer direnv .envrc approval from inside lazygit 2026-06-04 09:05:01 +02:00
patch_building Make integration tests using commits more robust 2026-07-09 11:56:27 +02:00
reflog Un-deprecate UserConfig.Git.Log.Order and ShowGraph 2025-07-09 13:15:03 +02:00
remote feat: add fork remote command 2025-11-16 17:26:00 +01:00
shared Add merge options menu 2025-10-09 08:45:58 +02:00
shell_commands Rename "Custom Command" to "Shell Command" 2024-08-17 10:56:03 +02:00
staging Add RefreshBlockingInput to buffer keypresses until a refresh has landed 2026-07-22 08:31:11 +02:00
stash Fix dropping a range of stashes in filtered mode 2025-08-25 18:41:06 +02:00
status Add backward cycling support for all branches log view 2026-03-08 17:06:17 +01:00
submodule Show per-side commit logs for submodule conflicts in the main view 2026-06-28 16:12:36 +02:00
sync Tighten a test expectation 2026-06-22 09:00:15 +02:00
tag Fix deleting a remote tag when a remote branch with the same name exists 2025-11-27 19:52:18 +01:00
ui Don't show a transient view whose window is not part of the layout 2026-07-17 12:07:24 +02:00
undo Switch to branches view when checking out a commit 2025-11-16 21:23:40 +01:00
worktree Offer to delete the branch when removing a worktree 2026-07-03 19:04:44 +02:00
test_list.go Add test showing that a rapid second keypress acts on a stale staging panel 2026-07-21 22:23:58 +02:00
test_list_generator.go Fix typos 2025-01-03 10:50:36 +11:00
tests.go Set working directory in lazygit test command 2024-01-12 19:59:31 +11:00