aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pkg/exec.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-03-03 22:20:43 +0900
committerOphestra <cat@gensokyo.uk>2026-03-03 22:20:43 +0900
commitea87664a759991a14c6891d53a488e3b7af26ee8 (patch)
treed69370c5785a8b40a9d8c209b71e8bcc17f365f0 /internal/pkg/exec.go
parent04d9984da06a07c42416469474fd17b82ea7392e (diff)
internal/pkg: cancel on scanner error
This avoids discarding output thus appearing unresponsive. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pkg/exec.go')
-rw-r--r--internal/pkg/exec.go6
1 files changed, 4 insertions, 2 deletions
diff --git a/internal/pkg/exec.go b/internal/pkg/exec.go
index 5c1b399b..bc068d1e 100644
--- a/internal/pkg/exec.go
+++ b/internal/pkg/exec.go
@@ -361,6 +361,7 @@ const (
// scanVerbose prefixes program output for a verbose [message.Msg].
func scanVerbose(
msg message.Msg,
+ cancel context.CancelFunc,
done chan<- struct{},
prefix string,
r io.Reader,
@@ -375,6 +376,7 @@ func scanVerbose(
msg.Verbose(prefix, s.Text())
}
if err := s.Err(); err != nil && !errors.Is(err, os.ErrClosed) {
+ cancel()
msg.Verbose("*"+prefix, err)
}
}
@@ -433,8 +435,8 @@ func (a *execArtifact) cure(f *FContext, hostNet bool) (err error) {
}()
stdoutDone, stderrDone := make(chan struct{}), make(chan struct{})
- go scanVerbose(msg, stdoutDone, "("+a.name+":1)", stdout)
- go scanVerbose(msg, stderrDone, "("+a.name+":2)", stderr)
+ go scanVerbose(msg, cancel, stdoutDone, "("+a.name+":1)", stdout)
+ go scanVerbose(msg, cancel, stderrDone, "("+a.name+":2)", stderr)
defer func() { <-stdoutDone; <-stderrDone }()
}