Skip to content

Commit a78bf6d

Browse files
committed
refactor: removes io copying to stdout/stderr, with sync writer
1 parent 51e6d2e commit a78bf6d

File tree

1 file changed

+36
-46
lines changed

1 file changed

+36
-46
lines changed

runner/writer.go

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,49 @@
11
package runner
22

33
import (
4-
"bufio"
4+
"bytes"
55
"errors"
66
"fmt"
77
"io"
88
"sync"
99
)
1010

11-
type LineWriter struct {
12-
w io.Writer
11+
const (
12+
StyleReset = "\033[0m"
13+
StyleBold = "\033[1m"
14+
StyleFgGreen = "\033[32m"
15+
)
16+
17+
type PrefixedWriter struct {
18+
w io.Writer
19+
prefix []byte
20+
buf *bytes.Buffer
1321
}
1422

15-
// Write implements io.Writer.
16-
func (lw *LineWriter) Write(p []byte) (n int, err error) {
17-
return lw.w.Write(p)
23+
func (pw *PrefixedWriter) Write(p []byte) (int, error) {
24+
defer pw.buf.Reset()
25+
n, err := pw.buf.Write(p)
26+
if err != nil {
27+
return n, err
28+
}
29+
30+
for {
31+
line, err := pw.buf.ReadBytes('\n')
32+
if errors.Is(err, io.EOF) {
33+
pw.buf.Reset()
34+
pw.buf.Write(line)
35+
break
36+
}
37+
38+
if _, err := pw.w.Write(append(pw.prefix, line...)); err != nil {
39+
return n, err
40+
}
41+
}
42+
return n, nil
1843
}
1944

45+
var _ io.Writer = (*PrefixedWriter)(nil)
46+
2047
type LogWriter struct {
2148
w io.Writer
2249
mu sync.Mutex
@@ -33,47 +60,10 @@ func (s *LogWriter) Write(p []byte) (n int, err error) {
3360
var _ io.Writer = (*LogWriter)(nil)
3461

3562
func (s *LogWriter) WithPrefix(prefix string) io.Writer {
36-
pr, pw := io.Pipe()
37-
s.wg.Add(1)
38-
go func() {
39-
defer s.wg.Done()
40-
copyStreamLineByLine(prefix, s.w, pr)
41-
}()
42-
return &LineWriter{w: pw}
43-
}
44-
45-
func (s *LogWriter) Wait() {
46-
s.wg.Wait()
47-
}
48-
49-
const (
50-
Reset = "\033[0m"
51-
Bold = "\033[1m"
52-
Green = "\033[32m"
53-
)
54-
55-
func copyStreamLineByLine(prefix string, dest io.Writer, src io.Reader) {
56-
hasPrefix := prefix != ""
57-
if hasPrefix && hasANSISupport() {
58-
prefix = fmt.Sprintf("%s[%s]%s ", Green, prefix, Reset)
63+
if prefix != "" && hasANSISupport() {
64+
prefix = fmt.Sprintf("%s[%s]%s ", StyleFgGreen, prefix, StyleReset)
5965
// prefix = fmt.Sprintf("%s%s |%s ", Green, prefix, Reset)
6066
}
61-
r := bufio.NewReader(src)
62-
for {
63-
b, err := r.ReadBytes('\n')
64-
if err != nil {
65-
if errors.Is(err, io.EOF) {
66-
if hasPrefix {
67-
dest.Write([]byte(prefix))
68-
}
69-
dest.Write(b)
70-
return
71-
}
72-
}
7367

74-
if hasPrefix {
75-
dest.Write([]byte(prefix))
76-
}
77-
dest.Write(b)
78-
}
68+
return &PrefixedWriter{s.w, []byte(prefix), bytes.NewBuffer(nil)}
7969
}

0 commit comments

Comments
 (0)