jesseduffield.lazygit/pkg/gui/controllers/helpers
Stefan Haller 3103fe97ea Replace RefreshingBranchesMutex with a branch-load sequence guard
This removes the last refresh mutex. RefreshingBranchesMutex wasn't
guarding a data race (Branch.BehindBaseBranch is atomic, and every model
write is now bounced onto the UI thread); it was serializing the two
branch loads that race at the INITIAL startup stage — an immediate one
sorted without the reflog, and an async one that loads the reflog and
sorts by recency — so that the recency-sorted write landed last and won.
That serialization was never a real guarantee, only "very likely": it
relied on the immediate load acquiring the lock before the async load,
which had to load the reflog first.

Instead, each branch load takes a monotonically increasing sequence
number, and its bounce drops the write if a later-started load has
already applied. Combined with the preceding commit (immediate load runs
before the async one is spawned), this is an actual guarantee: the
immediate non-recency load always has a lower sequence than its recency
async partner, so the highest sequence number is always held by a
recency-sorted load, and highest-wins converges on recency ordering —
even if more refreshes fire during the INITIAL window, since each
refresh's async out-sequences its own immediate.

The guard also subsumes what the mutex gave post-startup: a slow, stale
refresh's bounce can no longer clobber a newer refresh's branches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 18:09:33 +02:00
..
amend_helper.go Allow passing refresh scope to WithGpgHandling 2025-03-24 08:41:58 +01:00
app_status_helper.go Pause background refreshes while driving a git operation 2026-06-19 17:56:48 +02:00
bisect_helper.go Change Refresh to not return an error 2025-07-02 16:09:42 +02:00
branches_helper.go Bounce BRANCHES model updates onto the UI thread 2026-07-07 18:09:33 +02:00
cherry_pick_helper.go Keep selected commits stable across refreshes 2026-06-23 09:20:05 +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 Add comments 2026-03-08 17:24:26 +01:00
credentials_helper.go chore: fix function name in comment 2025-12-06 18:28:58 +08:00
diff_helper.go Move the Ref interface from gui/types to models 2025-07-31 15:21:34 +02:00
files_helper.go Cleanup: remove unused interfaces for helpers 2025-04-08 16:08:25 +02:00
fixup_helper.go Ignore fixup commits for a found base commit when doing ctrl-f 2026-01-24 16:04:35 +01: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 Keep selected commits stable across refreshes 2026-06-23 09:20:05 +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 Bounce FILES model updates onto the UI thread 2026-07-07 18:09:33 +02:00
merge_conflicts_helper.go Cleanup: get rid of the variadic parameter of ContextMgr.Push 2025-04-08 16:08:25 +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 Replace RefreshingBranchesMutex with a branch-load sequence guard 2026-07-07 18:09:33 +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 Show a waiting status while resetting to a ref 2026-07-06 11:56:07 +02:00
repos_helper.go Remove RefreshingFilesMutex/FileTreeViewModel.RWMutex, dead code 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 Rework the worktrees-panel 'n' into a branch picker 2026-07-03 18:53:05 +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 Move post-FILES-refresh model reads into Then 2026-07-07 18:09:33 +02:00
worktree_helper.go Offer to delete the branch when removing a worktree 2026-07-03 19:04:44 +02:00
worktree_helper_test.go Add helper to compute candidate worktree parent directories 2026-07-03 18:53:05 +02:00