// pipeReaders creates goroutines for all readers to copy to stderr & stdout. func (m *Main) pipeReaders(build *bake.Build, set map[*bake.Build]struct{}) { // Ignore if the build has already been attached. if _, ok := set[build]; ok { return } set[build] = struct{}{} // NOTE: goroutines are closed automatically when build is closed. go io.Copy(m.Stdout, build.Stdout()) go io.Copy(m.Stderr, build.Stderr()) // Recursively pipe dependencies. for _, subbuild := range build.Dependencies() { m.pipeReaders(subbuild, set) } }