@@ -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.
650731func GetUnifiedDiffString (diff UnifiedDiff ) (string , error ) {
651732 w := & bytes.Buffer {}
0 commit comments