jesseduffield.lazygit/pkg/gui/controllers/helpers
Stefan Haller ae095f276b Don't refuse a repo switch during a pure refresh
The refreshes on focus-in, right after a repo switch, and after
returning from a subprocess are full foreground refreshes, so their
tasks kept Busy() true for as long as the slowest scope took — and any
switch attempt in that window was refused with the "can't switch"
toast. The focus-in one is particularly annoying: focusing lazygit is
often precisely what the user does in order to switch repos, and right
after regaining focus is when a refresh takes longest.

Blocking the switch bought nothing there. The refusal exists for user
operations, whose follow-up work (e.g. a Then callback reading the
model) isn't covered by the switch-safety guards; but these refreshes
merely reload state, and a refresh by itself is now switch-safe: its
git commands run against the repo it was started for, and the
generation guard drops its updates when the repo changed.

We can't just mark them Background, because that flag also decides
whether the files refresh lets git take optional locks to persist its
refreshed stat cache — worth doing for an attended refresh, and the
focus-in refresh (typically running right after external changes) is
the case that profits most. So split the two meanings: a new
DontBlockRepoSwitch option dispatches the refresh's tasks as background
tasks (excluded from Busy()) while keeping the attended optional-locks
behavior. Combining it with Then panics, since Then is not
generation-guarded.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 17:07:39 +02:00
..
amend_helper.go Allow passing refresh scope to WithGpgHandling 2025-03-24 08:41:58 +01:00
app_status_helper.go Render the app status in a single background render loop 2026-07-17 15:55:01 +02:00
bisect_helper.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
branches_helper.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
cherry_pick_helper.go Run the sync commit-surgery ops on a worker with input blocked 2026-07-17 12:32:32 +02:00
commits_helper.go Rename Key to Keys in Binding, KeybindingsOpts, and MenuItem 2026-05-25 15:18:18 +02:00
commits_helper_test.go Remove hard line breaks when rewording commits 2024-03-09 10:00:44 +01:00
confirmation_helper.go Remove the now-dead PopupMutex 2026-07-17 12:35:54 +02:00
credentials_helper.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
diff_helper.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
files_helper.go Cleanup: remove unused interfaces for helpers 2025-04-08 16:08:25 +02:00
fixup_helper.go Suppress command logs for git calls related to the ctrl+f command 2026-07-19 19:22:48 +02:00
fixup_helper_test.go Ignore fixup commits for a found base commit when doing ctrl-f 2026-01-24 16:04:35 +01:00
gpg_helper.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
helpers.go Implement suspending the app using ctrl-z 2025-08-14 20:41:46 +02:00
host_helper.go Cleanup: remove unused interfaces for helpers 2025-04-08 16:08:25 +02:00
inline_status_helper.go Re-render to clear an inline status when its operation finishes 2026-07-07 17:46:16 +02:00
menu_key.go Use a slice of keys for each binding 2026-05-25 15:18:18 +02:00
merge_and_rebase_helper.go Check for exec todos on the UI thread 2026-07-17 12:35:54 +02:00
merge_conflicts_helper.go Refresh the merge conflicts state on the UI thread 2026-07-17 12:35:54 +02:00
mode_helper.go Make RefreshOptions.Then a func() error, queue it via OnUIThread 2026-07-07 18:09:33 +02:00
patch_building_helper.go Show renamed files in the custom patch builder 2026-07-04 13:05:09 +02:00
record_directory_helper.go split context common from helper common 2023-04-30 13:19:53 +10:00
refresh_helper.go Don't refuse a repo switch during a pure refresh 2026-07-20 17:07:39 +02:00
refresh_helper_test.go Restore commit selection even when the commit's TODO status changed 2026-06-23 09:20:05 +02:00
refs_helper.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
repos_helper.go Refuse a repo switch while a foreground operation is in flight 2026-07-07 18:09:33 +02:00
search_helper.go Cleanup: remove unnecessary function Label() 2026-04-30 22:14:26 +02:00
signal_handling.go Implement suspending the app using ctrl-z 2025-08-14 20:41:46 +02:00
signal_handling_windows.go Implement suspending the app using ctrl-z 2025-08-14 20:41:46 +02:00
snake_helper.go Bump gocui and adapt lazygit code 2024-12-01 10:40:08 +01:00
staging_helper.go Add user config to use hunk mode by default when entering staging view 2025-07-04 19:41:40 +02:00
sub_commits_helper.go Remove refresh mutexes made redundant by bouncing 2026-07-07 18:09:33 +02:00
suggestions_helper.go Hold the file-path suggestions trie outside the model 2026-07-17 12:35:54 +02:00
suspend_resume_helper.go Implement suspending the app using ctrl-z 2025-08-14 20:41:46 +02:00
tags_helper.go Convert keybinding fields to Keybinding 2026-05-25 15:32:47 +02:00
update_helper.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
upstream_helper.go Cleanup: remove unused interfaces for helpers 2025-04-08 16:08:25 +02:00
upstream_helper_test.go Standardise on using lo for slice functions 2023-07-30 18:51:23 +10:00
view_helper.go standardise helper args 2023-04-30 13:19:53 +10:00
window_arrangement_helper.go Add gui.shrinkSidePanelsToContent option 2026-07-03 19:25:01 +02:00
window_arrangement_helper_test.go Add gui.shrinkSidePanelsToContent option 2026-07-03 19:25:01 +02:00
window_helper.go Drive the side panel layout from gui.sidePanels 2026-06-23 14:15:18 +02:00
working_tree_helper.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
worktree_helper.go Remove the RefreshMode field 2026-07-17 12:32:32 +02:00
worktree_helper_test.go Add helper to compute candidate worktree parent directories 2026-07-03 18:53:05 +02:00