Merge pull request #2025 from giuseppe/fix-archive-filter-error-reporting
archive: improve filter error reporting
This commit is contained in:
commit
a9357dd79e
|
|
@ -26,6 +26,19 @@ func getFilterPath(name string) string {
|
|||
return path.(string)
|
||||
}
|
||||
|
||||
type errorRecordingReader struct {
|
||||
r io.Reader
|
||||
err error
|
||||
}
|
||||
|
||||
func (r *errorRecordingReader) Read(p []byte) (int, error) {
|
||||
n, err := r.r.Read(p)
|
||||
if r.err == nil && err != io.EOF {
|
||||
r.err = err
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
// tryProcFilter tries to run the command specified in args, passing input to its stdin and returning its stdout.
|
||||
// cleanup() is a caller provided function that will be called when the command finishes running, regardless of
|
||||
// whether it succeeds or fails.
|
||||
|
|
@ -38,22 +51,20 @@ func tryProcFilter(args []string, input io.Reader, cleanup func()) (io.ReadClose
|
|||
|
||||
var stderrBuf bytes.Buffer
|
||||
|
||||
inputWithError := &errorRecordingReader{r: input}
|
||||
|
||||
r, w := io.Pipe()
|
||||
cmd := exec.Command(path, args[1:]...)
|
||||
cmd.Stdin = input
|
||||
cmd.Stdin = inputWithError
|
||||
cmd.Stdout = w
|
||||
cmd.Stderr = &stderrBuf
|
||||
go func() {
|
||||
err := cmd.Run()
|
||||
if err != nil && stderrBuf.Len() > 0 {
|
||||
b := make([]byte, 1)
|
||||
// if there is an error reading from input, prefer to return that error
|
||||
_, errRead := input.Read(b)
|
||||
if errRead != nil && errRead != io.EOF {
|
||||
err = errRead
|
||||
} else {
|
||||
err = fmt.Errorf("%s: %w", strings.TrimRight(stderrBuf.String(), "\n"), err)
|
||||
}
|
||||
// if there is an error reading from input, prefer to return that error
|
||||
if inputWithError.err != nil {
|
||||
err = inputWithError.err
|
||||
} else if err != nil && stderrBuf.Len() > 0 {
|
||||
err = fmt.Errorf("%s: %w", strings.TrimRight(stderrBuf.String(), "\n"), err)
|
||||
}
|
||||
w.CloseWithError(err) // CloseWithErr(nil) == Close()
|
||||
cleanup()
|
||||
|
|
|
|||
Loading…
Reference in New Issue