Skip to content

watch mode issues #2829

@butuzov

Description

@butuzov

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    state: needs triageWaiting to be triaged by a maintainer.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions