@@ -12,9 +12,11 @@ import (
1212)
1313
1414type CommandGroup struct {
15- Groups []CommandGroup
16- Commands []func (context.Context ) * exec.Cmd
17- Parallel bool
15+ Groups []CommandGroup
16+ Commands []func (context.Context ) * exec.Cmd
17+ PreExecCommand func (cmd * exec.Cmd )
18+ PostExecCommmand func (cmd * exec.Cmd )
19+ Parallel bool
1820}
1921
2022type CmdExecutor struct {
@@ -71,7 +73,12 @@ func killPID(pid int, logger log.Logger) error {
7173 return nil
7274}
7375
74- func (ex * CmdExecutor ) exec (newCmd func (context.Context ) * exec.Cmd ) error {
76+ type execArgs struct {
77+ PreExec func (cmd * exec.Cmd )
78+ PostExec func (cmd * exec.Cmd )
79+ }
80+
81+ func (ex * CmdExecutor ) exec (newCmd func (context.Context ) * exec.Cmd , args execArgs ) error {
7582 if err := ex .parentCtx .Err (); err != nil {
7683 return err
7784 }
@@ -90,6 +97,10 @@ func (ex *CmdExecutor) exec(newCmd func(context.Context) *exec.Cmd) error {
9097 cmd .SysProcAttr .Foreground = true
9198 }
9299
100+ if args .PreExec != nil {
101+ args .PreExec (cmd )
102+ }
103+
93104 if err := cmd .Start (); err != nil {
94105 return err
95106 }
@@ -157,6 +168,10 @@ func (ex *CmdExecutor) exec(newCmd func(context.Context) *exec.Cmd) error {
157168 return err
158169 }
159170
171+ if args .PostExec != nil {
172+ args .PostExec (cmd )
173+ }
174+
160175 logger .Debug ("command fully executed and processed" )
161176 return nil
162177}
@@ -179,7 +194,10 @@ func (ex *CmdExecutor) execCommandGroup(cg CommandGroup) error {
179194 mu : sync.Mutex {},
180195 }
181196
182- if err := ce .exec (cmd ); err != nil {
197+ if err := ce .exec (cmd , execArgs {
198+ PreExec : cg .PreExecCommand ,
199+ PostExec : cg .PostExecCommmand ,
200+ }); err != nil {
183201 ex .logger .Debug ("command failed, got" , "err" , err )
184202 return
185203 }
@@ -204,7 +222,10 @@ func (ex *CmdExecutor) execCommandGroup(cg CommandGroup) error {
204222
205223 for i := range cg .Commands {
206224 cmd := cg .Commands [i ]
207- if err := ex .exec (cmd ); err != nil {
225+ if err := ex .exec (cmd , execArgs {
226+ PreExec : cg .PreExecCommand ,
227+ PostExec : cg .PostExecCommmand ,
228+ }); err != nil {
208229 return err
209230 }
210231 }
0 commit comments