Repository: jesseduffield/lazygit (language: go)

Issue:
Race Condition in Branch Focus Rendering
**Describe the bug**
There is now a race condition between the selection of the focused branch, and the rendering of the view, due to the changes to refresh_helper in ff4ae4a54454. One way this manifests itself as a flaky integration test `custom_commands/suggestions_preset`

**To Reproduce**
Steps to reproduce the behavior:

I discovered the problem when my pre-PR checks failed on https://github.com/jesseduffield/lazygit/pull/4261

It is tough to reproduce locally, but I am reliably able to do it with this script:
```bash
#!/bin/bash
set -e
    
for (( i=0; i<100; i++ ))
do
    go1.22.0 run cmd/integration_test/main.go cli custom_commands/suggestions_preset
done
```
>Go 1.22 is used because I ran a `git bisect run` on this script to find that ff4ae4a54454 introduced the problem, which was prior to the 1.23 fix. It is unrelated to the issue at hand

1. Run the above integration test 100 times
2. Observe the below error on one of the runs

```
Unexpected selection in view 'localBranches'. Expected line 1 to be selected but got line 0.
Expected selected lines:
---
contains 'branch-four'
---

Actual selected lines:
---
  * branch-three
---

Final Lazygit state:
╭─[1]─Status───────────────────────────────────────────────────╮╭─Log────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│repo → branch-three                                           ││* commit 65d822a (HEAD -> branch-three)                                                                                     ▐
╰──────────────────────────────────────────────────────────────╯│| Author: CI <CI@example.com>                                                                                               ▐
╭─[2]─Files - Worktrees - Submodules───────────────────────────╮│| Date:   0 seconds ago                                                                                                     ▐
│                                                              ││|                                                                                                                           ▐
│                                                              ││|     blah                                                                                                                  ▐
│                                                              ││|                                                                                                                           ▐
│                                                              ││* commit 55432ed (branch-two)                                                                                               ▐
│                                                              ││| Author: CI <CI@example.com>                                                                                               ▐
│                                                              ││| Date:   0 seconds ago                                                                                                     ▐
│                                                              ││|                                                                                                                           ▐
│                                                              ││|     blah                                                                                                                  ▐
│                                                              ││|                                                                                                                           ▐
│                                                              ││* commit d6e4e6b (branch-one)                                                                                               ▐
│                                                              ││  Author: CI <CI@example.com>                                                                                               ▐
╰───────────────────────────────────────────────────────0 of 0─╯│  Date:   0 seconds ago                                                                                                     ▐
╭─[3]─Local branches - Remotes - Tags──────────────────────────╮│                                                                                                                            ▐
│  * branch-three                                              ││      blah                                                                                                                  ▐
│0s  branch-four                                               ││                                                                                                                            ▐
│0s  branch-two                                                ││                                                                                                                            ▐
│0s  branch-one                                                ││                                                                                                                            ▐
│                                                              ││                                                                                                                            ▐
│                                                              ││                                                                                                                            │
│                                                              ││                                                                                                                            │
│                                                              ││                                                                                                                            │
│                                                              ││                                                                                                                            │
│                                                              ││                                                                                                                            │
╰───────────────────────────────────────────────────────1 of 4─╯│                                                                                                                            │
╭─[4]─Commits - Reflog─────────────────────────────────────────╮│                                                                                                                            │
│65d822a5 CI ◯ blah                                            ││                                                                                                                            │
│55432ed7 CI ◯ * blah                                          ││                                                                                                                            │
│d6e4e6bd CI ◯ * blah                                          ││                                                                                                                            │
│                                                              │╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
│                                                              │╭─Command log────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│                                                              ││You can hide/focus this panel by pressing '@'                                                                               │
│                                                              ││                                                                                                                            │
│                                                              ││                                                                                                                            │
│                                                              ││Custom command                                                                                                              │
│                                                              ││  bash -c "git checkout branch-three"                                                                                       │
╰───────────────────────────────────────────────────────1 of 3─╯│                                                                                                                            │
╭─[5]─Stash────────────────────────────────────────────────────╮│                                                                                                                            │
│                                                              ││                                                                                                                            │
╰───────────────────────────────────────────────────────0 of 0─╯╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Checkout: <space> | New branch: n | Delete: d | Rebase: r | Merge: M | Reset: g | Upstream: u | Keybindings: ? | Cancel: <esc>                                 Donate Ask Question unversioned

Upon failure, focused view was 'localBranches'.
Log:
Custom command
bash -c "git checkout branch-three"
panic: Test failed

goroutine 16 [running]:
github.com/jesseduffield/lazygit/pkg/gui.(*GuiDriver).Fail(0xc000591e00, {0xc000408000, 0xc6})
        /home/chrismcdonnell/linux-repos/lazygit/pkg/gui/gui_driver.go:119 +0x2f0
github.com/jesseduffield/lazygit/pkg/integration/components.(*assertionHelper).fail(...)
        /home/chrismcdonnell/linux-repos/lazygit/pkg/integration/components/assertion_helper.go:28
github.com/jesseduffield/lazygit/pkg/integration/components.(*assertionHelper).assertWithRetries(0xc0000471a0, 0x20?)
        /home/chrismcdonnell/linux-repos/lazygit/pkg/integration/components/assertion_helper.go:23 +0x32
github.com/jesseduffield/lazygit/pkg/integration/components.(*ViewDriver).assertLines(0xc0008a01a0, 0x0, {0xc00065a2f8, 0x4, 0xe6a260?})
        /home/chrismcdonnell/linux-repos/lazygit/pkg/integration/components/view_driver.go:270 +0x465
github.com/jesseduffield/lazygit/pkg/integration/components.(*ViewDriver).Lines(0xc0008a01a0, {0xc00065a2f8, 0x4, 0x4})
        /home/chrismcdonnell/linux-repos/lazygit/pkg/integration/components/view_driver.go:68 +0xb8
github.com/jesseduffield/lazygit/pkg/integration/tests/custom_commands.init.func45(_, {{{0x18d7468, 0x1}, {0xc00020f338, 0x5}, {0xc00020f360, 0x5}, {0x18d7368, 0x1}, {0xc00020f378, ...}, ...}, ...})
        /home/chrismcdonnell/linux-repos/lazygit/pkg/integration/tests/custom_commands/suggestions_preset.go:59 +0x608
github.com/jesseduffield/lazygit/pkg/integration/components.(*IntegrationTest).Run(0xc00033b550, {0x11a8b78, 0xc000591e00})
        /home/chrismcdonnell/linux-repos/lazygit/pkg/integration/components/test.go:201 +0x371
github.com/jesseduffield/lazygit/pkg/gui.(*Gui).handleTestMode.func2()
        /home/chrismcdonnell/linux-repos/lazygit/pkg/gui/test_mode.go:41 +0x170
created by github.com/jesseduffield/lazygit/pkg/gui.(*Gui).handleTestMode in goroutine 1
        /home/chrismcdonnell/linux-repos/lazygit/pkg/gui/test_mode.go:34 +0x1de
2025/02/15 00:40:48 exit status 2
exit status 1
```

**Expected behavior**
I expect the integration test to pass.

**Version info:**
Building on master on `01eece3737f9`
git version 2.25.1

**Additional context**
I added some local println debugging in, and here is what it showed on a failed run

```
Custom command
bash -c "git checkout branch-three"
SetFocusPoint
Finished AfterLayout
Our prev selected branch is &{branch-four    * ? ? ? ? false true false   blah abe927404c0894db9b8bf0f8894888515c081414 {{} 0}}
One branch is &{branch-four    * ? ? ? ? false true false   blah abe927404c0894db9b8bf0f8894888515c081414 {{} 0}}
One branch is &{branch-three  1s ? ? ? ? false false false   blah 6bd8e160c496dc847faaca4004b6792db1196109 {{} 0}}
One branch is &{branch-two  1s ? ? ? ? false false false   blah a2db829dee58bd8101da752ad52ad44fdb56a638 {{} 0}}
One branch is &{branch-one  1s ? ? ? ? false false false   blah 8f847dfe28ecf7c0d595c86653cd8a384afd6c5f {{} 0}}
Setting new branches
New branch is &{branch-three    * ? ? ? ? false true false   blah 6bd8e160c496dc847faaca4004b6792db1196109 {{} 0}}
New branch is &{branch-four  1s ? ? ? ? false false false   blah abe927404c0894db9b8bf0f8894888515c081414 {{} 0}}
New branch is &{branch-two  1s ? ? ? ? false false false   blah a2db829dee58bd8101da752ad52ad44fdb56a638 {{} 0}}
New branch is &{branch-one  1s ? ? ? ? false false false   blah 8f847dfe28ecf7c0d595c86653cd8a384afd6c5f {{} 0}}
Registering FocusLine
SetFocusPoint
Finished AfterLayout
Found branch with name at 1
```
On a successful run done with `-sandbox` on the integration test, we instead see:
```
<identical to above>
Registering FocusLine
Found branch with name at 1
SetFocusPoint
Finished AfterLayout
```
with the only difference being that the `SetSelectedIndex` was called before the `SetFocusPoint` in the render of the list.

https://github.com/ChrisMcD1/lazygit/blob/7d5d3c5ce5859d45af7bc731ed786b972a677aa1/pkg/gui/controllers/helpers/refresh_helper.go#L504-L513

Branch with the printlns can be found at https://github.com/ChrisMcD1/lazygit/tree/reproducing-broken. It's unclear to me the conditions that https://github.com/jesseduffield/lazygit/pull/4195 solves, which is why I am making an issue instead of a fix! It seems logical to me that we need to render the branch view after setting the selected index, so I must be missing something.

I don't think I can run `--debug` in an integration test to give more logs. If I can, please let me know how!


Discussion / hints:

Fix patch:
diff --git a/pkg/gui/controllers/helpers/refresh_helper.go b/pkg/gui/controllers/helpers/refresh_helper.go
index a5be655a1b1..cac9310d161 100644
--- a/pkg/gui/controllers/helpers/refresh_helper.go
+++ b/pkg/gui/controllers/helpers/refresh_helper.go
@@ -490,9 +490,9 @@ func (self *RefreshHelper) refreshBranches(refreshWorktrees bool, keepBranchSele
 		self.refreshView(self.c.Contexts().Worktrees)
 	}
 
-	self.refreshView(self.c.Contexts().Branches)
-
 	if !keepBranchSelectionIndex && prevSelectedBranch != nil {
+		self.searchHelper.ReApplyFilter(self.c.Contexts().Branches)
+
 		_, idx, found := lo.FindIndexOf(self.c.Contexts().Branches.GetItems(),
 			func(b *models.Branch) bool { return b.Name == prevSelectedBranch.Name })
 		if found {
@@ -500,6 +500,8 @@ func (self *RefreshHelper) refreshBranches(refreshWorktrees bool, keepBranchSele
 		}
 	}
 
+	self.refreshView(self.c.Contexts().Branches)
+
 	// Need to re-render the commits view because the visualization of local
 	// branch heads might have changed
 	self.c.Mutexes().LocalCommitsMutex.Lock()


Test patch: