diff --git a/pkg/commands/models/file_change_node.go b/pkg/commands/models/file_change_node.go index 805a74439..c70db2dfa 100644 --- a/pkg/commands/models/file_change_node.go +++ b/pkg/commands/models/file_change_node.go @@ -16,26 +16,30 @@ type FileChangeNode struct { } func (s *FileChangeNode) GetHasUnstagedChanges() bool { - if s.IsLeaf() { - return s.File.HasUnstagedChanges - } - - for _, child := range s.Children { - if child.GetHasUnstagedChanges() { - return true - } - } - - return false + return s.AnyFile(func(file *File) bool { return file.HasUnstagedChanges }) } func (s *FileChangeNode) GetHasStagedChanges() bool { - if s.IsLeaf() { - return s.File.HasStagedChanges + return s.AnyFile(func(file *File) bool { return file.HasStagedChanges }) +} + +func (s *FileChangeNode) GetHasInlineMergeConflicts() bool { + return s.AnyFile(func(file *File) bool { return file.HasInlineMergeConflicts }) +} + +func (s *FileChangeNode) AnyFile(test func(file *File) bool) bool { + return s.Any(func(node *FileChangeNode) bool { + return node.IsLeaf() && test(node.File) + }) +} + +func (s *FileChangeNode) Any(test func(node *FileChangeNode) bool) bool { + if test(s) { + return true } for _, child := range s.Children { - if child.GetHasStagedChanges() { + if test(child) { return true } } diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 26c3eee49..f1fbc4325 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -225,8 +225,6 @@ func (gui *Gui) handleFilePress() error { return nil } - // need to stage or unstage depending on situation. If we have a merge conflict we can't do anything - if node.IsLeaf() { file := node.File @@ -244,6 +242,12 @@ func (gui *Gui) handleFilePress() error { } } } else { + // if any files within have inline merge conflicts we can't stage or unstage, + // or it'll end up with those >>>>>> lines actually staged + if node.GetHasInlineMergeConflicts() { + return gui.createErrorPanel(gui.Tr.ErrStageDirWithInlineMergeConflicts) + } + if node.GetHasUnstagedChanges() { if err := gui.GitCommand.StageFile(node.Path); err != nil { return gui.surfaceError(err) diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 6d7601144..f2211f8b1 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -437,6 +437,7 @@ type TranslationSet struct { CommitMessageCopiedToClipboard string LcCopiedToClipboard string ErrCannotEditDirectory string + ErrStageDirWithInlineMergeConflicts string } const englishReleaseNotes = `## lazygit 0.26 Release Notes @@ -997,5 +998,6 @@ func englishTranslationSet() TranslationSet { CommitMessageCopiedToClipboard: "Commit message copied to clipboard", LcCopiedToClipboard: "copied to clipboard", ErrCannotEditDirectory: "Cannot edit directory: you can only edit individual files", + ErrStageDirWithInlineMergeConflicts: "Cannot stage/unstage directory containing files with inline merge conflicts. Please fix up the merge conflicts first", } }