summaryrefslogtreecommitdiffstats
path: root/pkg/gui/controllers/helpers
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2022-08-06 18:50:52 +1000
committerJesse Duffield <jessedduffield@gmail.com>2022-08-07 11:16:03 +1000
commit7410acd1aaa97f678295a328264360802346b33a (patch)
tree51dc6b5dfc8c0b67711ff644a6bc32480e6eaea8 /pkg/gui/controllers/helpers
parent445a625b56a79be6cee7ec1ee35fe9f4fcc2daad (diff)
move merge conflicts code into controller
Diffstat (limited to 'pkg/gui/controllers/helpers')
-rw-r--r--pkg/gui/controllers/helpers/helpers.go2
-rw-r--r--pkg/gui/controllers/helpers/merge_and_rebase_helper.go2
-rw-r--r--pkg/gui/controllers/helpers/merge_conflicts_helper.go115
3 files changed, 117 insertions, 2 deletions
diff --git a/pkg/gui/controllers/helpers/helpers.go b/pkg/gui/controllers/helpers/helpers.go
index 61fdedf46..b8c279fac 100644
--- a/pkg/gui/controllers/helpers/helpers.go
+++ b/pkg/gui/controllers/helpers/helpers.go
@@ -8,6 +8,7 @@ type Helpers struct {
WorkingTree *WorkingTreeHelper
Tags *TagsHelper
MergeAndRebase *MergeAndRebaseHelper
+ MergeConflicts *MergeConflictsHelper
CherryPick *CherryPickHelper
Host *HostHelper
PatchBuilding *PatchBuildingHelper
@@ -24,6 +25,7 @@ func NewStubHelpers() *Helpers {
WorkingTree: &WorkingTreeHelper{},
Tags: &TagsHelper{},
MergeAndRebase: &MergeAndRebaseHelper{},
+ MergeConflicts: &MergeConflictsHelper{},
CherryPick: &CherryPickHelper{},
Host: &HostHelper{},
PatchBuilding: &PatchBuildingHelper{},
diff --git a/pkg/gui/controllers/helpers/merge_and_rebase_helper.go b/pkg/gui/controllers/helpers/merge_and_rebase_helper.go
index 4666f103d..21c02d6f4 100644
--- a/pkg/gui/controllers/helpers/merge_and_rebase_helper.go
+++ b/pkg/gui/controllers/helpers/merge_and_rebase_helper.go
@@ -186,8 +186,6 @@ func (self *MergeAndRebaseHelper) workingTreeStateNoun() string {
// PromptToContinueRebase asks the user if they want to continue the rebase/merge that's in progress
func (self *MergeAndRebaseHelper) PromptToContinueRebase() error {
- self.contexts.MergeConflicts.SetUserScrolling(false)
-
return self.c.Confirm(types.ConfirmOpts{
Title: "continue",
Prompt: self.c.Tr.ConflictsResolved,
diff --git a/pkg/gui/controllers/helpers/merge_conflicts_helper.go b/pkg/gui/controllers/helpers/merge_conflicts_helper.go
new file mode 100644
index 000000000..d7f7aa747
--- /dev/null
+++ b/pkg/gui/controllers/helpers/merge_conflicts_helper.go
@@ -0,0 +1,115 @@
+package helpers
+
+import (
+ "fmt"
+
+ "github.com/jesseduffield/lazygit/pkg/commands"
+ "github.com/jesseduffield/lazygit/pkg/gui/context"
+ "github.com/jesseduffield/lazygit/pkg/gui/keybindings"
+ "github.com/jesseduffield/lazygit/pkg/gui/types"
+)
+
+type MergeConflictsHelper struct {
+ c *types.HelperCommon
+ contexts *context.ContextTree
+ git *commands.GitCommand
+}
+
+func NewMergeConflictsHelper(
+ c *types.HelperCommon,
+ contexts *context.ContextTree,
+ git *commands.GitCommand,
+) *MergeConflictsHelper {
+ return &MergeConflictsHelper{
+ c: c,
+ contexts: contexts,
+ git: git,
+ }
+}
+
+func (self *MergeConflictsHelper) GetMergingOptions() map[string]string {
+ keybindingConfig := self.c.UserConfig.Keybinding
+
+ return map[string]string{
+ fmt.Sprintf("%s %s", keybindings.Label(keybindingConfig.Universal.PrevItem), keybindings.Label(keybindingConfig.Universal.NextItem)): self.c.Tr.LcSelectHunk,
+ fmt.Sprintf("%s %s", keybindings.Label(keybindingConfig.Universal.PrevBlock), keybindings.Label(keybindingConfig.Universal.NextBlock)): self.c.Tr.LcNavigateConflicts,
+ keybindings.Label(keybindingConfig.Universal.Select): self.c.Tr.LcPickHunk,
+ keybindings.Label(keybindingConfig.Main.PickBothHunks): self.c.Tr.LcPickAllHunks,
+ keybindings.Label(keybindingConfig.Universal.Undo): self.c.Tr.LcUndo,
+ }
+}
+
+func (self *MergeConflictsHelper) SetMergeState(path string) (bool, error) {
+ self.context().GetMutex().Lock()
+ defer self.context().GetMutex().Unlock()
+
+ return self.setMergeStateWithoutLock(path)
+}
+
+func (self *MergeConflictsHelper) setMergeStateWithoutLock(path string) (bool, error) {
+ content, err := self.git.File.Cat(path)
+ if err != nil {
+ return false, err
+ }
+
+ if path != self.context().GetState().GetPath() {
+ self.context().SetUserScrolling(false)
+ }
+
+ self.context().GetState().SetContent(content, path)
+
+ return !self.context().GetState().NoConflicts(), nil
+}
+
+func (self *MergeConflictsHelper) ResetMergeState() {
+ self.context().GetMutex().Lock()
+ defer self.context().GetMutex().Unlock()
+
+ self.resetMergeState()
+}
+
+func (self *MergeConflictsHelper) resetMergeState() {
+ self.context().SetUserScrolling(false)
+ self.context().GetState().Reset()
+}
+
+func (self *MergeConflictsHelper) EscapeMerge() error {
+ self.resetMergeState()
+
+ // doing this in separate UI thread so that we're not still holding the lock by the time refresh the file
+ self.c.OnUIThread(func() error {
+ return self.c.PushContext(self.contexts.Files)
+ })
+ return nil
+}
+
+func (self *MergeConflictsHelper) SetConflictsAndRender(path string, isFocused bool) (bool, error) {
+ hasConflicts, err := self.setMergeStateWithoutLock(path)
+ if err != nil {
+ return false, err
+ }
+
+ if hasConflicts {
+ return true, self.context().Render(isFocused)
+ }
+
+ return false, nil
+}
+
+func (self *MergeConflictsHelper) SwitchToMerge(path string) error {
+ if self.context().GetState().GetPath() != path {
+ hasConflicts, err := self.SetMergeState(path)
+ if err != nil {
+ return err
+ }
+ if !hasConflicts {
+ return nil
+ }
+ }
+
+ return self.c.PushContext(self.contexts.MergeConflicts)
+}
+
+func (self *MergeConflictsHelper) context() *context.MergeConflictsContext {
+ return self.contexts.MergeConflicts
+}