From 6ce476e539dd29b69d4c57ae83f9af1ddaffc611 Mon Sep 17 00:00:00 2001 From: Yanhu007 Date: Mon, 13 Apr 2026 04:06:26 +0800 Subject: [PATCH] fix: don't print empty line to stderr when Exit message is empty HandleExitCoder unconditionally prints the error to ErrWriter, causing an empty line on stderr when Exit("", code) is used. Check if the error message is non-empty before printing. Add test to verify no output for empty exit messages. Fixes #2263 --- errors.go | 10 ++++++---- errors_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/errors.go b/errors.go index f365a57990..ffd6471f23 100644 --- a/errors.go +++ b/errors.go @@ -150,10 +150,12 @@ func HandleExitCoder(err error) { } if exitErr, ok := err.(ExitCoder); ok { - if _, ok := exitErr.(ErrorFormatter); ok { - _, _ = fmt.Fprintf(ErrWriter, "%+v\n", err) - } else { - _, _ = fmt.Fprintln(ErrWriter, err) + if msg := err.Error(); msg != "" { + if _, ok := exitErr.(ErrorFormatter); ok { + _, _ = fmt.Fprintf(ErrWriter, "%+v\n", err) + } else { + _, _ = fmt.Fprintln(ErrWriter, err) + } } OsExiter(exitErr.ExitCode()) return diff --git a/errors_test.go b/errors_test.go index 35aaab54d4..e995b6f250 100644 --- a/errors_test.go +++ b/errors_test.go @@ -232,3 +232,29 @@ func TestErrRequiredFlags_Error(t *testing.T) { expectedMsg = "Required flag \"flag1\" not set" assert.Equal(t, expectedMsg, err.Error()) } + +func TestHandleExitCoder_ExitCoderEmptyMessage(t *testing.T) { + exitCode := 0 + called := false + + OsExiter = func(rc int) { + if !called { + exitCode = rc + called = true + } + } + + defer func() { OsExiter = fakeOsExiter }() + + // Capture stderr output + savedErrWriter := ErrWriter + var errBuf bytes.Buffer + ErrWriter = &errBuf + defer func() { ErrWriter = savedErrWriter }() + + HandleExitCoder(Exit("", 42)) + + assert.Equal(t, 42, exitCode) + assert.True(t, called) + assert.Empty(t, errBuf.String(), "expected no output to stderr for empty exit message") +}