Skip to content

Commit 6259135

Browse files
authored
Merge pull request #100 from dims/fix-svg-reliability
Fix --svg pipe deadlock
2 parents d8defea + 27f8d75 commit 6259135

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

cmd/diff.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -966,14 +966,21 @@ func captureDOTOutput(fn func() error) (string, error) {
966966
return "", err
967967
}
968968
os.Stdout = w
969+
defer func() {
970+
os.Stdout = oldStdout
971+
}()
972+
973+
var buf bytes.Buffer
974+
readErrCh := make(chan error, 1)
975+
go func() {
976+
_, readErr := io.Copy(&buf, r)
977+
_ = r.Close()
978+
readErrCh <- readErr
979+
}()
969980

970981
runErr := fn()
971982
closeErr := w.Close()
972-
os.Stdout = oldStdout
973-
974-
var buf bytes.Buffer
975-
_, readErr := io.Copy(&buf, r)
976-
_ = r.Close()
983+
readErr := <-readErrCh
977984

978985
if runErr != nil {
979986
return "", runErr

cmd/why_test.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,21 @@ func captureStdout(t *testing.T, fn func()) string {
6868
os.Stdout = old
6969
}()
7070

71+
var buf bytes.Buffer
72+
readDone := make(chan error, 1)
73+
go func() {
74+
_, readErr := io.Copy(&buf, r)
75+
_ = r.Close()
76+
readDone <- readErr
77+
}()
78+
7179
fn()
7280

7381
if err := w.Close(); err != nil {
7482
t.Fatalf("close writer: %v", err)
7583
}
76-
var buf bytes.Buffer
77-
if _, err := io.Copy(&buf, r); err != nil {
84+
if err := <-readDone; err != nil {
7885
t.Fatalf("read capture: %v", err)
7986
}
80-
if err := r.Close(); err != nil {
81-
t.Fatalf("close reader: %v", err)
82-
}
8387
return buf.String()
8488
}

0 commit comments

Comments
 (0)