diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2022-08-06 18:50:52 +1000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2022-08-07 11:16:03 +1000 |
commit | 7410acd1aaa97f678295a328264360802346b33a (patch) | |
tree | 51dc6b5dfc8c0b67711ff644a6bc32480e6eaea8 /pkg/gui/controllers/helpers | |
parent | 445a625b56a79be6cee7ec1ee35fe9f4fcc2daad (diff) |
move merge conflicts code into controller
Diffstat (limited to 'pkg/gui/controllers/helpers')
-rw-r--r-- | pkg/gui/controllers/helpers/helpers.go | 2 | ||||
-rw-r--r-- | pkg/gui/controllers/helpers/merge_and_rebase_helper.go | 2 | ||||
-rw-r--r-- | pkg/gui/controllers/helpers/merge_conflicts_helper.go | 115 |
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 +} |