@@ -15,7 +15,6 @@ import (
1515 "github.com/puzpuzpuz/xsync/v4"
1616
1717 "github.com/go-task/task/v3/errors"
18- "github.com/go-task/task/v3/internal/filepathext"
1918 "github.com/go-task/task/v3/internal/fingerprint"
2019 "github.com/go-task/task/v3/internal/fsnotifyext"
2120 "github.com/go-task/task/v3/internal/logger"
@@ -68,6 +67,12 @@ func (e *Executor) watchTasks(calls ...*Call) error {
6867
6968 closeOnInterrupt (w )
7069
70+ watchFiles , err := e .collectSources (calls )
71+ if err != nil {
72+ cancel ()
73+ return err
74+ }
75+
7176 go func () {
7277 for {
7378 select {
@@ -78,34 +83,43 @@ func (e *Executor) watchTasks(calls ...*Call) error {
7883 }
7984 e .Logger .VerboseErrf (logger .Magenta , "task: received watch event: %v\n " , event )
8085
86+ // Check if this watch event should be ignored.
87+ if ShouldIgnore (event .Name ) {
88+ e .Logger .VerboseErrf (logger .Magenta , "task: event skipped for being an ignored dir: %s\n " , event .Name )
89+ continue
90+ }
91+ if event .Has (fsnotify .Remove ) || event .Has (fsnotify .Rename ) {
92+ if ! slices .Contains (watchFiles , event .Name ) {
93+ relPath := event .Name
94+ if rel , err := filepath .Rel (e .Dir , event .Name ); err == nil {
95+ relPath = rel
96+ }
97+ e .Logger .VerboseErrf (logger .Magenta , "task: skipped for file not in sources: %s\n " , relPath )
98+ continue
99+ }
100+ }
101+ if event .Has (fsnotify .Create ) {
102+ watchFiles , err := e .collectSources (calls )
103+ if err != nil {
104+ e .Logger .Errf (logger .Red , "%v\n " , err )
105+ continue
106+ }
107+ if ! slices .Contains (watchFiles , event .Name ) {
108+ relPath := event .Name
109+ if rel , err := filepath .Rel (e .Dir , event .Name ); err == nil {
110+ relPath = rel
111+ }
112+ e .Logger .VerboseErrf (logger .Magenta , "task: skipped for file not in sources: %s\n " , relPath )
113+ continue
114+ }
115+ }
116+
117+ // The watch event is good, restart the task calls.
81118 cancel ()
82119 ctx , cancel = context .WithCancel (context .Background ())
83-
84120 e .Compiler .ResetCache ()
85-
86121 for _ , c := range calls {
87122 go func () {
88- if ShouldIgnore (event .Name ) {
89- e .Logger .VerboseErrf (logger .Magenta , "task: event skipped for being an ignored dir: %s\n " , event .Name )
90- return
91- }
92- t , err := e .GetTask (c )
93- if err != nil {
94- e .Logger .Errf (logger .Red , "%v\n " , err )
95- return
96- }
97- baseDir := filepathext .SmartJoin (e .Dir , t .Dir )
98- files , err := e .collectSources (calls )
99- if err != nil {
100- e .Logger .Errf (logger .Red , "%v\n " , err )
101- return
102- }
103-
104- if ! event .Has (fsnotify .Remove ) && ! slices .Contains (files , event .Name ) {
105- relPath , _ := filepath .Rel (baseDir , event .Name )
106- e .Logger .VerboseErrf (logger .Magenta , "task: skipped for file not in sources: %s\n " , relPath )
107- return
108- }
109123 err = e .RunTask (ctx , c )
110124 if err == nil {
111125 e .Logger .Errf (logger .Green , "task: task \" %s\" finished running\n " , c .Task )
0 commit comments