Skip to content

Commit 329130d

Browse files
author
Bryan C. Mills
committed
cmd/racebuild: stream stderr from gomote when building a single platform
Updates golang/go#24354. Change-Id: I3953f3863b722691ff9ee17b764ef7258ca89f48 Reviewed-on: https://go-review.googlesource.com/112877 Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent d1518ba commit 329130d

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

cmd/racebuild/racebuild.go

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -305,22 +305,53 @@ func (p *Platform) WriteSyso(sysof string, targz []byte) error {
305305

306306
func (p *Platform) Gomote(ctx context.Context, args ...string) ([]byte, error) {
307307
log.Printf("%v: gomote %v", p.Name(), args)
308-
output, err := exec.CommandContext(ctx, "gomote", args...).CombinedOutput()
309308

310-
if err != nil {
309+
cmd := exec.CommandContext(ctx, "gomote", args...)
310+
outBuf := new(bytes.Buffer)
311+
312+
// Combine stderr and stdout for everything except gettar: gettar's output is
313+
// huge, so we only want to log stderr for it.
314+
errBuf := outBuf
315+
if args[0] == "gettar" {
316+
errBuf = new(bytes.Buffer)
317+
}
318+
319+
cmd.Stdout = outBuf
320+
cmd.Stderr = errBuf
321+
run := cmd.Run
322+
if len(platformEnabled) == 1 {
323+
// If building only one platform, stream gomote output to os.Stderr.
324+
r, w := io.Pipe()
325+
errTee := io.TeeReader(r, cmd.Stderr)
326+
if cmd.Stdout == cmd.Stderr {
327+
cmd.Stdout = w
328+
}
329+
cmd.Stderr = w
330+
331+
run = func() (err error) {
332+
go func() {
333+
err = cmd.Run()
334+
w.Close()
335+
}()
336+
io.Copy(os.Stderr, errTee)
337+
return
338+
}
339+
}
340+
341+
if err := run(); err != nil {
311342
select {
312343
case <-ctx.Done():
313344
return nil, ctx.Err()
314345
default:
315346
}
316-
log.Printf("%v: gomote %v failed:\n%s", p.Name(), args, output)
347+
log.Printf("%v: gomote %v failed:\n%s", p.Name(), args, errBuf)
317348
return nil, err
318349
}
319350

320-
logData := output
321-
if args[0] == "gettar" {
322-
logData = []byte("<output elided>")
351+
if errBuf.Len() == 0 {
352+
log.Printf("%v: gomote %v succeeded: <no output>", p.Name(), args)
353+
} else {
354+
log.Printf("%v: gomote %v succeeded:\n%s", p.Name(), args, errBuf)
323355
}
324-
log.Printf("%v: gomote %v succeeded:\n%s", p.Name(), args, logData)
325-
return output, nil
356+
return outBuf.Bytes(), nil
326357
}

0 commit comments

Comments
 (0)