tl/dr
exclude not works in sources for a watch proccess, due "new" fsnotify
Description
I did try to switch to 3.50.0 and immediately notice that bug I tried to solve in #2742
Case 1: exclude ignored
# yaml-language-server: $schema=https://taskfile.dev/schema.json
version: "3"
vars:
GREETING: Hello, world!
tasks:
default:
sources:
- exclude: ./**/foo/internal/main.txt
- ./**/main.txt
method: timestamp
desc: Print a greeting message
cmds:
- task --version
- which task
- echo "{{.GREETING}}"
# - echo $(date) >> ./data/foo/internal/main.txt
# - echo $(date) >> ./data/qux/internal/main.txt
silent: true
init:
- mkdir -p data/{foo,bar,baz,quux,qux}/internal
- touch data/{foo,bar,baz,quux,qux}/internal/main.txt
remove: unlink $(which task)
> task -fvw --interval=500ms
task: Started watching for tasks: default
task: watching new dir: data/bar/internal
task: watching new dir: data/baz/internal
task: watching new dir: data/foo/internal
task: watching new dir: data/quux/internal
task: watching new dir: data/qux/internal
task: "default" started
task: [default] task --version
3.50.0
task: [default] which task
/opt/homebrew/bin/task
task: [default] echo "Hello, world!"
Hello, world!
task: [default] echo $(date) >> ./data/foo/internal/main.txt
task: [default] echo $(date) >> ./data/qux/internal/main.txt
task: "default" finished
task: task "default" finished running
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/foo/internal/main.txt"
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/qux/internal/main.txt"
task: "default" started
task: [default] task --version
task: "default" started
task: [default] task --version
3.50.0
task: [default] which task
/opt/homebrew/bin/task
task: [default] echo "Hello, world!"
Hello, world!
task: [default] echo $(date) >> ./data/foo/internal/main.txt
task: [default] echo $(date) >> ./data/qux/internal/main.txt
task: "default" finished
task: task "default" finished running
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/foo/internal/main.txt"
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/qux/internal/main.txt"
task: "default" started
task: [default] task --version
task: "default" started
task: [default] task --version
3.50.0
task: [default] which task
/opt/homebrew/bin/task
task: [default] echo "Hello, world!"
Hello, world!
task: [default] echo $(date) >> ./data/foo/internal/main.txt
task: [default] echo $(date) >> ./data/qux/internal/main.txt
task: "default" finished
task: task "default" finished running
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/foo/internal/main.txt"
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/qux/internal/main.txt"
task: "default" started
task: [default] task --version
task: "default" started
task: [default] task --version
3.50.0
3.50.0
task: [default] which task
task: [default] which task
/opt/homebrew/bin/task
/opt/homebrew/bin/task
task: [default] echo "Hello, world!"
task: [default] echo "Hello, world!"
Hello, world!
task: [default] echo $(date) >> ./data/foo/internal/main.txt
Hello, world!
task: [default] echo $(date) >> ./data/foo/internal/main.txt
task: [default] echo $(date) >> ./data/qux/internal/main.txt
task: [default] echo $(date) >> ./data/qux/internal/main.txt
task: "default" finished
task: task "default" finished running
task: "default" finished
task: task "default" finished running
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/foo/internal/main.txt"
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/qux/internal/main.txt"
task: "default" started
task: [default] task --version
task: "default" started
task: [default] task --version
3.50.0
task: [default] which task
3.50.0
task: [default] which task
/opt/homebrew/bin/task
task: [default] echo "Hello, world!"
/opt/homebrew/bin/task
task: [default] echo "Hello, world!"
Hello, world!
task: [default] echo $(date) >> ./data/foo/internal/main.txt
Hello, world!
task: [default] echo $(date) >> ./data/foo/internal/main.txt
task: [default] echo $(date) >> ./data/qux/internal/main.txt
task: [default] echo $(date) >> ./data/qux/internal/main.txt
task: "default" finished
task: task "default" finished running
task: "default" finished
task: task "default" finished running
^C%
so basically every change to excluded pattern triggering task termination and restart.
Case 2: some other file changed...
diff to taskfile
- - echo $(date) >> ./data/foo/internal/main.txt
- - echo $(date) >> ./data/qux/internal/main.txt
+ # - echo $(date) >> ./data/foo/internal/main.txt
+ # - echo $(date) >> ./data/qux/internal/main.txt
with updated list of watch files change also can be triggered with a new files that are not in watch list.data
Possible solution, still to check if file is in Allow list, then if it can be rejected rejected.
# yaml-language-server: $schema=https://taskfile.dev/schema.json
version: "3"
vars:
GREETING: Hello, world!
tasks:
default:
sources:
- exclude: ./**/foo/internal/main.txt
- ./**/main.txt
method: timestamp
desc: Print a greeting message
cmds:
- task --version
- which task
- ./script.sh
silent: true
init:
- mkdir -p data/{foo,bar,baz,quux,qux}/internal
- touch data/{foo,bar,baz,quux,qux}/internal/main.txt
remove: unlink $(which task)
# script.sh
#!/usr/bin/env bash
function handle_cerror() {
EXIT_CODE=$?
echo "Handling Error (Cleanup)"
exit $EXIT_CODE;
}
function handle_ctrlc() {
echo "Handling Termination"
exit 1
}
trap handle_cerror ERR
trap handle_ctrlc SIGINT
echo "Hi! We start Runing"
sleep 1
echo $(date) > ./data/foo/internal/main.txt
sleep 1
echo $(date) > ./data/foo/internal/main.data
sleep 1
echo $(date) > ./data/qux/internal/main.txt
sleep 1
echo "We are done!"
# output
> task -fvw --interval=500ms
task: Started watching for tasks: default
task: glob [&ast.Glob{Glob:"./**/foo/internal/main.txt", Negate:true}]
task: glob [&ast.Glob{Glob:"./**/main.txt", Negate:false}]
task: /Users/butuzov/Desktop/@made.ua/task_2829/data/baz/internal/main.txt => false
task: /Users/butuzov/Desktop/@made.ua/task_2829/data/quux/internal/main.txt => false
task: /Users/butuzov/Desktop/@made.ua/task_2829/data/qux/internal/main.txt => false
task: /Users/butuzov/Desktop/@made.ua/task_2829/data/foo/internal/main.txt => true
task: /Users/butuzov/Desktop/@made.ua/task_2829/data/bar/internal/main.txt => false
task: "default" started
task: [default] task --version
task: watching new dir: data/bar/internal
task: watching new dir: data/baz/internal
task: watching new dir: data/foo/internal
task: watching new dir: data/quux/internal
task: watching new dir: data/qux/internal
3.50.0
task: [default] which task
/Users/butuzov/go/bin/task
task: [default] ./script.sh
Hi! We start Runing
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/foo/internal/main.txt"
task: received watch event ignored: excluded
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/foo/internal/main.data"
task: received watch event ignored: no matching patterns
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/qux/internal/main.txt"
task: continue with event: /Users/butuzov/Desktop/@made.ua/task_2829/data/qux/internal/main.txt
task: "default" started
task: [default] task --version
3.50.0
task: [default] which task
/Users/butuzov/go/bin/task
task: [default] ./script.sh
Hi! We start Runing
Handling Termination
task: Failed to run task "default": exit status 1
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/foo/internal/main.txt"
task: received watch event ignored: excluded
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/foo/internal/main.data"
task: received watch event ignored: no matching patterns
task: received watch event: WRITE "/Users/butuzov/Desktop/@made.ua/task_2829/data/qux/internal/main.txt"
task: continue with event: /Users/butuzov/Desktop/@made.ua/task_2829/data/qux/internal/main.txt
task: "default" started
task: [default] task --version
3.50.0
task: [default] which task
/Users/butuzov/go/bin/task
task: [default] ./script.sh
Hi! We start Runing
^CHandling Termination
Handling Termination
possible solution is in https://github.com/butuzov/task/tree/watch
tl/dr
excludenot works insourcesfor a watch proccess, due "new"fsnotifyDescription
I did try to switch to 3.50.0 and immediately notice that bug I tried to solve in #2742
Case 1:
excludeignoredso basically every change to excluded pattern triggering task termination and restart.
Case 2: some other file changed...
diff to taskfile
with updated list of watch files change also can be triggered with a new files that are not in watch list.data
Possible solution, still to check if file is in Allow list, then if it can be rejected rejected.
possible solution is in https://github.com/butuzov/task/tree/watch