From 12039a0e63377e86fa1b5adc3d327d6e07f23a32 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Fri, 26 Sep 2025 15:24:20 +0200 Subject: pkg/osutil: make VerboseError nest other errors After this change it fits more naturally into the Go's error functionality. --- pkg/bisect/bisect.go | 2 +- pkg/build/freebsd.go | 2 +- pkg/cover/report_test.go | 4 +++- pkg/instance/instance.go | 2 +- pkg/osutil/osutil.go | 24 +++++++----------------- 5 files changed, 13 insertions(+), 21 deletions(-) (limited to 'pkg') diff --git a/pkg/bisect/bisect.go b/pkg/bisect/bisect.go index c4b2ebf50..55a5d44f7 100644 --- a/pkg/bisect/bisect.go +++ b/pkg/bisect/bisect.go @@ -658,7 +658,7 @@ func (env *env) test() (*testResult, error) { var verr *osutil.VerboseError var kerr *build.KernelError if errors.As(err, &verr) { - errInfo += verr.Title + errInfo += verr.Error() env.saveDebugFile(current.Hash, 0, verr.Output) } else if errors.As(err, &kerr) { errInfo += string(kerr.Report) diff --git a/pkg/build/freebsd.go b/pkg/build/freebsd.go index 5de09738a..4b403d587 100644 --- a/pkg/build/freebsd.go +++ b/pkg/build/freebsd.go @@ -54,7 +54,7 @@ options DIAGNOSTIC // because FreeBSD's build doesn't correctly order the two // targets. Its output is useful for debugging though, so // include it here. - return ImageDetails{}, osutil.PrependContext(string(output), err) + return ImageDetails{}, fmt.Errorf("%s: %w", string(output), err) } kernelObjDir := filepath.Join(objPrefix, params.KernelDir, diff --git a/pkg/cover/report_test.go b/pkg/cover/report_test.go index 96b634cc6..c3d3231fb 100644 --- a/pkg/cover/report_test.go +++ b/pkg/cover/report_test.go @@ -11,6 +11,7 @@ import ( "bytes" "encoding/csv" "encoding/json" + "errors" "fmt" "os" "path/filepath" @@ -283,7 +284,8 @@ func buildTestBinary(t *testing.T, target *targets.Target, test *Test, dir strin } if _, err := osutil.RunCmd(time.Hour, "", target.CCompiler, ldflags...); err != nil { // Arm linker in the env image has a bug when linking a clang-produced files. - if regexp.MustCompile(`arm-linux-gnueabi.* assertion fail`).MatchString(err.Error()) { + var vErr *osutil.VerboseError + if errors.As(err, &vErr) && regexp.MustCompile(`arm-linux-gnueabi.* assertion fail`).Match(vErr.Output) { t.Skipf("skipping test, broken arm linker (%v)", err) } t.Fatal(err) diff --git a/pkg/instance/instance.go b/pkg/instance/instance.go index 51802acf9..b4460e3ab 100644 --- a/pkg/instance/instance.go +++ b/pkg/instance/instance.go @@ -568,7 +568,7 @@ func RunSmokeTest(cfg *mgrconfig.Config) (*report.Report, error) { var verboseErr *osutil.VerboseError if errors.As(retErr, &verboseErr) { // Include more details into the report. - prefix := fmt.Sprintf("%s, exit code %d\n\n", verboseErr.Title, verboseErr.ExitCode) + prefix := fmt.Sprintf("%s, exit code %d\n\n", verboseErr, verboseErr.ExitCode) output = append([]byte(prefix), output...) } rep := &report.Report{ diff --git a/pkg/osutil/osutil.go b/pkg/osutil/osutil.go index d16a76cb7..1379e8c23 100644 --- a/pkg/osutil/osutil.go +++ b/pkg/osutil/osutil.go @@ -65,9 +65,9 @@ func Run(timeout time.Duration, cmd *exec.Cmd) ([]byte, error) { err := cmd.Wait() close(done) if err != nil { - text := fmt.Sprintf("failed to run %q: %v", cmd.Args, err) + retErr := fmt.Errorf("failed to run %q: %w", cmd.Args, err) if <-timedout { - text = fmt.Sprintf("timedout after %v %q", timeout, cmd.Args) + retErr = fmt.Errorf("timedout after %v %q", timeout, cmd.Args) } exitCode := cmd.ProcessState.ExitCode() var exitErr *exec.ExitError @@ -77,7 +77,7 @@ func Run(timeout time.Duration, cmd *exec.Cmd) ([]byte, error) { } } return output.Bytes(), &VerboseError{ - Title: text, + Err: retErr, Output: output.Bytes(), ExitCode: exitCode, } @@ -111,27 +111,17 @@ func GraciousCommand(bin string, args ...string) *exec.Cmd { } type VerboseError struct { - Title string + Err error Output []byte ExitCode int } func (err *VerboseError) Error() string { - if len(err.Output) == 0 { - return err.Title - } - return fmt.Sprintf("%v\n%s", err.Title, err.Output) + return err.Err.Error() } -func PrependContext(ctx string, err error) error { - var verboseError *VerboseError - switch { - case errors.As(err, &verboseError): - verboseError.Title = fmt.Sprintf("%v: %v", ctx, verboseError.Title) - return verboseError - default: - return fmt.Errorf("%v: %w", ctx, err) - } +func (err *VerboseError) Unwrap() error { + return err.Err } func IsDir(name string) bool { -- cgit mrf-deployment