jesseduffield.lazygit/pkg/gui/controllers
Stefan Haller 7c0fa9fe33 Run a refresh's git commands through the instance captured at its start
A background refresh's model writes are dropped by the generation guard
when the repo is switched mid-flight, but its git commands kept running
— and because the refresh read the live git instance at each step, any
command issued after the switch ran against the new repo. Now that git
commands are pinned to the directory of the instance they were built
from, capture the instance once when the refresh starts and run every
scope's git work through it, so a switch-crossing refresh keeps
addressing the repo it was started for.

The instance is captured together with the repo generation, on the UI
thread (where repo switches run), so the pair can't straddle a switch:
an old instance paired with the new generation would compute data from
the old repo and write it into the new repo's model unguarded.

This also removes the refresh workers' unsynchronized reads of the live
instance pointer, which raced its reassignment on the UI thread when a
background refresh crossed a repo switch (foreground refreshes can't
cross one: they keep Busy() true, which refuses the switch).

Two reads keyed app-state by the live instance's repo path on a worker
and now use the captured instance, fixing which repo they file under
when crossing a switch: the pull-request cache, and the "user dismissed
the base-remote prompt" flag. The base-remote menu's handlers keep
reading the live instance: a switch dismisses any open popup, so they
can't run against the wrong repo (and the OnPress body runs under a
foreground task, which blocks switching anyway).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 17:07:39 +02:00
..
helpers Run a refresh's git commands through the instance captured at its start 2026-07-20 17:07:39 +02:00
attach.go Add OnQuit hook for controllers 2026-04-21 11:25:29 +02:00
base_controller.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
basic_commits_controller.go Move the new-worktree keybinding from worktrees to universal 2026-07-03 18:53:05 +02:00
bisect_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
branches_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
command_log_controller.go Remove return value of Focus-related functions 2024-09-06 08:45:48 +02:00
commit_description_controller.go Fold remaining alt bindings into their main fields 2026-05-25 15:32:47 +02:00
commit_message_controller.go Convert keybinding fields to Keybinding 2026-05-25 15:32:47 +02:00
commits_files_controller.go Block input during the worker commit-surgery ops 2026-07-17 12:32:32 +02:00
common.go lots of changes 2023-04-30 13:19:53 +10:00
confirmation_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
context_lines_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
custom_patch_options_menu_action.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
diffing_menu_action.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
edit_config_action.go Extract editConfig into a shared EditConfigAction 2026-06-24 22:03:57 +02:00
files_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
filter_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
filtering_menu_action.go Make RefreshOptions.Then a func() error, queue it via OnUIThread 2026-07-07 18:09:33 +02:00
git_flow_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
global_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
jump_to_side_window_controller.go Stop requiring jumpToBlock to have exactly five entries 2026-06-23 14:15:18 +02:00
list_controller.go Fold remaining alt bindings into their main fields 2026-05-25 15:32:47 +02:00
list_controller_trait.go Enable nolintlint linter, and fix warnings 2025-06-30 18:30:11 +02:00
local_commits_controller.go Block input during the worker commit-surgery ops 2026-07-17 12:32:32 +02:00
local_commits_controller_test.go Move isFixupCommit to FixupHelper 2026-01-24 16:04:35 +01:00
main_view_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
menu_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
menu_key.go Use a slice of keys for each binding 2026-05-25 15:18:18 +02:00
merge_conflicts_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
options_menu_action.go If a menu entry has multiple keybindings, list them in a tooltip 2026-05-25 15:32:47 +02:00
patch_building_controller.go Run the sync commit-surgery ops on a worker with input blocked 2026-07-17 12:32:32 +02:00
patch_explorer_controller.go Fold remaining alt bindings into their main fields 2026-05-25 15:32:47 +02:00
patch_explorer_controller_test.go Strip the '+' and '-' characters when copying parts of a diff to the clipboard 2025-04-29 11:33:47 +02:00
prompt_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
quit_actions.go Refuse a repo switch while a foreground operation is in flight 2026-07-07 18:09:33 +02:00
reflog_commits_controller.go Fix showing diffs for renamed file when filtering by path 2025-07-27 12:05:41 +02:00
remote_branches_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
remotes_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
remotes_controller_test.go feat: add fork remote command 2025-11-16 17:26:00 +01:00
rename_similarity_threshold_controller.go Show renamed files in the custom patch builder 2026-07-04 13:05:09 +02:00
screen_mode_actions.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
scroll_off_margin.go Replace min/max helpers with built-in min/max 2024-04-07 23:24:10 +08:00
scroll_off_margin_test.go Add tests for scroll-off margin of zero 2023-08-21 08:10:28 +02:00
search_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
search_prompt_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
shell_command_action.go Strip leading/trailing whitespace from prompt input 2025-11-15 15:38:24 +01:00
side_window_controller.go Fold remaining alt bindings into their main fields 2026-05-25 15:32:47 +02:00
snake_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
staging_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
stash_controller.go Refresh once when dropping multiple stash entries 2026-07-17 12:35:54 +02:00
status_controller.go Extract editConfig into a shared EditConfigAction 2026-06-24 22:03:57 +02:00
sub_commits_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
submodules_controller.go Capture the files, reflog, branches and stash refresh inputs 2026-07-07 18:10:45 +02:00
suggestions_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
switch_to_diff_files_controller.go Move post-COMMIT_FILES-refresh work into Then 2026-07-07 18:09:33 +02:00
switch_to_focused_main_view_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
switch_to_sub_commits_controller.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
sync_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
tags_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
toggle_whitespace_action.go Move IgnoreWhitespaceInDiffView to user config 2025-07-09 13:15:03 +02:00
undo_controller.go Capture the commits refresh's inputs on the UI thread 2026-07-07 18:10:45 +02:00
vertical_scroll_controller.go Read lines based on scroll position instead of a fixed per-notch delta 2026-07-09 09:32:35 +02:00
view_selection_controller.go Read lines based on scroll position instead of a fixed per-notch delta 2026-07-09 09:32:35 +02:00
workspace_reset_controller.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
worktrees_controller.go Offer to delete the branch when removing a worktree 2026-07-03 19:04:44 +02:00