mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-23 12:18:51 +02:00
add mutex to prevent crashes with merge conflicts
This commit is contained in:
parent
efe43077bc
commit
cc9293b386
@ -286,7 +286,7 @@ func (gui *Gui) contextTree() ContextTree {
|
|||||||
},
|
},
|
||||||
Merging: SimpleContextNode{
|
Merging: SimpleContextNode{
|
||||||
Context: BasicContext{
|
Context: BasicContext{
|
||||||
OnFocus: gui.refreshMergePanel,
|
OnFocus: gui.refreshMergePanelWithLock,
|
||||||
Kind: MAIN_CONTEXT,
|
Kind: MAIN_CONTEXT,
|
||||||
ViewName: "main",
|
ViewName: "main",
|
||||||
Key: MAIN_MERGING_CONTEXT_KEY,
|
Key: MAIN_MERGING_CONTEXT_KEY,
|
||||||
|
@ -73,7 +73,7 @@ func (gui *Gui) selectFile(alreadySelected bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if node.File != nil && node.File.HasInlineMergeConflicts {
|
if node.File != nil && node.File.HasInlineMergeConflicts {
|
||||||
return gui.refreshMergePanel()
|
return gui.refreshMergePanelWithLock()
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdStr := gui.GitCommand.WorktreeFileDiffCmdStr(node, false, !node.GetHasUnstagedChanges() && node.GetHasStagedChanges())
|
cmdStr := gui.GitCommand.WorktreeFileDiffCmdStr(node, false, !node.GetHasUnstagedChanges() && node.GetHasStagedChanges())
|
||||||
|
@ -119,6 +119,7 @@ type mergingPanelState struct {
|
|||||||
ConflictIndex int
|
ConflictIndex int
|
||||||
ConflictTop bool
|
ConflictTop bool
|
||||||
Conflicts []commands.Conflict
|
Conflicts []commands.Conflict
|
||||||
|
ConflictsMutex sync.Mutex
|
||||||
EditHistory *stack.Stack
|
EditHistory *stack.Stack
|
||||||
|
|
||||||
// UserScrolling tells us if the user has started scrolling through the file themselves
|
// UserScrolling tells us if the user has started scrolling through the file themselves
|
||||||
@ -371,6 +372,7 @@ func (gui *Gui) resetState() {
|
|||||||
ConflictTop: true,
|
ConflictTop: true,
|
||||||
Conflicts: []commands.Conflict{},
|
Conflicts: []commands.Conflict{},
|
||||||
EditHistory: stack.New(),
|
EditHistory: stack.New(),
|
||||||
|
ConflictsMutex: sync.Mutex{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
SideView: nil,
|
SideView: nil,
|
||||||
|
@ -79,18 +79,27 @@ func (gui *Gui) takeOverScrolling() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleSelectTop(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleSelectTop(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
gui.State.Panels.Merging.ConflictsMutex.Lock()
|
||||||
|
defer gui.State.Panels.Merging.ConflictsMutex.Unlock()
|
||||||
|
|
||||||
gui.takeOverScrolling()
|
gui.takeOverScrolling()
|
||||||
gui.State.Panels.Merging.ConflictTop = true
|
gui.State.Panels.Merging.ConflictTop = true
|
||||||
return gui.refreshMergePanel()
|
return gui.refreshMergePanel()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleSelectBottom(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleSelectBottom(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
gui.State.Panels.Merging.ConflictsMutex.Lock()
|
||||||
|
defer gui.State.Panels.Merging.ConflictsMutex.Unlock()
|
||||||
|
|
||||||
gui.takeOverScrolling()
|
gui.takeOverScrolling()
|
||||||
gui.State.Panels.Merging.ConflictTop = false
|
gui.State.Panels.Merging.ConflictTop = false
|
||||||
return gui.refreshMergePanel()
|
return gui.refreshMergePanel()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleSelectNextConflict(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleSelectNextConflict(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
gui.State.Panels.Merging.ConflictsMutex.Lock()
|
||||||
|
defer gui.State.Panels.Merging.ConflictsMutex.Unlock()
|
||||||
|
|
||||||
gui.takeOverScrolling()
|
gui.takeOverScrolling()
|
||||||
if gui.State.Panels.Merging.ConflictIndex >= len(gui.State.Panels.Merging.Conflicts)-1 {
|
if gui.State.Panels.Merging.ConflictIndex >= len(gui.State.Panels.Merging.Conflicts)-1 {
|
||||||
return nil
|
return nil
|
||||||
@ -100,6 +109,9 @@ func (gui *Gui) handleSelectNextConflict(g *gocui.Gui, v *gocui.View) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handleSelectPrevConflict(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handleSelectPrevConflict(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
gui.State.Panels.Merging.ConflictsMutex.Lock()
|
||||||
|
defer gui.State.Panels.Merging.ConflictsMutex.Unlock()
|
||||||
|
|
||||||
gui.takeOverScrolling()
|
gui.takeOverScrolling()
|
||||||
if gui.State.Panels.Merging.ConflictIndex <= 0 {
|
if gui.State.Panels.Merging.ConflictIndex <= 0 {
|
||||||
return nil
|
return nil
|
||||||
@ -172,6 +184,9 @@ func (gui *Gui) handlePopFileSnapshot(g *gocui.Gui, v *gocui.View) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handlePickHunk(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handlePickHunk(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
gui.State.Panels.Merging.ConflictsMutex.Lock()
|
||||||
|
defer gui.State.Panels.Merging.ConflictsMutex.Unlock()
|
||||||
|
|
||||||
gui.takeOverScrolling()
|
gui.takeOverScrolling()
|
||||||
|
|
||||||
conflict := gui.State.Panels.Merging.Conflicts[gui.State.Panels.Merging.ConflictIndex]
|
conflict := gui.State.Panels.Merging.Conflicts[gui.State.Panels.Merging.ConflictIndex]
|
||||||
@ -198,6 +213,9 @@ func (gui *Gui) handlePickHunk(g *gocui.Gui, v *gocui.View) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gui *Gui) handlePickBothHunks(g *gocui.Gui, v *gocui.View) error {
|
func (gui *Gui) handlePickBothHunks(g *gocui.Gui, v *gocui.View) error {
|
||||||
|
gui.State.Panels.Merging.ConflictsMutex.Lock()
|
||||||
|
defer gui.State.Panels.Merging.ConflictsMutex.Unlock()
|
||||||
|
|
||||||
gui.takeOverScrolling()
|
gui.takeOverScrolling()
|
||||||
|
|
||||||
conflict := gui.State.Panels.Merging.Conflicts[gui.State.Panels.Merging.ConflictIndex]
|
conflict := gui.State.Panels.Merging.Conflicts[gui.State.Panels.Merging.ConflictIndex]
|
||||||
@ -211,6 +229,13 @@ func (gui *Gui) handlePickBothHunks(g *gocui.Gui, v *gocui.View) error {
|
|||||||
return gui.refreshMergePanel()
|
return gui.refreshMergePanel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gui *Gui) refreshMergePanelWithLock() error {
|
||||||
|
gui.State.Panels.Merging.ConflictsMutex.Lock()
|
||||||
|
defer gui.State.Panels.Merging.ConflictsMutex.Unlock()
|
||||||
|
|
||||||
|
return gui.refreshMergePanel()
|
||||||
|
}
|
||||||
|
|
||||||
func (gui *Gui) refreshMergePanel() error {
|
func (gui *Gui) refreshMergePanel() error {
|
||||||
panelState := gui.State.Panels.Merging
|
panelState := gui.State.Panels.Merging
|
||||||
cat, err := gui.catSelectedFile()
|
cat, err := gui.catSelectedFile()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user