prefix writer: simplify, preserve trailing \n
diff --git a/gexec/prefixed_writer.go b/gexec/prefixed_writer.go index 556182b..05e695a 100644 --- a/gexec/prefixed_writer.go +++ b/gexec/prefixed_writer.go
@@ -1,7 +1,6 @@ package gexec import ( - "bytes" "io" "sync" ) @@ -14,19 +13,18 @@ gexec.Start(cmd, NewPrefixedWriter("[my-cmd] ", GinkgoWriter), NewPrefixedWriter("[my-cmd] ", GinkgoWriter)) */ type PrefixedWriter struct { - prefix []byte - writer io.Writer - lock *sync.Mutex - isNewLine bool - isFirstWrite bool + prefix []byte + writer io.Writer + lock *sync.Mutex + atStartOfLine bool } func NewPrefixedWriter(prefix string, writer io.Writer) *PrefixedWriter { return &PrefixedWriter{ - prefix: []byte(prefix), - writer: writer, - lock: &sync.Mutex{}, - isFirstWrite: true, + prefix: []byte(prefix), + writer: writer, + lock: &sync.Mutex{}, + atStartOfLine: true, } } @@ -34,46 +32,21 @@ w.lock.Lock() defer w.lock.Unlock() - newLine := []byte("\n") - segments := bytes.Split(b, newLine) + toWrite := []byte{} - if len(segments) != 0 { - toWrite := []byte{} - if w.isFirstWrite { + for _, c := range b { + if w.atStartOfLine { toWrite = append(toWrite, w.prefix...) - toWrite = append(toWrite, segments[0]...) - w.isFirstWrite = false - } else if w.isNewLine { - toWrite = append(toWrite, newLine...) - toWrite = append(toWrite, w.prefix...) - toWrite = append(toWrite, segments[0]...) - } else { - toWrite = append(toWrite, segments[0]...) } - for i := 1; i < len(segments)-1; i++ { - toWrite = append(toWrite, newLine...) - toWrite = append(toWrite, w.prefix...) - toWrite = append(toWrite, segments[i]...) - } + toWrite = append(toWrite, c) - if len(segments) > 1 { - lastSegment := segments[len(segments)-1] + w.atStartOfLine = c == '\n' + } - if len(lastSegment) == 0 { - w.isNewLine = true - } else { - toWrite = append(toWrite, newLine...) - toWrite = append(toWrite, w.prefix...) - toWrite = append(toWrite, lastSegment...) - w.isNewLine = false - } - } - - _, err := w.writer.Write(toWrite) - if err != nil { - return 0, err - } + _, err := w.writer.Write(toWrite) + if err != nil { + return 0, err } return len(b), nil
diff --git a/gexec/prefixed_writer_test.go b/gexec/prefixed_writer_test.go index 27f7487..8657d0c 100644 --- a/gexec/prefixed_writer_test.go +++ b/gexec/prefixed_writer_test.go
@@ -2,6 +2,7 @@ import ( "bytes" + . "github.com/onsi/gomega/gexec" . "github.com/onsi/ginkgo" @@ -36,6 +37,7 @@ [p]nopqrs [p]tuv [p]wxyz -[p]`)) +[p] +`)) }) })