diff --git a/bib/internal/util/util.go b/bib/internal/util/util.go index 8d32bde..04e1c60 100644 --- a/bib/internal/util/util.go +++ b/bib/internal/util/util.go @@ -26,3 +26,12 @@ func RunCmdSync(cmdName string, args ...string) error { } return nil } + +// OutputErr takes an error from exec.Command().Output() and tries +// generate an error with stderr details +func OutputErr(err error) error { + if err, ok := err.(*exec.ExitError); ok { + return fmt.Errorf("%w, stderr:\n%s", err, err.Stderr) + } + return err +} diff --git a/bib/internal/util/util_test.go b/bib/internal/util/util_test.go new file mode 100644 index 0000000..f72c2a7 --- /dev/null +++ b/bib/internal/util/util_test.go @@ -0,0 +1,21 @@ +package util_test + +import ( + "fmt" + "os/exec" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/osbuild/bootc-image-builder/bib/internal/util" +) + +func TestOutputErrPassthrough(t *testing.T) { + err := fmt.Errorf("boom") + assert.Equal(t, util.OutputErr(err), err) +} + +func TestOutputErrExecError(t *testing.T) { + _, err := exec.Command("bash", "-c", ">&2 echo some-stderr; exit 1").Output() + assert.Equal(t, "exit status 1, stderr:\nsome-stderr\n", util.OutputErr(err).Error()) +}