From 621af79fdab096175e1582c8a4e8d05c38765941 Mon Sep 17 00:00:00 2001 From: Timothy Rule <34501912+trulede@users.noreply.github.com> Date: Thu, 8 Jan 2026 21:41:11 +0100 Subject: [PATCH 1/3] Ensure that errors from interop are of type interp.ExitStatus. --- task.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/task.go b/task.go index 489ef7e5dd..b5f2b226f6 100644 --- a/task.go +++ b/task.go @@ -355,10 +355,17 @@ func (e *Executor) runCommand(ctx context.Context, t *ast.Task, call *Call, i in if closeErr := closer(err); closeErr != nil { e.Logger.Errf(logger.Red, "task: unable to close writer: %v\n", closeErr) } - var exitCode interp.ExitStatus - if errors.As(err, &exitCode) && cmd.IgnoreError { - e.Logger.VerboseErrf(logger.Yellow, "task: [%s] command error ignored: %v\n", t.Name(), err) - return nil + if err != nil { + var exitCode interp.ExitStatus + if !errors.As(err, &exitCode) { + // Convert the err to an interp.ExitStatus. + e.Logger.VerboseErrf(logger.Yellow, "task: [%s] command error: %v\n", t.Name(), err) + err = interp.ExitStatus(1) + } + if cmd.IgnoreError { + e.Logger.VerboseErrf(logger.Yellow, "task: [%s] command error ignored: %v\n", t.Name(), err) + return nil + } } return err default: From 6eed751329293321055e621bf658698534868acd Mon Sep 17 00:00:00 2001 From: Timothy Rule <34501912+trulede@users.noreply.github.com> Date: Fri, 9 Jan 2026 19:30:03 +0100 Subject: [PATCH 2/3] Refine error printing to stderr --- task.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/task.go b/task.go index b5f2b226f6..7bdc5d559a 100644 --- a/task.go +++ b/task.go @@ -359,7 +359,7 @@ func (e *Executor) runCommand(ctx context.Context, t *ast.Task, call *Call, i in var exitCode interp.ExitStatus if !errors.As(err, &exitCode) { // Convert the err to an interp.ExitStatus. - e.Logger.VerboseErrf(logger.Yellow, "task: [%s] command error: %v\n", t.Name(), err) + e.Logger.Errf(logger.Default, "%v\n", err) err = interp.ExitStatus(1) } if cmd.IgnoreError { From 96ce5ed3f61e02de27fba38e2ab8174ffd2fa38e Mon Sep 17 00:00:00 2001 From: Timothy Rule <34501912+trulede@users.noreply.github.com> Date: Fri, 9 Jan 2026 19:39:16 +0100 Subject: [PATCH 3/3] Only print interp error if using CoreUtils. --- internal/execext/coreutils.go | 6 +++--- internal/execext/exec.go | 2 +- task.go | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/internal/execext/coreutils.go b/internal/execext/coreutils.go index d2ef82c4fd..7faba48412 100644 --- a/internal/execext/coreutils.go +++ b/internal/execext/coreutils.go @@ -7,14 +7,14 @@ import ( "github.com/go-task/task/v3/internal/env" ) -var useGoCoreUtils bool +var UseGoCoreUtils bool func init() { // If TASK_CORE_UTILS is set to either true or false, respect that. // By default, enable on Windows only. if v, err := strconv.ParseBool(env.GetTaskEnv("CORE_UTILS")); err == nil { - useGoCoreUtils = v + UseGoCoreUtils = v } else { - useGoCoreUtils = runtime.GOOS == "windows" + UseGoCoreUtils = runtime.GOOS == "windows" } } diff --git a/internal/execext/exec.go b/internal/execext/exec.go index c93d0c42dd..514f9ac18d 100644 --- a/internal/execext/exec.go +++ b/internal/execext/exec.go @@ -144,7 +144,7 @@ func ExpandFields(s string) ([]string, error) { } func execHandlers() (handlers []func(next interp.ExecHandlerFunc) interp.ExecHandlerFunc) { - if useGoCoreUtils { + if UseGoCoreUtils { handlers = append(handlers, coreutils.ExecHandler) } return handlers diff --git a/task.go b/task.go index 7bdc5d559a..2e51730334 100644 --- a/task.go +++ b/task.go @@ -358,8 +358,10 @@ func (e *Executor) runCommand(ctx context.Context, t *ast.Task, call *Call, i in if err != nil { var exitCode interp.ExitStatus if !errors.As(err, &exitCode) { - // Convert the err to an interp.ExitStatus. - e.Logger.Errf(logger.Default, "%v\n", err) + if execext.UseGoCoreUtils { + // Convert the err from CoreUtil to an interp.ExitStatus. + e.Logger.Errf(logger.Default, "%v\n", err) + } err = interp.ExitStatus(1) } if cmd.IgnoreError {