@@ -6,10 +6,8 @@ import (
66 "fmt"
77 "os"
88 "os/exec"
9- "path/filepath"
109 "strings"
1110 "sync"
12- "time"
1311
1412 "github.com/alecthomas/chroma/v2/quick"
1513 "github.com/charmbracelet/lipgloss"
@@ -162,76 +160,32 @@ func runCommand(ctx Context, prf *types.ParsedRunfile, pt *types.ParsedTask, arg
162160 SlogKeyAsPrefix : "task" ,
163161 })
164162
165- ex := executor .NewExecutor (executor.ExecutorArgs {
166- Logger : logger2 ,
167- IsInteractive : pt .Interactive ,
168- Command : func (c context.Context ) * exec.Cmd {
169- return CreateCommand (c , CmdArgs {
170- Shell : pt .Shell ,
171- Env : fn .ToEnviron (pt .Env ),
172- Cmd : command .Command ,
173- WorkingDir : pt .WorkingDir ,
174- interactive : pt .Interactive ,
175- Stdout : os .Stdout ,
176- Stderr : os .Stderr ,
177- })
163+ ex := executor .NewCmdExecutor (ctx , executor.CmdExecutorArgs {
164+ Logger : logger2 ,
165+ Interactive : pt .Interactive ,
166+ Commands : func (c context.Context ) []* exec.Cmd {
167+ return []* exec.Cmd {
168+ CreateCommand (c , CmdArgs {
169+ Shell : pt .Shell ,
170+ Env : fn .ToEnviron (pt .Env ),
171+ Cmd : command .Command ,
172+ WorkingDir : pt .WorkingDir ,
173+ interactive : pt .Interactive ,
174+ Stdout : os .Stdout ,
175+ Stderr : os .Stderr ,
176+ }),
177+ }
178178 },
179179 })
180180
181181 wg .Add (1 )
182182 go func () {
183183 defer wg .Done ()
184184 <- ctx .Done ()
185- ex .Kill ()
185+ ex .Stop ()
186186 }()
187187
188- // if task.Watch != nil && (task.Watch.Enable == nil || *task.Watch.Enable) {
189- // watch, err := watcher.NewWatcher(ctx, watcher.WatcherArgs{
190- // Logger: logger,
191- // WatchDirs: append(task.Watch.Dirs, pt.WorkingDir),
192- // OnlySuffixes: pt.Watch.OnlySuffixes,
193- // IgnoreSuffixes: pt.Watch.IgnoreSuffixes,
194- // ExcludeDirs: pt.Watch.ExcludeDirs,
195- // UseDefaultIgnoreList: true,
196- // // CooldownDuration: fn.New(1 * time.Second),
197- // })
198- // if err != nil {
199- // return errors.WithErr(err)
200- // }
201- //
202- // go ex.Exec()
203- //
204- // go func() {
205- // <-ctx.Done()
206- // logger.Debug("fwatcher is closing ...")
207- // watch.Close()
208- // <-time.After(200 * time.Millisecond)
209- // logger.Info("CLOSING..................")
210- // os.Exit(0)
211- // }()
212- //
213- // watch.WatchEvents(func(event watcher.Event, fp string) error {
214- // relPath, err := filepath.Rel(fn.Must(os.Getwd()), fp)
215- // if err != nil {
216- // return err
217- // }
218- // logger.Info(fmt.Sprintf("[RELOADING] due changes in %s", relPath))
219- // ex.Kill()
220- // select {
221- // case <-time.After(100 * time.Millisecond):
222- // go ex.Exec()
223- // return nil
224- // case <-ctx.Done():
225- // logger.Info("close signal received")
226- // watch.Close()
227- // return nil
228- // }
229- // })
230- //
231- // return nil
232- // }
233-
234- if err := ex .Exec (); err != nil {
188+ if err := ex .Start (); err != nil {
235189 return errors .ErrTaskFailed .Wrap (err ).KV ("task" , args .taskName )
236190 }
237191
@@ -278,56 +232,70 @@ func runTask(ctx Context, prf *types.ParsedRunfile, args runTaskArgs) error {
278232
279233 var wg sync.WaitGroup
280234
281- wg .Add (1 )
282- go func () {
283- defer wg .Done ()
284- runTaskCommands (NewContext (nctx , ctx .Logger ), prf , pt , args )
285- }()
286-
287- if pt .Watch != nil && (pt .Watch .Enable == nil || * pt .Watch .Enable ) {
288- watch , err := watcher .NewWatcher (ctx , watcher.WatcherArgs {
289- Logger : logger ,
290- WatchDirs : append (task .Watch .Dirs , pt .WorkingDir ),
291- OnlySuffixes : pt .Watch .OnlySuffixes ,
292- IgnoreSuffixes : pt .Watch .IgnoreSuffixes ,
293- ExcludeDirs : pt .Watch .ExcludeDirs ,
294- UseDefaultIgnoreList : true ,
295- CooldownDuration : fn .New (1 * time .Second ),
296- })
297- if err != nil {
298- return errors .WithErr (err )
235+ switch pt .Watch == nil {
236+ case true :
237+ {
238+ wg .Add (1 )
239+ go func () {
240+ defer wg .Done ()
241+ runTaskCommands (NewContext (nctx , ctx .Logger ), prf , pt , args )
242+ }()
299243 }
244+ case false :
245+ {
246+ if pt .Watch != nil && (pt .Watch .Enable == nil || * pt .Watch .Enable ) {
247+ watch , err := watcher .NewWatcher (ctx , watcher.WatcherArgs {
248+ Logger : logger ,
249+ WatchDirs : append (task .Watch .Dirs , pt .WorkingDir ),
250+ WatchExtensions : pt .Watch .Dirs ,
251+ IgnoreList : watcher .DefaultIgnoreList ,
252+ Interactive : pt .Interactive ,
253+ })
254+ if err != nil {
255+ return errors .WithErr (err )
256+ }
300257
301- go func () {
302- <- ctx .Done ()
303- logger .Debug ("fwatcher is closing ..." )
304- watch .Close ()
305- }()
306-
307- watch .WatchEvents (func (event watcher.Event , fp string ) error {
308- relPath , err := filepath .Rel (fn .Must (os .Getwd ()), fp )
309- if err != nil {
310- return err
311- }
312- logger .Info (fmt .Sprintf ("[RELOADING] due changes in %s" , relPath ))
313- select {
314- case <- time .After (100 * time .Millisecond ):
315- cf ()
316-
317- nctx , cf = context .WithCancel (ctx )
318- wg .Add (1 )
319258 go func () {
320- defer wg .Done ()
321- runTaskCommands (NewContext (nctx , ctx .Logger ), prf , pt , args )
259+ <- ctx .Done ()
260+ logger .Debug ("fwatcher is closing ..." )
261+ watch .Close ()
322262 }()
323263
324- return nil
325- case <- ctx .Done ():
326- logger .Info ("close signal received" )
327- watch .Close ()
328- return nil
264+ var executors []executor.Executor
265+
266+ if task .Watch .SSE != nil && task .Watch .SSE .Addr != "" {
267+ executors = append (executors , executor .NewSSEExecutor (executor.SSEExecutorArgs {Addr : task .Watch .SSE .Addr }))
268+ }
269+
270+ if len (pt .Commands ) > 0 {
271+ executors = append (executors , executor .NewCmdExecutor (ctx , executor.CmdExecutorArgs {
272+ Logger : logger ,
273+ Interactive : pt .Interactive ,
274+ Commands : func (c context.Context ) []* exec.Cmd {
275+ cmds := make ([]* exec.Cmd , 0 , len (pt .Commands ))
276+
277+ for i := range pt .Commands {
278+ cmds = append (cmds , CreateCommand (c , CmdArgs {
279+ Shell : pt .Shell ,
280+ Env : fn .ToEnviron (pt .Env ),
281+ Cmd : pt .Commands [i ].Command ,
282+ WorkingDir : pt .WorkingDir ,
283+ interactive : pt .Interactive ,
284+ Stdout : os .Stdout ,
285+ Stderr : os .Stderr ,
286+ }))
287+ }
288+
289+ return cmds
290+ },
291+ }))
292+ }
293+
294+ if err := watch .WatchAndExecute (ctx , executors ); err != nil {
295+ return err
296+ }
329297 }
330- })
298+ }
331299
332300 return nil
333301 }
0 commit comments