diff --git a/internal/batches/ui/interval_writer.go b/internal/batches/ui/interval_writer.go index 8d0c70e3bc..b4c9917f4a 100644 --- a/internal/batches/ui/interval_writer.go +++ b/internal/batches/ui/interval_writer.go @@ -116,23 +116,17 @@ type prefixedWriter struct { prefix string } -func (w *prefixedWriter) Write(p []byte) (int, error) { - var prefixedLines []byte - for _, line := range bytes.Split(p, []byte("\n")) { - // When we split a byte slice on every new line, we get atleast two sub-slice. - // I'll use a string to demonstrate, if I have a string "Peppermint\n", splitting - // this string on a new line will return a slice with two items: ["Peppermint", ""]. - // Using this logic, we can then skip empty lines from being added to the log output. - // SideNote: This means when one logs an actual empty line, we'll also discard that. - if len(bytes.TrimSpace(line)) == 0 { - continue - } - prefixedLine := append([]byte(w.prefix), line...) - prefixedLine = append(prefixedLine, []byte("\n")...) +var newLineByteSlice = []byte("\n") - prefixedLines = append(prefixedLines, prefixedLine...) - } - w.writes <- prefixedLines +func (w *prefixedWriter) Write(p []byte) (int, error) { + var prefixedLine []byte + // We remove new lines appended to the log output so all of the stream can have + // only one new line separating them. This ensures the previous behavior for the log + // structure is preserved. + p = bytes.TrimRight(p, "\n") + prefixedLine = append([]byte(w.prefix), p...) + prefixedLine = append(prefixedLine, newLineByteSlice...) + w.writes <- prefixedLine <-w.writesDone return len(p), nil } diff --git a/internal/batches/ui/interval_writer_test.go b/internal/batches/ui/interval_writer_test.go index 360cd9ee62..043aaf4cc7 100644 --- a/internal/batches/ui/interval_writer_test.go +++ b/internal/batches/ui/interval_writer_test.go @@ -50,10 +50,10 @@ func TestIntervalWriter(t *testing.T) { stderrWriter.Write([]byte("4")) stdoutWriter.Write([]byte("5")) stderrWriter.Write([]byte("5")) - stdoutWriter.Write([]byte(`Hello world: 772 - `)) - stderrWriter.Write([]byte(`Hello world: 772 - `)) + stdoutWriter.Write([]byte(`Hello world: 1 +`)) + stderrWriter.Write([]byte(`Hello world: 1 +`)) select { case <-ch: @@ -70,10 +70,10 @@ func TestIntervalWriter(t *testing.T) { "stdout: 3\nstderr: 3\n" + "stdout: 4\nstderr: 4\n" + "stdout: 5\nstderr: 5\n" + - "stdout: Hello world: 772\nstderr: Hello world: 772\n" + "stdout: Hello world: 1\nstderr: Hello world: 1\n" if d != want { - t.Fatalf("wrong data in sink. want") + t.Fatalf("wrong data in sink. want=%q, have=%q", want, d) } case <-time.After(1 * time.Second): t.Fatalf("ch has NO data")