Skip to content

Commit 8d61133

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

File tree

2 files changed

+83
-58
lines changed

2 files changed

+83
-58
lines changed

watch.go

Lines changed: 73 additions & 49 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
@@ -85,17 +87,22 @@ func (e *Executor) watchTasks(calls ...*Call) error {
8587
for _, c := range calls {
8688
c := c
8789
go func() {
90+
if ShouldIgnore(event.Name) {
91+
e.Logger.VerboseErrf(logger.Magenta, "task: event skipped for being an ignored dir: %s\n", event.Name)
92+
return
93+
}
8894
t, err := e.GetTask(c)
8995
if err != nil {
9096
e.Logger.Errf(logger.Red, "%v\n", err)
9197
return
9298
}
9399
baseDir := filepathext.SmartJoin(e.Dir, t.Dir)
94-
files, err := fingerprint.Globs(baseDir, t.Sources)
100+
files, err := e.collectSources(calls)
95101
if err != nil {
96102
e.Logger.Errf(logger.Red, "%v\n", err)
97103
return
98104
}
105+
99106
if !event.Has(fsnotify.Remove) && !slices.Contains(files, event.Name) {
100107
relPath, _ := filepath.Rel(baseDir, event.Name)
101108
e.Logger.VerboseErrf(logger.Magenta, "task: skipped for file not in sources: %s\n", relPath)
@@ -158,69 +165,86 @@ func closeOnInterrupt(w *fsnotify.Watcher) {
158165
}
159166

160167
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 {
168+
files, err := e.collectSources(calls)
169+
if err != nil {
170+
return err
171+
}
172+
for _, f := range files {
173+
d := filepath.Dir(f)
174+
if isSet, ok := e.watchedDirs.Load(d); ok && isSet {
175+
continue
176+
}
177+
if ShouldIgnore(d) {
178+
continue
179+
}
180+
if err := w.Add(d); err != nil {
165181
return err
166182
}
183+
e.watchedDirs.Store(d, true)
184+
relPath, _ := filepath.Rel(e.Dir, d)
185+
e.Logger.VerboseOutf(logger.Green, "task: watching new dir: %v\n", relPath)
186+
}
187+
return nil
188+
}
167189

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-
}
190+
var ignorePaths = []string{
191+
"/.task",
192+
"/.git",
193+
"/.hg",
194+
"/node_modules",
195+
}
196+
197+
func ShouldIgnore(path string) bool {
198+
println("path", path)
199+
200+
for _, p := range ignorePaths {
201+
if strings.Contains(path, fmt.Sprintf("%s/", p)) || strings.HasSuffix(path, p) {
202+
return true
179203
}
204+
}
205+
return false
206+
}
207+
208+
func (e *Executor) collectSources(calls []*Call) ([]string, error) {
209+
var sources []string
180210

211+
err := e.traverse(calls, func(task *ast.Task) error {
181212
files, err := fingerprint.Globs(task.Dir, task.Sources)
182213
if err != nil {
183214
return err
184215
}
216+
sources = append(sources, files...)
217+
return nil
218+
})
185219

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
220+
return slicesext.UniqueJoin(sources), err
221+
}
222+
223+
type traverseFunc func(*ast.Task) error
224+
225+
func (e *Executor) traverse(calls []*Call, yield traverseFunc) error {
226+
for _, c := range calls {
227+
task, err := e.CompiledTask(c)
228+
if err != nil {
229+
return err
230+
}
231+
for _, dep := range task.Deps {
232+
if dep.Task != "" {
233+
if err := e.traverse([]*Call{{Task: dep.Task, Vars: dep.Vars}}, yield); err != nil {
234+
return err
235+
}
193236
}
194-
if err := w.Add(d); err != nil {
195-
return err
237+
}
238+
for _, cmd := range task.Cmds {
239+
if cmd.Task != "" {
240+
if err := e.traverse([]*Call{{Task: cmd.Task, Vars: cmd.Vars}}, yield); err != nil {
241+
return err
242+
}
196243
}
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)
201244
}
202-
return nil
203-
}
204-
205-
for _, c := range calls {
206-
if err := registerTaskDirs(c); err != nil {
245+
if err := yield(task); err != nil {
207246
return err
208247
}
209248
}
210249
return nil
211250
}
212-
213-
func ShouldIgnoreFile(path string) bool {
214-
ignorePaths := []string{
215-
"/.task",
216-
"/.git",
217-
"/.hg",
218-
"/node_modules",
219-
}
220-
for _, p := range ignorePaths {
221-
if strings.Contains(path, fmt.Sprintf("%s/", p)) || strings.HasSuffix(path, p) {
222-
return true
223-
}
224-
}
225-
return false
226-
}

watch_test.go

Lines changed: 10 additions & 9 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,16 +72,16 @@ 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
}
8283

83-
func TestShouldIgnoreFile(t *testing.T) {
84+
func TestShouldIgnore(t *testing.T) {
8485
t.Parallel()
8586

8687
tt := []struct {
@@ -95,7 +96,7 @@ func TestShouldIgnoreFile(t *testing.T) {
9596
ct := ct
9697
t.Run(fmt.Sprintf("ignore - %d", k), func(t *testing.T) {
9798
t.Parallel()
98-
require.Equal(t, task.ShouldIgnoreFile(ct.path), ct.expect)
99+
require.Equal(t, task.ShouldIgnore(ct.path), ct.expect)
99100
})
100101
}
101102
}

0 commit comments

Comments
 (0)