1
1
package write
2
2
3
3
import (
4
+ "bufio"
4
5
"fmt"
5
6
"io"
6
7
@@ -21,7 +22,7 @@ type Pair interface {
21
22
// Unified returns the number of bytes written and the first error (if any) encountered.
22
23
// Before writing, edit scripts usually have their context reduced,
23
24
// such as by a call to ctxt.Size.
24
- func Unified (e edit.Script , w io.Writer , ab Pair , opts ... Option ) ( int , error ) {
25
+ func Unified (e edit.Script , w io.Writer , ab Pair , opts ... Option ) error {
25
26
// read opts
26
27
nameA := "a"
27
28
nameB := "b"
@@ -39,19 +40,17 @@ func Unified(e edit.Script, w io.Writer, ab Pair, opts ...Option) (int, error) {
39
40
}
40
41
}
41
42
42
- ew := newErrWriter (w )
43
- // TODO: Wrap w in a bufio.Writer? And then use w.WriteByte below instead of w.Write.
44
- // Maybe bufio.Writer is enough and we should entirely ditch newErrWriter.
43
+ bw := bufio .NewWriter (w )
45
44
46
45
needsColorReset := false
47
46
48
47
// per-file header
49
48
if color {
50
- ew .WriteString (ansiBold )
49
+ bw .WriteString (ansiBold )
51
50
needsColorReset = true
52
51
}
53
- fmt .Fprintf (ew , "--- %s\n " , nameA )
54
- fmt .Fprintf (ew , "+++ %s\n " , nameB )
52
+ fmt .Fprintf (bw , "--- %s\n " , nameA )
53
+ fmt .Fprintf (bw , "+++ %s\n " , nameB )
55
54
56
55
for i := 0 ; i < len (e .Ranges ); {
57
56
// Peek into the future to learn the line ranges for this chunk of output.
@@ -92,48 +91,48 @@ func Unified(e edit.Script, w io.Writer, ab Pair, opts ...Option) (int, error) {
92
91
// and we can have EditScript methods to populate it somehow?
93
92
if color {
94
93
if needsColorReset {
95
- ew .WriteString (ansiReset )
94
+ bw .WriteString (ansiReset )
96
95
}
97
- ew .WriteString (ansiFgBlue )
96
+ bw .WriteString (ansiFgBlue )
98
97
needsColorReset = true
99
98
}
100
- fmt .Fprintf (ew , "@@ -%s +%s @@\n " , ar , br )
99
+ fmt .Fprintf (bw , "@@ -%s +%s @@\n " , ar , br )
101
100
102
101
// Print prefixed lines.
103
102
for k := i ; k <= j ; k ++ {
104
103
seg := e .Ranges [k ]
105
104
switch seg .Op () {
106
105
case edit .Eq :
107
106
if needsColorReset {
108
- ew .WriteString (ansiReset )
107
+ bw .WriteString (ansiReset )
109
108
}
110
109
for m := seg .LowA ; m < seg .HighA ; m ++ {
111
110
// " a[m]\n"
112
- ew .WriteByte (' ' )
113
- ab .WriteATo (ew , m )
114
- ew .WriteByte ('\n' )
111
+ bw .WriteByte (' ' )
112
+ ab .WriteATo (bw , m )
113
+ bw .WriteByte ('\n' )
115
114
}
116
115
case edit .Del :
117
116
if color {
118
- ew .WriteString (ansiFgRed )
117
+ bw .WriteString (ansiFgRed )
119
118
needsColorReset = true
120
119
}
121
120
for m := seg .LowA ; m < seg .HighA ; m ++ {
122
121
// "-a[m]\n"
123
- ew .WriteByte ('-' )
124
- ab .WriteATo (ew , m )
125
- ew .WriteByte ('\n' )
122
+ bw .WriteByte ('-' )
123
+ ab .WriteATo (bw , m )
124
+ bw .WriteByte ('\n' )
126
125
}
127
126
case edit .Ins :
128
127
if color {
129
- ew .WriteString (ansiFgGreen )
128
+ bw .WriteString (ansiFgGreen )
130
129
needsColorReset = true
131
130
}
132
131
for m := seg .LowB ; m < seg .HighB ; m ++ {
133
132
// "+b[m]\n"
134
- ew .WriteByte ('+' )
135
- ab .WriteBTo (ew , m )
136
- ew .WriteByte ('\n' )
133
+ bw .WriteByte ('+' )
134
+ ab .WriteBTo (bw , m )
135
+ bw .WriteByte ('\n' )
137
136
}
138
137
}
139
138
}
@@ -147,7 +146,7 @@ func Unified(e edit.Script, w io.Writer, ab Pair, opts ...Option) (int, error) {
147
146
// Always finish the output with no color, to prevent "leaking" the
148
147
// color into any output that follows a diff.
149
148
if needsColorReset {
150
- ew .WriteString (ansiReset )
149
+ bw .WriteString (ansiReset )
151
150
}
152
151
153
152
// TODO:
@@ -156,7 +155,7 @@ func Unified(e edit.Script, w io.Writer, ab Pair, opts ...Option) (int, error) {
156
155
// and the following line in the chunk has the literal text (starting in the first column):
157
156
// '\ No newline at end of file'
158
157
159
- return ew . wrote , ew . Error ()
158
+ return bw . Flush ()
160
159
}
161
160
162
161
type lineRange struct {
0 commit comments