From d830178ef810712e51f6254c76ffee55f4a5c685 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Tue, 5 Jan 2021 10:48:04 -0300 Subject: [PATCH] Do more watch fixes This improves the work done on #423 --- CHANGELOG.md | 6 ++++++ watch.go | 33 ++++++++++++++------------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17d01487..3dbd20b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +- The watch feature (via the `--watch` flag) got a few different bug fixes and + should be more stable now + ([#423](https://github.com/go-task/task/pull/423)). + ## v3.1.0 - Fix a bug when the checksum up-to-date resolution is used by a task diff --git a/watch.go b/watch.go index cc1dd9db..13c3330a 100644 --- a/watch.go +++ b/watch.go @@ -15,10 +15,7 @@ import ( "github.com/radovskyb/watcher" ) -var watchIgnoredDirs = []string{ - ".git", - "node_modules", -} +const watchInterval = 5 * time.Second // watchTasks start watching the given tasks func (e *Executor) watchTasks(calls ...taskfile.Call) error { @@ -41,10 +38,6 @@ func (e *Executor) watchTasks(calls ...taskfile.Call) error { w := watcher.New() defer w.Close() w.SetMaxEvents(1) - if err := w.Ignore(watchIgnoredDirs...); err != nil { - cancel() - return err - } closeOnInterrupt(w) @@ -67,9 +60,6 @@ func (e *Executor) watchTasks(calls ...taskfile.Call) error { case err := <-w.Error: switch err { case watcher.ErrWatchedFileDeleted: - go func() { - w.TriggerEvent(watcher.Remove, nil) - }() default: e.Logger.Errf(logger.Red, "%v", err) } @@ -81,16 +71,16 @@ func (e *Executor) watchTasks(calls ...taskfile.Call) error { }() go func() { - // re-register every 20 seconds because we can have new files, but this process is expensive to run + // re-register every 5 seconds because we can have new files, but this process is expensive to run for { if err := e.registerWatchedFiles(w, calls...); err != nil { e.Logger.Errf(logger.Red, "%v", err) } - time.Sleep(time.Second * 20) + time.Sleep(watchInterval) } }() - return w.Start(time.Second) + return w.Start(watchInterval) } func isContextError(err error) bool { @@ -111,10 +101,7 @@ func closeOnInterrupt(w *watcher.Watcher) { } func (e *Executor) registerWatchedFiles(w *watcher.Watcher, calls ...taskfile.Call) error { - oldWatchedFiles := make(map[string]struct{}) - for f := range w.WatchedFiles() { - oldWatchedFiles[f] = struct{}{} - } + watchedFiles := w.WatchedFiles() var registerTaskFiles func(taskfile.Call) error registerTaskFiles = func(c taskfile.Call) error { @@ -146,12 +133,16 @@ func (e *Executor) registerWatchedFiles(w *watcher.Watcher, calls ...taskfile.Ca if err != nil { return err } - if _, ok := oldWatchedFiles[absFile]; ok { + if shouldIgnoreFile(absFile) { + continue + } + if _, ok := watchedFiles[absFile]; ok { continue } if err := w.Add(absFile); err != nil { return err } + w.TriggerEvent(watcher.Create, nil) e.Logger.VerboseOutf(logger.Green, "task: watching new file: %v", absFile) } } @@ -165,3 +156,7 @@ func (e *Executor) registerWatchedFiles(w *watcher.Watcher, calls ...taskfile.Ca } return nil } + +func shouldIgnoreFile(path string) bool { + return strings.Contains(path, "/.git") || strings.Contains(path, "/.task") || strings.Contains(path, "/node_modules") +}