mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-07-17 01:42:45 +02:00
fix race condition when scrolling to merge conflict
This commit is contained in:
@ -398,25 +398,6 @@ func (gui *Gui) refreshStateFiles() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) catSelectedFile(g *gocui.Gui) (string, error) {
|
|
||||||
item, err := gui.getSelectedFile()
|
|
||||||
if err != nil {
|
|
||||||
if err != gui.Errors.ErrNoFiles {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return "", gui.newStringTask("main", gui.Tr.SLocalize("NoFilesDisplay"))
|
|
||||||
}
|
|
||||||
if item.Type != "file" {
|
|
||||||
return "", gui.newStringTask("main", gui.Tr.SLocalize("NotAFile"))
|
|
||||||
}
|
|
||||||
cat, err := gui.GitCommand.CatFile(item.Name)
|
|
||||||
if err != nil {
|
|
||||||
gui.Log.Error(err)
|
|
||||||
return "", gui.newStringTask("main", err.Error())
|
|
||||||
}
|
|
||||||
return cat, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (gui *Gui) handlePullFiles(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handlePullFiles(g *gocui.Gui, v *gocui.View) error {
|
||||||
// if we have no upstream branch we need to set that first
|
// if we have no upstream branch we need to set that first
|
||||||
currentBranch := gui.currentBranch()
|
currentBranch := gui.currentBranch()
|
||||||
|
@ -398,7 +398,7 @@ func (gui *Gui) layout(g *gocui.Gui) error {
|
|||||||
searchPrefixView.BgColor = gocui.ColorDefault
|
searchPrefixView.BgColor = gocui.ColorDefault
|
||||||
searchPrefixView.FgColor = gocui.ColorGreen
|
searchPrefixView.FgColor = gocui.ColorGreen
|
||||||
searchPrefixView.Frame = false
|
searchPrefixView.Frame = false
|
||||||
gui.setViewContent(gui.g, searchPrefixView, searchPrefix)
|
gui.setViewContent(searchPrefixView, searchPrefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
if searchView, err := g.SetView("search", appStatusOptionsBoundary-1+searchViewOffset+len(searchPrefix), height-2+searchViewOffset, optionsVersionBoundary+searchViewOffset, height+searchViewOffset, 0); err != nil {
|
if searchView, err := g.SetView("search", appStatusOptionsBoundary-1+searchViewOffset+len(searchPrefix), height-2+searchViewOffset, optionsVersionBoundary+searchViewOffset, height+searchViewOffset, 0); err != nil {
|
||||||
@ -440,7 +440,7 @@ func (gui *Gui) layout(g *gocui.Gui) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if gui.State.OldInformation != information {
|
if gui.State.OldInformation != information {
|
||||||
gui.setViewContent(g, informationView, information)
|
gui.setViewContent(informationView, information)
|
||||||
gui.State.OldInformation = information
|
gui.State.OldInformation = information
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ func (gui *Gui) refreshLineByLinePanel(diff string, secondaryDiff string, second
|
|||||||
}
|
}
|
||||||
|
|
||||||
gui.g.Update(func(*gocui.Gui) error {
|
gui.g.Update(func(*gocui.Gui) error {
|
||||||
gui.setViewContent(gui.g, gui.getSecondaryView(), secondaryPatchParser.Render(-1, -1, nil))
|
gui.setViewContent(gui.getSecondaryView(), secondaryPatchParser.Render(-1, -1, nil))
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -242,7 +242,7 @@ func (gui *Gui) refreshMainView() error {
|
|||||||
mainView.Wrap = false
|
mainView.Wrap = false
|
||||||
|
|
||||||
gui.g.Update(func(*gocui.Gui) error {
|
gui.g.Update(func(*gocui.Gui) error {
|
||||||
gui.setViewContent(gui.g, gui.getMainView(), colorDiff)
|
gui.setViewContent(gui.getMainView(), colorDiff)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -222,19 +222,39 @@ func (gui *Gui) refreshMergePanel() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
mainView := gui.getMainView()
|
|
||||||
mainView.Wrap = false
|
|
||||||
if err := gui.newStringTask("main", content); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := gui.scrollToConflict(gui.g); err != nil {
|
if err := gui.scrollToConflict(gui.g); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mainView := gui.getMainView()
|
||||||
|
mainView.Wrap = false
|
||||||
|
|
||||||
|
if err := gui.newStringTaskWithoutScroll("main", content); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) catSelectedFile(g *gocui.Gui) (string, error) {
|
||||||
|
item, err := gui.getSelectedFile()
|
||||||
|
if err != nil {
|
||||||
|
if err != gui.Errors.ErrNoFiles {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return "", gui.newStringTask("main", gui.Tr.SLocalize("NoFilesDisplay"))
|
||||||
|
}
|
||||||
|
if item.Type != "file" {
|
||||||
|
return "", gui.newStringTask("main", gui.Tr.SLocalize("NotAFile"))
|
||||||
|
}
|
||||||
|
cat, err := gui.GitCommand.CatFile(item.Name)
|
||||||
|
if err != nil {
|
||||||
|
gui.Log.Error(err)
|
||||||
|
return "", gui.newStringTask("main", err.Error())
|
||||||
|
}
|
||||||
|
return cat, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (gui *Gui) scrollToConflict(g *gocui.Gui) error {
|
func (gui *Gui) scrollToConflict(g *gocui.Gui) error {
|
||||||
panelState := gui.State.Panels.Merging
|
panelState := gui.State.Panels.Merging
|
||||||
if len(panelState.Conflicts) == 0 {
|
if len(panelState.Conflicts) == 0 {
|
||||||
|
@ -94,7 +94,7 @@ func (gui *Gui) refreshSecondaryPatchPanel() error {
|
|||||||
secondaryView.Wrap = false
|
secondaryView.Wrap = false
|
||||||
|
|
||||||
gui.g.Update(func(*gocui.Gui) error {
|
gui.g.Update(func(*gocui.Gui) error {
|
||||||
gui.setViewContent(gui.g, gui.getSecondaryView(), gui.GitCommand.PatchManager.RenderAggregatedPatchColored(false))
|
gui.setViewContent(gui.getSecondaryView(), gui.GitCommand.PatchManager.RenderAggregatedPatchColored(false))
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
@ -42,7 +42,7 @@ func (gui *Gui) refreshStatus() {
|
|||||||
status += fmt.Sprintf("%s → %s ", repoName, name)
|
status += fmt.Sprintf("%s → %s ", repoName, name)
|
||||||
|
|
||||||
gui.g.Update(func(*gocui.Gui) error {
|
gui.g.Update(func(*gocui.Gui) error {
|
||||||
gui.setViewContent(gui.g, gui.getStatusView(), status)
|
gui.setViewContent(gui.getStatusView(), status)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,26 @@ func (gui *Gui) newStringTask(viewName string, str string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) newStringTaskWithoutScroll(viewName string, str string) error {
|
||||||
|
view, err := gui.g.View(viewName)
|
||||||
|
if err != nil {
|
||||||
|
return nil // swallowing for now
|
||||||
|
}
|
||||||
|
|
||||||
|
manager := gui.getManager(view)
|
||||||
|
|
||||||
|
f := func(stop chan struct{}) error {
|
||||||
|
gui.setViewContent(view, str)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := manager.NewTask(f); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (gui *Gui) getManager(view *gocui.View) *tasks.ViewBufferManager {
|
func (gui *Gui) getManager(view *gocui.View) *tasks.ViewBufferManager {
|
||||||
manager, ok := gui.viewBufferManagerMap[view.Name()]
|
manager, ok := gui.viewBufferManagerMap[view.Name()]
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -340,7 +340,7 @@ func (gui *Gui) cleanString(s string) string {
|
|||||||
return utils.NormalizeLinefeeds(output)
|
return utils.NormalizeLinefeeds(output)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) setViewContent(g *gocui.Gui, v *gocui.View, s string) {
|
func (gui *Gui) setViewContent(v *gocui.View, s string) {
|
||||||
v.Clear()
|
v.Clear()
|
||||||
fmt.Fprint(v, gui.cleanString(s))
|
fmt.Fprint(v, gui.cleanString(s))
|
||||||
}
|
}
|
||||||
@ -358,7 +358,7 @@ func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) {
|
|||||||
if err := v.SetCursor(0, 0); err != nil {
|
if err := v.SetCursor(0, 0); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
gui.setViewContent(gui.g, v, s)
|
gui.setViewContent(v, s)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user