diff --git a/pkg/gui/mergeconflicts/state.go b/pkg/gui/mergeconflicts/state.go index 17ac02a0b..383d71a36 100644 --- a/pkg/gui/mergeconflicts/state.go +++ b/pkg/gui/mergeconflicts/state.go @@ -104,6 +104,10 @@ func findConflicts(content string) []*mergeConflict { case "=======": newConflict.middle = i default: + // Sometimes these lines look like "<<<<<<< HEAD:foo/bar/baz.go" so handle that case as well. + if strings.HasPrefix(trimmedLine, "<<<<<<< HEAD:") { + newConflict = &mergeConflict{start: i} + } if strings.HasPrefix(trimmedLine, ">>>>>>> ") { newConflict.end = i conflicts = append(conflicts, newConflict) diff --git a/pkg/gui/mergeconflicts/state_test.go b/pkg/gui/mergeconflicts/state_test.go new file mode 100644 index 000000000..df2e077b4 --- /dev/null +++ b/pkg/gui/mergeconflicts/state_test.go @@ -0,0 +1,90 @@ +package mergeconflicts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestFindConflicts(t *testing.T) { + type scenario struct { + name string + content string + expected []*mergeConflict + } + + scenarios := []scenario{ + { + name: "empty", + content: "", + expected: []*mergeConflict{}, + }, + { + name: "various conflicts", + content: `++<<<<<<< HEAD +foo +++======= +bar +++>>>>>>> branch + +<<<<<<< HEAD: foo/bar/baz.go +foo +bar +======= +baz +>>>>>>> branch + +++<<<<<<< MERGE_HEAD +foo +++======= +bar +++>>>>>>> branch + +++<<<<<<< Updated upstream +foo +++======= +bar +++>>>>>>> branch + +++<<<<<<< ours +foo +++======= +bar +++>>>>>>> branch +`, + expected: []*mergeConflict{ + { + start: 0, + middle: 2, + end: 4, + }, + { + start: 6, + middle: 9, + end: 11, + }, + { + start: 13, + middle: 15, + end: 17, + }, + { + start: 19, + middle: 21, + end: 23, + }, + { + start: 25, + middle: 27, + end: 29, + }, + }, + }, + } + + for _, s := range scenarios { + t.Run(s.name, func(t *testing.T) { + assert.EqualValues(t, s.expected, findConflicts(s.content)) + }) + } +}