Skip to content

Commit 1683c76

Browse files
committed
Add WriteUnifiedMerge
This commit creates some functions to allow us to write out a file as though the diff is for a merge conflict in Git.
1 parent 493f2c7 commit 1683c76

1 file changed

Lines changed: 81 additions & 0 deletions

File tree

difflib/difflib.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,87 @@ func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error {
646646
return nil
647647
}
648648

649+
func WriteUnifiedMerge(writer io.Writer, diff UnifiedDiff) error {
650+
buf := bufio.NewWriter(writer)
651+
defer buf.Flush()
652+
653+
wf := func(format string, args ...interface{}) error {
654+
_, err := buf.WriteString(fmt.Sprintf(format, args...))
655+
return err
656+
}
657+
ws := func(s string) error {
658+
_, err := buf.WriteString(s)
659+
return err
660+
}
661+
662+
if len(diff.Eol) == 0 {
663+
diff.Eol = "\n"
664+
}
665+
666+
m := NewMatcher(diff.A, diff.B)
667+
var lastIndex int
668+
for _, g := range m.GetGroupedOpCodes(diff.Context) {
669+
for _, c := range g {
670+
i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2
671+
672+
for _, line := range diff.A[lastIndex:i1] {
673+
if err := ws(line); err != nil {
674+
return err
675+
}
676+
}
677+
678+
lastIndex = i2
679+
680+
if c.Tag == 'e' {
681+
for _, line := range diff.A[i1:i2] {
682+
if err := ws(line); err != nil {
683+
return err
684+
}
685+
}
686+
continue
687+
}
688+
if c.Tag == 'r' || c.Tag == 'd' {
689+
if err := wf("<<<<<<<<< %s\n", diff.FromFile); err != nil {
690+
return err
691+
}
692+
for _, line := range diff.A[i1:i2] {
693+
if err := ws(line); err != nil {
694+
return err
695+
}
696+
}
697+
}
698+
if c.Tag == 'r' || c.Tag == 'i' {
699+
if err := ws("=========\n"); err != nil {
700+
return err
701+
}
702+
for _, line := range diff.B[j1:j2] {
703+
if err := ws(line); err != nil {
704+
return err
705+
}
706+
}
707+
if err := wf(">>>>>>>>> %s\n", diff.ToFile); err != nil {
708+
return err
709+
}
710+
}
711+
}
712+
}
713+
714+
for _, line := range diff.A[lastIndex:] {
715+
if err := ws(line); err != nil {
716+
return err
717+
}
718+
}
719+
720+
return nil
721+
}
722+
723+
// Like WriteUnifiedMerge but returns the merge a string.
724+
func GetUnifiedMergeString(diff UnifiedDiff) (string, error) {
725+
w := &bytes.Buffer{}
726+
err := WriteUnifiedMerge(w, diff)
727+
return string(w.Bytes()), err
728+
}
729+
649730
// Like WriteUnifiedDiff but returns the diff a string.
650731
func GetUnifiedDiffString(diff UnifiedDiff) (string, error) {
651732
w := &bytes.Buffer{}

0 commit comments

Comments
 (0)