aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2025-09-26 15:24:20 +0200
committerAleksandr Nogikh <nogikh@google.com>2025-10-01 14:41:08 +0000
commit12039a0e63377e86fa1b5adc3d327d6e07f23a32 (patch)
tree0d622daed4041159362850994ab81d8ce351cbff /pkg
parentdb09e5b2322f6dbd902a69405c2142617c6b8715 (diff)
pkg/osutil: make VerboseError nest other errors
After this change it fits more naturally into the Go's error functionality.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/bisect/bisect.go2
-rw-r--r--pkg/build/freebsd.go2
-rw-r--r--pkg/cover/report_test.go4
-rw-r--r--pkg/instance/instance.go2
-rw-r--r--pkg/osutil/osutil.go24
5 files changed, 13 insertions, 21 deletions
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 {