summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2020-05-19 18:01:29 +1000
committerJesse Duffield <jessedduffield@gmail.com>2020-05-19 18:05:14 +1000
commit36ac764133d3837a22619db922bd8d54f4b0938e (patch)
tree0128185188ab95ae95c172ca7f71fb521ecec960
parent003e45d2f5447d1f88e59e2f1edd85effeaae3ae (diff)
fix race condition when scrolling to merge conflict
-rw-r--r--pkg/gui/files_panel.go19
-rw-r--r--pkg/gui/layout.go4
-rw-r--r--pkg/gui/line_by_line_panel.go4
-rw-r--r--pkg/gui/merge_panel.go28
-rw-r--r--pkg/gui/patch_building_panel.go2
-rw-r--r--pkg/gui/status_panel.go2
-rw-r--r--pkg/gui/tasks_adapter.go20
-rw-r--r--pkg/gui/view_helpers.go4
8 files changed, 52 insertions, 31 deletions
diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go
index 2500fdf97..cb3355fc3 100644
--- a/pkg/gui/files_panel.go
+++ b/pkg/gui/files_panel.go
@@ -398,25 +398,6 @@ func (gui *Gui) refreshStateFiles() error {
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 {
// if we have no upstream branch we need to set that first
currentBranch := gui.currentBranch()
diff --git a/pkg/gui/layout.go b/pkg/gui/layout.go
index f5385e934..09e5f2c89 100644
--- a/pkg/gui/layout.go
+++ b/pkg/gui/layout.go
@@ -398,7 +398,7 @@ func (gui *Gui) layout(g *gocui.Gui) error {
searchPrefixView.BgColor = gocui.ColorDefault
searchPrefixView.FgColor = gocui.ColorGreen
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 {
@@ -440,7 +440,7 @@ func (gui *Gui) layout(g *gocui.Gui) error {
}
}
if gui.State.OldInformation != information {
- gui.setViewContent(g, informationView, information)
+ gui.setViewContent(informationView, information)
gui.State.OldInformation = information
}
diff --git a/pkg/gui/line_by_line_panel.go b/pkg/gui/line_by_line_panel.go
index 0b5171cb1..edc1f4a57 100644
--- a/pkg/gui/line_by_line_panel.go
+++ b/pkg/gui/line_by_line_panel.go
@@ -88,7 +88,7 @@ func (gui *Gui) refreshLineByLinePanel(diff string, secondaryDiff string, second
}
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
})
@@ -242,7 +242,7 @@ func (gui *Gui) refreshMainView() error {
mainView.Wrap = false
gui.g.Update(func(*gocui.Gui) error {
- gui.setViewContent(gui.g, gui.getMainView(), colorDiff)
+ gui.setViewContent(gui.getMainView(), colorDiff)
return nil
})
diff --git a/pkg/gui/merge_panel.go b/pkg/gui/merge_panel.go
index 7d2e8fc52..a2346db6e 100644
--- a/pkg/gui/merge_panel.go
+++ b/pkg/gui/merge_panel.go
@@ -222,19 +222,39 @@ func (gui *Gui) refreshMergePanel() error {
return err
}
- mainView := gui.getMainView()
- mainView.Wrap = false
- if err := gui.newStringTask("main", content); err != nil {
+ if err := gui.scrollToConflict(gui.g); err != nil {
return err
}
- if err := gui.scrollToConflict(gui.g); err != nil {
+ mainView := gui.getMainView()
+ mainView.Wrap = false
+
+ if err := gui.newStringTaskWithoutScroll("main", content); err != nil {
return err
}
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 {
panelState := gui.State.Panels.Merging
if len(panelState.Conflicts) == 0 {
diff --git a/pkg/gui/patch_building_panel.go b/pkg/gui/patch_building_panel.go
index 3e32386ec..def631d47 100644
--- a/pkg/gui/patch_building_panel.go
+++ b/pkg/gui/patch_building_panel.go
@@ -94,7 +94,7 @@ func (gui *Gui) refreshSecondaryPatchPanel() error {
secondaryView.Wrap = false
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
})
} else {
diff --git a/pkg/gui/status_panel.go b/pkg/gui/status_panel.go
index 3b5c6dd05..26f3b6d3a 100644
--- a/pkg/gui/status_panel.go
+++ b/pkg/gui/status_panel.go
@@ -42,7 +42,7 @@ func (gui *Gui) refreshStatus() {
status += fmt.Sprintf("%s → %s ", repoName, name)
gui.g.Update(func(*gocui.Gui) error {
- gui.setViewContent(gui.g, gui.getStatusView(), status)
+ gui.setViewContent(gui.getStatusView(), status)
return nil
})
}
diff --git a/pkg/gui/tasks_adapter.go b/pkg/gui/tasks_adapter.go
index f966f2eee..aa9f26f14 100644
--- a/pkg/gui/tasks_adapter.go
+++ b/pkg/gui/tasks_adapter.go
@@ -70,6 +70,26 @@ func (gui *Gui) newStringTask(viewName string, str string) error {
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 {
manager, ok := gui.viewBufferManagerMap[view.Name()]
if !ok {
diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go
index c647d1819..429ab46b5 100644
--- a/pkg/gui/view_helpers.go
+++ b/pkg/gui/view_helpers.go
@@ -340,7 +340,7 @@ func (gui *Gui) cleanString(s string) string {
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()
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 {
return err
}
- gui.setViewContent(gui.g, v, s)
+ gui.setViewContent(v, s)
return nil
})
}