jesseduffield.lazygit/pkg/gui
Stefan Haller 775ebc9e44 Re-render to clear an inline status when its operation finishes
Operations that show an inline status ("Pushing", "Fast-forwarding",
"Fetching", …) removed it by relying on the async refresh they trigger
to redraw the view after the item operation had been cleared. That
ordering was never guaranteed: the item operation is cleared on the
worker once the operation's function returns, while the refresh redraws
the item from the UI thread whenever its (asynchronous) git work
happens to finish. If the refresh redrew before the clear, the status
was left on screen with no later redraw to remove it, so the branch (or
tag/remote) stayed stuck showing e.g. "Pushing" indefinitely even though
the operation had completed. This is timing-dependent, which is why it
surfaced as rare, hard-to-reproduce reports and as flaky CI failures.

Fix it by re-rendering in stop() right after clearing the operation,
and by making these refreshes synchronous rather than async. Because a
synchronous refresh has already updated the model and queued its own
redraw by the time stop() runs, and UI-thread callbacks run in order,
the redraw we queue here runs last and draws the up-to-date model with
the status removed. An async refresh couldn't give that guarantee: its
model update might not have landed yet, so the redraw could briefly
flash the pre-operation status.

Pull refreshes through the shared CheckMergeOrRebaseAndSelectHeadCommit,
so that helper becomes synchronous too; its only other caller,
RegularMerge, thereby also refreshes synchronously, which is fine: a
synchronous on-worker refresh is what we want anyway.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 17:46:16 +02:00
..
context Show renamed files in the custom patch builder 2026-07-04 13:05:09 +02:00
controllers Re-render to clear an inline status when its operation finishes 2026-07-07 17:46:16 +02:00
filetree Make file sort order and case sensitivity configurable 2026-03-30 17:53:25 +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 Only prompt to continue a rebase/merge if we started it 2026-07-03 18:28:07 +02:00
status Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
style Modernize all codes 2025-11-15 10:46:23 +01:00
types Only prompt to continue a rebase/merge if we started it 2026-07-03 18:28:07 +02:00
background.go Only pass --no-optional-locks for background status refreshes 2026-06-19 18:14:24 +02:00
command_log_panel.go Fold remaining alt bindings into their main fields 2026-05-25 15:32:47 +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 Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
gui.go Abstract pty startup behind a platform-specific primitive 2026-07-03 18:47:15 +02:00
gui_common.go Pause background refreshes while driving a git operation 2026-06-19 17:56:48 +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 Show each panel's first configured tab by default 2026-06-23 14:15:18 +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 Abstract task command over *exec.Cmd 2026-07-03 18:47:15 +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 Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
views.go Clear tab strips on views that are no longer tabs 2026-06-23 14:15:18 +02:00