1
1
package execute
2
2
3
3
import (
4
+ "bytes"
4
5
"fmt"
5
- "io/ioutil "
6
+ "io"
6
7
"os"
7
8
"os/exec"
8
9
"strings"
@@ -14,6 +15,13 @@ type ExecTask struct {
14
15
Shell bool
15
16
Env []string
16
17
Cwd string
18
+
19
+ // StreamStdio prints stdout and stderr directly to os.Stdout/err as
20
+ // the command runs.
21
+ StreamStdio bool
22
+
23
+ // PrintCommand prints the command before executing
24
+ PrintCommand bool
17
25
}
18
26
19
27
type ExecResult struct {
@@ -28,7 +36,9 @@ func (et ExecTask) Execute() (ExecResult, error) {
28
36
argsSt = strings .Join (et .Args , " " )
29
37
}
30
38
31
- fmt .Println ("exec: " , et .Command , argsSt )
39
+ if et .PrintCommand {
40
+ fmt .Println ("exec: " , et .Command , argsSt )
41
+ }
32
42
33
43
var cmd * exec.Cmd
34
44
@@ -67,35 +77,29 @@ func (et ExecTask) Execute() (ExecResult, error) {
67
77
}
68
78
}
69
79
70
- stdoutPipe , stdoutPipeErr := cmd .StdoutPipe ()
71
- if stdoutPipeErr != nil {
72
- return ExecResult {}, stdoutPipeErr
73
- }
80
+ stdoutBuff := bytes.Buffer {}
81
+ stderrBuff := bytes.Buffer {}
74
82
75
- stderrPipe , stderrPipeErr := cmd .StderrPipe ()
76
- if stderrPipeErr != nil {
77
- return ExecResult {}, stderrPipeErr
83
+ var stdoutWriters io.Writer
84
+ var stderrWriters io.Writer
85
+
86
+ if et .StreamStdio {
87
+ stdoutWriters = io .MultiWriter (os .Stdout , & stdoutBuff )
88
+ stderrWriters = io .MultiWriter (os .Stderr , & stderrBuff )
89
+ } else {
90
+ stdoutWriters = & stdoutBuff
91
+ stderrWriters = & stderrBuff
78
92
}
79
93
94
+ cmd .Stdout = stdoutWriters
95
+ cmd .Stderr = stderrWriters
96
+
80
97
startErr := cmd .Start ()
81
98
82
99
if startErr != nil {
83
100
return ExecResult {}, startErr
84
101
}
85
102
86
- stdoutBytes , err := ioutil .ReadAll (stdoutPipe )
87
- if err != nil {
88
- return ExecResult {}, err
89
- }
90
-
91
- stderrBytes , err := ioutil .ReadAll (stderrPipe )
92
-
93
- if err != nil {
94
- return ExecResult {}, err
95
- }
96
-
97
- fmt .Println ("res: " + string (stdoutBytes ))
98
-
99
103
exitCode := 0
100
104
execErr := cmd .Wait ()
101
105
if execErr != nil {
@@ -106,8 +110,8 @@ func (et ExecTask) Execute() (ExecResult, error) {
106
110
}
107
111
108
112
return ExecResult {
109
- Stdout : string (stdoutBytes ),
110
- Stderr : string (stderrBytes ),
113
+ Stdout : string (stdoutBuff . Bytes () ),
114
+ Stderr : string (stderrBuff . Bytes () ),
111
115
ExitCode : exitCode ,
112
116
}, nil
113
117
}
0 commit comments