@@ -12,6 +12,7 @@ import (
12
12
"path/filepath"
13
13
"runtime"
14
14
"strings"
15
+ "sync"
15
16
16
17
"golang.org/x/xerrors"
17
18
@@ -53,9 +54,14 @@ func (e executor) execWriteOutput(ctx context.Context, args, env []string, stdOu
53
54
// #nosec
54
55
cmd := exec .CommandContext (ctx , e .binaryPath , args ... )
55
56
cmd .Dir = e .workdir
56
- cmd .Stdout = stdOutWriter
57
- cmd .Stderr = stdErrWriter
58
57
cmd .Env = env
58
+
59
+ // We want logs to be written in the correct order, so we wrap all logging
60
+ // in a sync.Mutex.
61
+ mut := & sync.Mutex {}
62
+ cmd .Stdout = syncWriter {mut , stdOutWriter }
63
+ cmd .Stderr = syncWriter {mut , stdErrWriter }
64
+
59
65
return cmd .Run ()
60
66
}
61
67
@@ -115,12 +121,17 @@ func (e executor) version(ctx context.Context) (*version.Version, error) {
115
121
func (e executor ) init (ctx context.Context , logr logger ) error {
116
122
outWriter , doneOut := logWriter (logr , proto .LogLevel_DEBUG )
117
123
errWriter , doneErr := logWriter (logr , proto .LogLevel_ERROR )
118
-
119
124
defer func () {
120
125
<- doneOut
121
126
<- doneErr
122
127
}()
123
- return e .execWriteOutput (ctx , []string {"init" }, e .basicEnv (), outWriter , errWriter )
128
+
129
+ args := []string {
130
+ "init" ,
131
+ "-no-color" ,
132
+ "-input=false" ,
133
+ }
134
+ return e .execWriteOutput (ctx , args , e .basicEnv (), outWriter , errWriter )
124
135
}
125
136
126
137
// revive:disable-next-line:flag-parameter
@@ -389,3 +400,16 @@ type terraformProvisionLogDiagnostic struct {
389
400
Summary string `json:"summary"`
390
401
Detail string `json:"detail"`
391
402
}
403
+
404
+ // syncWriter wraps an io.Writer in a sync.Mutex.
405
+ type syncWriter struct {
406
+ mut * sync.Mutex
407
+ w io.Writer
408
+ }
409
+
410
+ // Write implements io.Writer.
411
+ func (sw syncWriter ) Write (p []byte ) (n int , err error ) {
412
+ sw .mut .Lock ()
413
+ defer sw .mut .Unlock ()
414
+ return sw .w .Write (p )
415
+ }
0 commit comments