mirror of
https://github.com/go-task/task.git
synced 2025-11-25 22:32:55 +02:00
@@ -1,5 +1,11 @@
|
|||||||
# Changelog
|
# 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
|
## v3.1.0
|
||||||
|
|
||||||
- Fix a bug when the checksum up-to-date resolution is used by a task
|
- Fix a bug when the checksum up-to-date resolution is used by a task
|
||||||
|
|||||||
33
watch.go
33
watch.go
@@ -15,10 +15,7 @@ import (
|
|||||||
"github.com/radovskyb/watcher"
|
"github.com/radovskyb/watcher"
|
||||||
)
|
)
|
||||||
|
|
||||||
var watchIgnoredDirs = []string{
|
const watchInterval = 5 * time.Second
|
||||||
".git",
|
|
||||||
"node_modules",
|
|
||||||
}
|
|
||||||
|
|
||||||
// watchTasks start watching the given tasks
|
// watchTasks start watching the given tasks
|
||||||
func (e *Executor) watchTasks(calls ...taskfile.Call) error {
|
func (e *Executor) watchTasks(calls ...taskfile.Call) error {
|
||||||
@@ -41,10 +38,6 @@ func (e *Executor) watchTasks(calls ...taskfile.Call) error {
|
|||||||
w := watcher.New()
|
w := watcher.New()
|
||||||
defer w.Close()
|
defer w.Close()
|
||||||
w.SetMaxEvents(1)
|
w.SetMaxEvents(1)
|
||||||
if err := w.Ignore(watchIgnoredDirs...); err != nil {
|
|
||||||
cancel()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
closeOnInterrupt(w)
|
closeOnInterrupt(w)
|
||||||
|
|
||||||
@@ -67,9 +60,6 @@ func (e *Executor) watchTasks(calls ...taskfile.Call) error {
|
|||||||
case err := <-w.Error:
|
case err := <-w.Error:
|
||||||
switch err {
|
switch err {
|
||||||
case watcher.ErrWatchedFileDeleted:
|
case watcher.ErrWatchedFileDeleted:
|
||||||
go func() {
|
|
||||||
w.TriggerEvent(watcher.Remove, nil)
|
|
||||||
}()
|
|
||||||
default:
|
default:
|
||||||
e.Logger.Errf(logger.Red, "%v", err)
|
e.Logger.Errf(logger.Red, "%v", err)
|
||||||
}
|
}
|
||||||
@@ -81,16 +71,16 @@ func (e *Executor) watchTasks(calls ...taskfile.Call) error {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
go func() {
|
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 {
|
for {
|
||||||
if err := e.registerWatchedFiles(w, calls...); err != nil {
|
if err := e.registerWatchedFiles(w, calls...); err != nil {
|
||||||
e.Logger.Errf(logger.Red, "%v", err)
|
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 {
|
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 {
|
func (e *Executor) registerWatchedFiles(w *watcher.Watcher, calls ...taskfile.Call) error {
|
||||||
oldWatchedFiles := make(map[string]struct{})
|
watchedFiles := w.WatchedFiles()
|
||||||
for f := range w.WatchedFiles() {
|
|
||||||
oldWatchedFiles[f] = struct{}{}
|
|
||||||
}
|
|
||||||
|
|
||||||
var registerTaskFiles func(taskfile.Call) error
|
var registerTaskFiles func(taskfile.Call) error
|
||||||
registerTaskFiles = func(c 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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if _, ok := oldWatchedFiles[absFile]; ok {
|
if shouldIgnoreFile(absFile) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, ok := watchedFiles[absFile]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := w.Add(absFile); err != nil {
|
if err := w.Add(absFile); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
w.TriggerEvent(watcher.Create, nil)
|
||||||
e.Logger.VerboseOutf(logger.Green, "task: watching new file: %v", absFile)
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func shouldIgnoreFile(path string) bool {
|
||||||
|
return strings.Contains(path, "/.git") || strings.Contains(path, "/.task") || strings.Contains(path, "/node_modules")
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user