summaryrefslogtreecommitdiffstats
path: root/pkg/gui/staging_panel.go
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2020-10-08 08:01:04 +1100
committerJesse Duffield <jessedduffield@gmail.com>2020-10-10 00:23:01 +1100
commit4c9ec88be57ed75c198d19020374bae0365b6e00 (patch)
tree8b69a8fd7ab64009aa028c61bd9a8a109a721efd /pkg/gui/staging_panel.go
parent9011271a014025c514adf72b1d1ee69fbc7f3373 (diff)
fix mutex deadlock
Diffstat (limited to 'pkg/gui/staging_panel.go')
-rw-r--r--pkg/gui/staging_panel.go113
1 files changed, 57 insertions, 56 deletions
diff --git a/pkg/gui/staging_panel.go b/pkg/gui/staging_panel.go
index 68c7c8391..66b3006fc 100644
--- a/pkg/gui/staging_panel.go
+++ b/pkg/gui/staging_panel.go
@@ -7,17 +7,11 @@ import (
"github.com/jesseduffield/lazygit/pkg/commands/patch"
)
-func (gui *Gui) refreshStagingPanel(forceSecondaryFocused bool, selectedLineIdx int) error {
+func (gui *Gui) refreshStagingPanel(forceSecondaryFocused bool, selectedLineIdx int, state *lBlPanelState) error {
gui.splitMainPanel(true)
- state := gui.State.Panels.LineByLine
-
file := gui.getSelectedFile()
- if file == nil {
- return gui.handleStagingEscape()
- }
-
- if !file.HasUnstagedChanges && !file.HasStagedChanges {
+ if file == nil || (!file.HasUnstagedChanges && !file.HasStagedChanges) {
return gui.handleStagingEscape()
}
@@ -56,7 +50,7 @@ func (gui *Gui) refreshStagingPanel(forceSecondaryFocused bool, selectedLineIdx
diff, secondaryDiff = secondaryDiff, diff
}
- empty, err := gui.refreshLineByLinePanel(diff, secondaryDiff, secondaryFocused, selectedLineIdx)
+ empty, err := gui.refreshLineByLinePanel(diff, secondaryDiff, secondaryFocused, selectedLineIdx, state)
if err != nil {
return err
}
@@ -69,17 +63,24 @@ func (gui *Gui) refreshStagingPanel(forceSecondaryFocused bool, selectedLineIdx
}
func (gui *Gui) handleTogglePanelClick(g *gocui.Gui, v *gocui.View) error {
- return gui.withLBLActiveCheck(func(state *lineByLinePanelState) error {
+ return gui.withLBLActiveCheck(func(state *lBlPanelState) error {
state.SecondaryFocused = !state.SecondaryFocused
- return gui.refreshStagingPanel(false, v.SelectedLineIdx())
+ return gui.refreshStagingPanel(false, v.SelectedLineIdx(), state)
})
}
-func (gui *Gui) handleTogglePanel(g *gocui.Gui, v *gocui.View) error {
- return gui.withLBLActiveCheck(func(state *lineByLinePanelState) error {
+func (gui *Gui) handleRefreshStagingPanel(forceSecondaryFocused bool, selectedLineIdx int) error {
+ gui.Mutexes.LineByLinePanelMutex.Lock()
+ defer gui.Mutexes.LineByLinePanelMutex.Unlock()
+
+ return gui.refreshStagingPanel(forceSecondaryFocused, selectedLineIdx, gui.State.Panels.LineByLine)
+}
+
+func (gui *Gui) handleTogglePanel() error {
+ return gui.withLBLActiveCheck(func(state *lBlPanelState) error {
state.SecondaryFocused = !state.SecondaryFocused
- return gui.refreshStagingPanel(false, -1)
+ return gui.refreshStagingPanel(false, -1, state)
})
}
@@ -89,17 +90,17 @@ func (gui *Gui) handleStagingEscape() error {
return gui.switchContext(gui.Contexts.Files.Context)
}
-func (gui *Gui) handleToggleStagedSelection(g *gocui.Gui, v *gocui.View) error {
- return gui.withLBLActiveCheck(func(state *lineByLinePanelState) error {
- return gui.applySelection(state.SecondaryFocused)
+func (gui *Gui) handleToggleStagedSelection() error {
+ return gui.withLBLActiveCheck(func(state *lBlPanelState) error {
+ return gui.applySelection(state.SecondaryFocused, state)
})
}
-func (gui *Gui) handleResetSelection(g *gocui.Gui, v *gocui.View) error {
- return gui.withLBLActiveCheck(func(state *lineByLinePanelState) error {
+func (gui *Gui) handleResetSelection() error {
+ return gui.withLBLActiveCheck(func(state *lBlPanelState) error {
if state.SecondaryFocused {
// for backwards compatibility
- return gui.applySelection(true)
+ return gui.applySelection(true, state)
}
if !gui.Config.GetUserConfig().Gui.SkipUnstageLineWarning {
@@ -108,56 +109,56 @@ func (gui *Gui) handleResetSelection(g *gocui.Gui, v *gocui.View) error {
prompt: gui.Tr.UnstageLinesPrompt,
handlersManageFocus: true,
handleConfirm: func() error {
- if err := gui.switchContext(gui.Contexts.Staging.Context); err != nil {
- return err
- }
+ return gui.withLBLActiveCheck(func(state *lBlPanelState) error {
+ if err := gui.switchContext(gui.Contexts.Staging.Context); err != nil {
+ return err
+ }
- return gui.applySelection(true)
+ return gui.applySelection(true, state)
+ })
},
handleClose: func() error {
return gui.switchContext(gui.Contexts.Staging.Context)
},
})
} else {
- return gui.applySelection(true)
+ return gui.applySelection(true, state)
}
})
}
-func (gui *Gui) applySelection(reverse bool) error {
- return gui.withLBLActiveCheck(func(state *lineByLinePanelState) error {
- file := gui.getSelectedFile()
- if file == nil {
- return nil
- }
+func (gui *Gui) applySelection(reverse bool, state *lBlPanelState) error {
+ file := gui.getSelectedFile()
+ if file == nil {
+ return nil
+ }
- patch := patch.ModifiedPatchForRange(gui.Log, file.Name, state.Diff, state.FirstLineIdx, state.LastLineIdx, reverse, false)
+ patch := patch.ModifiedPatchForRange(gui.Log, file.Name, state.Diff, state.FirstLineIdx, state.LastLineIdx, reverse, false)
- if patch == "" {
- return nil
- }
+ if patch == "" {
+ return nil
+ }
- // apply the patch then refresh this panel
- // create a new temp file with the patch, then call git apply with that patch
- applyFlags := []string{}
- if !reverse || state.SecondaryFocused {
- applyFlags = append(applyFlags, "cached")
- }
- err := gui.GitCommand.ApplyPatch(patch, applyFlags...)
- if err != nil {
- return gui.surfaceError(err)
- }
+ // apply the patch then refresh this panel
+ // create a new temp file with the patch, then call git apply with that patch
+ applyFlags := []string{}
+ if !reverse || state.SecondaryFocused {
+ applyFlags = append(applyFlags, "cached")
+ }
+ err := gui.GitCommand.ApplyPatch(patch, applyFlags...)
+ if err != nil {
+ return gui.surfaceError(err)
+ }
- if state.SelectMode == RANGE {
- state.SelectMode = LINE
- }
+ if state.SelectMode == RANGE {
+ state.SelectMode = LINE
+ }
- if err := gui.refreshSidePanels(refreshOptions{scope: []int{FILES}}); err != nil {
- return err
- }
- if err := gui.refreshStagingPanel(false, -1); err != nil {
- return err
- }
- return nil
- })
+ if err := gui.refreshSidePanels(refreshOptions{scope: []int{FILES}}); err != nil {
+ return err
+ }
+ if err := gui.refreshStagingPanel(false, -1, state); err != nil {
+ return err
+ }
+ return nil
}