package logs import ( "context" "io" "os" "github.com/moby/buildkit/client" "github.com/moby/buildkit/identity" "github.com/moby/buildkit/util/progress" "github.com/pkg/errors" ) func NewLogStreams(ctx context.Context, printOutput bool) (io.WriteCloser, io.WriteCloser) { return newStreamWriter(ctx, 1, printOutput), newStreamWriter(ctx, 2, printOutput) } func newStreamWriter(ctx context.Context, stream int, printOutput bool) io.WriteCloser { pw, _, _ := progress.FromContext(ctx) return &streamWriter{ pw: pw, stream: stream, printOutput: printOutput, } } type streamWriter struct { pw progress.Writer stream int printOutput bool } func (sw *streamWriter) Write(dt []byte) (int, error) { sw.pw.Write(identity.NewID(), client.VertexLog{ Stream: sw.stream, Data: append([]byte{}, dt...), }) if sw.printOutput { switch sw.stream { case 1: return os.Stdout.Write(dt) case 2: return os.Stderr.Write(dt) default: return 0, errors.Errorf("invalid stream %d", sw.stream) } } return len(dt), nil } func (sw *streamWriter) Close() error { return sw.pw.Close() }