@@ -4,12 +4,50 @@ import (
4
4
"bread/src/helpers/repos"
5
5
"bread/src/helpers/utils"
6
6
7
+ "fmt"
7
8
"os"
8
- "os/exec "
9
+ goCmd "github.com/go-cmd/cmd "
9
10
)
10
11
11
12
type RunCmd struct {
12
13
Target string `arg:"" name:"target" help:"Target To Run" type:"string"`
14
+ Arguments []string `arg:"" passthrough:"" optional:"" name:"arguments" help:"Argument to pass to the program" type:"string"`
15
+ }
16
+
17
+ func executeCmd (target string , arguments []string ) {
18
+ options := goCmd.Options {
19
+ Buffered : false ,
20
+ Streaming : true ,
21
+ }
22
+ runCmd := goCmd .NewCmdOptions (options , target , arguments ... )
23
+
24
+ // Print STDOUT and STDERR lines streaming from Cmd
25
+ doneChan := make (chan struct {})
26
+ go func () {
27
+ defer close (doneChan )
28
+ for runCmd .Stdout != nil || runCmd .Stderr != nil {
29
+ select {
30
+ case line , open := <- runCmd .Stdout :
31
+ if ! open {
32
+ runCmd .Stdout = nil
33
+ continue
34
+ }
35
+ fmt .Println (line )
36
+ case line , open := <- runCmd .Stderr :
37
+ if ! open {
38
+ runCmd .Stderr = nil
39
+ continue
40
+ }
41
+ fmt .Fprintln (os .Stderr , line )
42
+ }
43
+ }
44
+ }()
45
+
46
+ // Run and wait for Cmd to return, discard Status
47
+ <- runCmd .Start ()
48
+
49
+ // Wait for goroutine to print everything
50
+ <- doneChan
13
51
}
14
52
15
53
func (cmd * RunCmd ) Run () (err error ) {
@@ -39,8 +77,7 @@ func (cmd *RunCmd) Run() (err error) {
39
77
40
78
// Check if the FilePath Exist, Show error
41
79
if _ , err = os .Stat (targetFilePath ); err == nil {
42
- command := exec .Command (targetFilePath )
43
- command .Run ()
80
+ executeCmd (targetFilePath , cmd .Arguments )
44
81
return nil
45
82
}
46
83
@@ -53,6 +90,6 @@ func (cmd *RunCmd) Run() (err error) {
53
90
// Print Signature Info If Exist.
54
91
utils .ShowSignature (targetFilePath )
55
92
56
- command := exec . Command (targetFilePath )
57
- return command . Run ()
93
+ executeCmd (targetFilePath , cmd . Arguments )
94
+ return nil
58
95
}
0 commit comments