diff --git a/command/command.go b/command/command.go index 5672ef6..683bc7e 100644 --- a/command/command.go +++ b/command/command.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/bitrise-io/go-utils/v2/env" + "github.com/bitrise-io/go-utils/v2/errorutil" ) // ErrorFinder ... @@ -168,10 +169,11 @@ func printableCommandArgs(isQuoteFirst bool, fullCommandArgs []string) string { func (c command) wrapError(err error) error { var exitErr *exec.ExitError if errors.As(err, &exitErr) { + origErr := errorutil.NewHiddenOriginalError(err) if c.errorCollector != nil && len(c.errorCollector.errorLines) > 0 { - return fmt.Errorf("command failed with exit status %d (%s): %w", exitErr.ExitCode(), c.PrintableCommandArgs(), errors.New(strings.Join(c.errorCollector.errorLines, "\n"))) + return fmt.Errorf("command failed with exit status %d (%s): %w%w", exitErr.ExitCode(), c.PrintableCommandArgs(), errors.New(strings.Join(c.errorCollector.errorLines, "\n")), origErr) } - return fmt.Errorf("command failed with exit status %d (%s): %w", exitErr.ExitCode(), c.PrintableCommandArgs(), errors.New("check the command's output for details")) + return fmt.Errorf("command failed with exit status %d (%s): %w %w", exitErr.ExitCode(), c.PrintableCommandArgs(), errors.New("check the command's output for details"), origErr) } return fmt.Errorf("executing command failed (%s): %w", c.PrintableCommandArgs(), err) } diff --git a/errorutil/hiddenerror.go b/errorutil/hiddenerror.go new file mode 100644 index 0000000..85c9838 --- /dev/null +++ b/errorutil/hiddenerror.go @@ -0,0 +1,25 @@ +package errorutil + +// HiddenOriginalError allows to include an error in the error chain but do not print it. +// this allows replacing it with a more readable error message, +// while allowing code to check for the type of the error +type HiddenOriginalError struct { + originalErr error +} + +// NewHiddenOriginalError ... +func NewHiddenOriginalError(originalErr error) *HiddenOriginalError { + return &HiddenOriginalError{ + originalErr: originalErr, + } +} + +// Error ... +func (h HiddenOriginalError) Error() string { + return "" +} + +// Unwrap ... +func (h HiddenOriginalError) Unwrap() error { + return h.originalErr +}