-
-
Couldn't load subscription status.
- Fork 2.3k
Fix main view occasionally scrolling to the top on its own when focused #4573
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Coverage summary from CodacySee diff coverage on Codacy
Coverage variation details
Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: Diff coverage details
Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: See your quality gate settings Change summary preferencesFootnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great work finding the cause of the bug, and great that it's such a simple solution
Previously we would re-render the focused main view several times during a refresh, once for every side panel. While this should usually not be noticeable for users because we are careful to avoid flicker when refreshing the main view, this would sometimes lead to the main view scrolling up to the top by itself; see PR description for more details.
6bc7a3e to
f3466e2
Compare
This MR contains the following updates: | Package | Update | Change | |---|---|---| | [jesseduffield/lazygit](https://github.com/jesseduffield/lazygit) | minor | `v0.50.0` -> `v0.51.0` | MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot). **Proposed changes to behavior should be submitted there as MRs.** --- ### Release Notes <details> <summary>jesseduffield/lazygit (jesseduffield/lazygit)</summary> ### [`v0.51.0`](https://github.com/jesseduffield/lazygit/releases/tag/v0.51.0) [Compare Source](jesseduffield/lazygit@v0.50.0...v0.51.0) <!-- Release notes generated using configuration in .github/release.yml at v0.51.0 --> #### What's Changed ##### Enhancements 🔥 - Clean up the configuration of where a custom command's output goes by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4525 - Add custom patch command "Move patch into new commit before the original commit" by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4552 - Make '>' first jump to the beginning of the branch, and only then to the first commit by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4544 - Add an alternate keybinding (default <c-s>) for ConfirmInEditor by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4532 - Print migration changes to the console when migrating config file by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4548 ##### Fixes 🔧 - Migrate deprecated AllBranchesLogCmd to AllBranchesLogCmds by [@​ChrisMcD1](https://github.com/ChrisMcD1) in jesseduffield/lazygit#4345 - Clear preserved commit message when entering CommitEditorPanel by [@​ChrisMcD1](https://github.com/ChrisMcD1) in jesseduffield/lazygit#4558 - Split behavior of rendering allBranchesLogCmd and switching to next cmd by [@​ChrisMcD1](https://github.com/ChrisMcD1) in jesseduffield/lazygit#4574 - Fix possible crash with auto-forwarding branches by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4565 - Fix main view occasionally scrolling to the top on its own when focused by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4573 - Fix home and end keys in prompts by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4554 - Fix crash when clicking in the status view by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4567 ##### Maintenance ⚙️ - Clean up utils package by [@​stefanhaller](https://github.com/stefanhaller) in jesseduffield/lazygit#4538 ##### Docs 📖 - reword documentation for git.autoForwardBranches by [@​sean-xyz](https://github.com/sean-xyz) in jesseduffield/lazygit#4545 #### New Contributors - [@​sean-xyz](https://github.com/sean-xyz) made their first contribution in jesseduffield/lazygit#4545 **Full Changelog**: jesseduffield/lazygit@v0.50.0...v0.51.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box --- This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4yMi4wIiwidXBkYXRlZEluVmVyIjoiNDAuMjMuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
Ok, this is a long one. (It took me all weekend to figure out.)
We seem to have a race condition between re-rendering the main view and the layout code that checks whether a view has become smaller and therefore needs to scroll up. When rerendering the main view, we are careful not to invalidate the ViewLines array, so the code first calls Reset on the view, and then starts writing lines to the view until we have written enough for its old scroll position, and only then do we trigger a redraw. This is all well and good, but theoretically it could happen that the above-mentioned layout code runs shortly after the task has started writing lines to the view (say, after the first one has been written), and then it would see that the view's height is only 1, and scroll it all the way to the top.
I have never seen this happen, so it seems that we are being lucky and the race condition is only a theoretical one.
However: we had a very silly and embarrassing bug in the focused-main-view code that triggers the race condition occasionally. The bug is that when the main view is focused, we would refresh it multiple times in quick succession, once for every side panel that is being refreshed (instead of just once for the side panel that it belongs to). So the first task would call Reset, start writing lines to the view, and then the second task would come along, kill the first, call Reset again, and start writing lines again, and so on. Apparently this made it more likely for the layout code to run concurrently with this, and see the view at a moment where it only has one or two lines. I have seen it scroll to the top on its own a few times, which is very annoying when you are in the middle of reviewing a longer commit, for instance.
We can fix this by refreshing the main view only for the side panel that it belongs to, which is what this PR does. I have let lazygit run over night with a
refresher.refreshIntervalvalue of 3, and it hadn't scrolled to the top when I came to look in the morning, which makes me pretty confident that we're good now.It would still be nice if we could fix the race condition for real too, but it's less urgent now, and it also doesn't seem trivial. I guess instead of writing lines directly to the view we would have to buffer them first, and only write them to the view when the original scroll position is reached (with some synchronization, e.g. with a OnUIThread). There are other complications that make this tricky though, and I have no plans right now to tackle this.