Skip to content

Commit de7ecf1

Browse files
committed
fix(watcher): fix some v3.43.x regressions
1 parent be45eb0 commit de7ecf1

File tree

2 files changed

+70
-52
lines changed

2 files changed

+70
-52
lines changed

watch.go

Lines changed: 62 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919
"github.com/go-task/task/v3/internal/fingerprint"
2020
"github.com/go-task/task/v3/internal/fsnotifyext"
2121
"github.com/go-task/task/v3/internal/logger"
22+
"github.com/go-task/task/v3/internal/slicesext"
23+
"github.com/go-task/task/v3/taskfile/ast"
2224
)
2325

2426
const defaultWaitTime = 100 * time.Millisecond
@@ -91,11 +93,12 @@ func (e *Executor) watchTasks(calls ...*Call) error {
9193
return
9294
}
9395
baseDir := filepathext.SmartJoin(e.Dir, t.Dir)
94-
files, err := fingerprint.Globs(baseDir, t.Sources)
96+
files, err := e.collectSources(calls)
9597
if err != nil {
9698
e.Logger.Errf(logger.Red, "%v\n", err)
9799
return
98100
}
101+
99102
if !event.Has(fsnotify.Remove) && !slices.Contains(files, event.Name) {
100103
relPath, _ := filepath.Rel(baseDir, event.Name)
101104
e.Logger.VerboseErrf(logger.Magenta, "task: skipped for file not in sources: %s\n", relPath)
@@ -158,54 +161,24 @@ func closeOnInterrupt(w *fsnotify.Watcher) {
158161
}
159162

160163
func (e *Executor) registerWatchedDirs(w *fsnotify.Watcher, calls ...*Call) error {
161-
var registerTaskDirs func(*Call) error
162-
registerTaskDirs = func(c *Call) error {
163-
task, err := e.CompiledTask(c)
164-
if err != nil {
165-
return err
166-
}
167-
168-
for _, d := range task.Deps {
169-
if err := registerTaskDirs(&Call{Task: d.Task, Vars: d.Vars}); err != nil {
170-
return err
171-
}
172-
}
173-
for _, c := range task.Cmds {
174-
if c.Task != "" {
175-
if err := registerTaskDirs(&Call{Task: c.Task, Vars: c.Vars}); err != nil {
176-
return err
177-
}
178-
}
179-
}
180-
181-
files, err := fingerprint.Globs(task.Dir, task.Sources)
182-
if err != nil {
183-
return err
164+
files, err := e.collectSources(calls)
165+
if err != nil {
166+
return err
167+
}
168+
for _, f := range files {
169+
d := filepath.Dir(f)
170+
if isSet, ok := e.watchedDirs.Load(d); ok && isSet {
171+
continue
184172
}
185-
186-
for _, f := range files {
187-
d := filepath.Dir(f)
188-
if isSet, ok := e.watchedDirs.Load(d); ok && isSet {
189-
continue
190-
}
191-
if ShouldIgnoreFile(d) {
192-
continue
193-
}
194-
if err := w.Add(d); err != nil {
195-
return err
196-
}
197-
e.watchedDirs.Store(d, true)
198-
relPath, _ := filepath.Rel(e.Dir, d)
199-
w.Events <- fsnotify.Event{Name: f, Op: fsnotify.Create}
200-
e.Logger.VerboseOutf(logger.Green, "task: watching new dir: %v\n", relPath)
173+
if ShouldIgnoreFile(d) {
174+
continue
201175
}
202-
return nil
203-
}
204-
205-
for _, c := range calls {
206-
if err := registerTaskDirs(c); err != nil {
176+
if err := w.Add(d); err != nil {
207177
return err
208178
}
179+
e.watchedDirs.Store(d, true)
180+
relPath, _ := filepath.Rel(e.Dir, d)
181+
e.Logger.VerboseOutf(logger.Green, "task: watching new dir: %v\n", relPath)
209182
}
210183
return nil
211184
}
@@ -224,3 +197,47 @@ func ShouldIgnoreFile(path string) bool {
224197
}
225198
return false
226199
}
200+
201+
func (e *Executor) collectSources(calls []*Call) ([]string, error) {
202+
var sources []string
203+
204+
err := e.traverse(calls, func(task *ast.Task) error {
205+
files, err := fingerprint.Globs(task.Dir, task.Sources)
206+
if err != nil {
207+
return err
208+
}
209+
sources = append(sources, files...)
210+
return nil
211+
})
212+
213+
return slicesext.UniqueJoin(sources), err
214+
}
215+
216+
type traverseFunc func(*ast.Task) error
217+
218+
func (e *Executor) traverse(calls []*Call, yield traverseFunc) error {
219+
for _, c := range calls {
220+
task, err := e.CompiledTask(c)
221+
if err != nil {
222+
return err
223+
}
224+
for _, dep := range task.Deps {
225+
if dep.Task != "" {
226+
if err := e.traverse([]*Call{{Task: dep.Task, Vars: dep.Vars}}, yield); err != nil {
227+
return err
228+
}
229+
}
230+
}
231+
for _, cmd := range task.Cmds {
232+
if cmd.Task != "" {
233+
if err := e.traverse([]*Call{{Task: cmd.Task, Vars: cmd.Vars}}, yield); err != nil {
234+
return err
235+
}
236+
}
237+
}
238+
if err := yield(task); err != nil {
239+
return err
240+
}
241+
}
242+
return nil
243+
}

watch_test.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,17 @@ task: Started watching for tasks: default
3131
task: [default] echo "Task running!"
3232
Task running!
3333
task: task "default" finished running
34-
task: Task "default" is up to date
34+
task: [default] echo "Task running!"
35+
Task running!
3536
task: task "default" finished running
3637
`)
3738

3839
var buff bytes.Buffer
3940
e := task.NewExecutor(
40-
task.ExecutorWithDir(dir),
41-
task.ExecutorWithStdout(&buff),
42-
task.ExecutorWithStderr(&buff),
43-
task.ExecutorWithWatch(true),
41+
task.WithDir(dir),
42+
task.WithStdout(&buff),
43+
task.WithStderr(&buff),
44+
task.WithWatch(true),
4445
)
4546

4647
require.NoError(t, e.Setup())
@@ -71,11 +72,11 @@ task: task "default" finished running
7172
}
7273
}()
7374

74-
time.Sleep(10 * time.Millisecond)
75+
time.Sleep(200 * time.Millisecond)
7576
err = os.WriteFile(filePath, []byte("test updated"), 0o644)
7677
require.NoError(t, err)
7778

78-
time.Sleep(150 * time.Millisecond)
79+
time.Sleep(200 * time.Millisecond)
7980
cancel()
8081
assert.Equal(t, expectedOutput, strings.TrimSpace(buff.String()))
8182
}

0 commit comments

Comments
 (0)