jesseduffield.lazygit/pkg/gui
Stefan Haller 58e121b933 Don't block the UI thread when triggering an immediate fetch on repo switch
Switching repos triggers an immediate background fetch by sending on
the goEvery retrigger channel. The send was blocking, but the goEvery
loop only receives between callbacks: while a fetch is in flight, it
waits for that fetch to finish before returning to its select. So a
repo switch that landed while a fetch was in flight would stall the UI
thread for the remainder of the fetch.

Worse, since worker refreshes capture state on the UI thread with a
blocking OnUIThreadAndWaitBackground call, the in-flight fetch's
post-fetch refresh can itself be waiting for the UI thread, turning
that stall into a deadlock cycle:

  UI thread: switchTo -> triggerImmediateFetch, blocking send
  goEvery loop: waiting for the in-flight fetch to finish
  fetch worker: PostFetchRefresh -> RefreshFromWorker, waiting for
    the UI thread

Make the send non-blocking, and give the channel a buffer of one so
that a trigger arriving while a fetch is in flight is latched rather
than dropped; that fetch is fetching the previous repo, so we still
need another one after it. The goEvery loop picks the trigger up as
soon as it returns to its select, and concurrent triggers coalesce.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 16:48:42 +02:00
..
context Compute list index conversions independently of rendering 2026-07-09 14:54:15 +02:00
controllers Read lines based on scroll position instead of a fixed per-notch delta 2026-07-09 09:32:35 +02:00
filetree Clamp the commit-file tree selection when the tree is rebuilt 2026-07-07 18:09:33 +02:00
mergeconflicts Pick both hunks, not the common ancestor, in diff3 conflicts 2026-07-01 09:57:26 +02:00
modes Make Commit.Hash a getter for an unexported hash field 2025-04-29 14:57:15 +02:00
patch_exploring Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
popup Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
presentation Show renamed files in the custom patch builder 2026-07-04 13:05:09 +02:00
services/custom_commands Capture the commits refresh's inputs on the UI thread 2026-07-07 18:10:45 +02:00
status Lock the status list when reading it 2026-07-08 18:24:18 +02:00
style Modernize all codes 2025-11-15 10:46:23 +01:00
types Read lines based on scroll position instead of a fixed per-notch delta 2026-07-09 09:32:35 +02:00
background.go Don't block the UI thread when triggering an immediate fetch on repo switch 2026-07-10 16:48:42 +02:00
command_log_panel.go Write the command log on the UI thread 2026-07-09 08:41:10 +02:00
context.go Bump gocui (and tcell) 2025-12-23 16:49:16 +01:00
context_config.go Remove some unused code 2025-07-08 15:14:45 +02:00
controllers.go Redesign the 'w' worktree-creation flow 2026-07-03 18:53:05 +02:00
dummies.go Move NewDummyCommon to pkg/common 2025-05-06 09:43:26 +02:00
editors.go Move modifiers into Key 2026-04-30 22:22:53 +02:00
extras_panel.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
global_handlers.go Read lines based on scroll position instead of a fixed per-notch delta 2026-07-09 09:32:35 +02:00
gui.go Read lines based on scroll position instead of a fixed per-notch delta 2026-07-09 09:32:35 +02:00
gui_common.go Read lines based on scroll position instead of a fixed per-notch delta 2026-07-09 09:32:35 +02:00
gui_driver.go Only prompt to continue a rebase/merge if we started it 2026-07-03 18:28:07 +02:00
information_panel.go Rename ModeStatus.Description to InfoLabel 2025-08-14 17:59:38 +02:00
keybindings.go Fold remaining alt bindings into their main fields 2026-05-25 15:32:47 +02:00
layout.go Read lines based on scroll position instead of a fixed per-notch delta 2026-07-09 09:32:35 +02:00
main_panels.go Run moveMainContextPairToTop before queueing main-view tasks 2026-07-02 17:32:01 +02:00
menu_panel.go Fold remaining alt bindings into their main fields 2026-05-25 15:32:47 +02:00
options_map.go Cleanup: filter out empty keybindings earlier 2026-05-28 19:26:43 +02:00
pty.go Add pty support on Windows via ConPTY 2026-07-03 18:47:15 +02:00
recent_repos_panel.go Remove unused field gui.IsNewRepo 2024-12-01 10:44:26 +01:00
side_panels.go Re-apply the side panel config on a live config reload 2026-06-23 14:15:18 +02:00
side_panels_test.go Drive the side panel layout from gui.sidePanels 2026-06-23 14:15:18 +02:00
tasks_adapter.go Render content-only when a task reads more lines into a view 2026-07-09 09:32:35 +02:00
test_mode.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
view_helpers.go Render content-only when a task reads more lines into a view 2026-07-09 09:32:35 +02:00
views.go Clear tab strips on views that are no longer tabs 2026-06-23 14:15:18 +02:00