From 05b176489eb7baa3112cd6cd985d89e5ad0e40e6 Mon Sep 17 00:00:00 2001 From: Timothy Rule <34501912+trulede@users.noreply.github.com> Date: Sun, 9 Nov 2025 14:26:14 +0100 Subject: [PATCH] Fix grouped output and disable buffereing in tests. --- executor_test.go | 12 ++++++------ internal/output/group.go | 9 +++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/executor_test.go b/executor_test.go index 0e4d667cd0..3f79376474 100644 --- a/executor_test.go +++ b/executor_test.go @@ -144,12 +144,12 @@ func (tt *ExecutorTest) run(t *testing.T) { t.Helper() f := func(t *testing.T) { t.Helper() - var buf bytes.Buffer + var buffer SyncBuffer opts := append( tt.executorOpts, - task.WithStdout(&buf), - task.WithStderr(&buf), + task.WithStdout(&buffer), + task.WithStderr(&buffer), ) // If the test has input, create a reader for it and add it to the @@ -172,7 +172,7 @@ func (tt *ExecutorTest) run(t *testing.T) { if err := e.Setup(); tt.wantSetupError { require.Error(t, err) tt.writeFixtureErrSetup(t, g, err) - tt.writeFixtureBuffer(t, g, buf) + tt.writeFixtureBuffer(t, g, buffer.buf) return } else { require.NoError(t, err) @@ -193,7 +193,7 @@ func (tt *ExecutorTest) run(t *testing.T) { if err := e.Run(ctx, call); tt.wantRunError { require.Error(t, err) tt.writeFixtureErrRun(t, g, err) - tt.writeFixtureBuffer(t, g, buf) + tt.writeFixtureBuffer(t, g, buffer.buf) return } else { require.NoError(t, err) @@ -206,7 +206,7 @@ func (tt *ExecutorTest) run(t *testing.T) { } } - tt.writeFixtureBuffer(t, g, buf) + tt.writeFixtureBuffer(t, g, buffer.buf) } // Run the test (with a name if it has one) diff --git a/internal/output/group.go b/internal/output/group.go index 46973a27a9..71ad3dfc49 100644 --- a/internal/output/group.go +++ b/internal/output/group.go @@ -44,10 +44,15 @@ func (gw *groupWriter) close() error { // don't print begin/end messages if there's no buffered entries return nil } - if _, err := io.WriteString(gw.writer, gw.begin); err != nil { - return err + if len(gw.begin) > 0 { + // Rewrite the gw.buff with the beginning text. + s := gw.buff.String() + gw.buff.Reset() + gw.buff.WriteString(gw.begin) + gw.buff.WriteString(s) } gw.buff.WriteString(gw.end) + // Return the entire gw.buff to ensure the group is written atomically to stdout. _, err := io.Copy(gw.writer, &gw.buff) return err }