From 386dcbc1a0ceaba04c53cb1f2160d8ec5ae2d179 Mon Sep 17 00:00:00 2001 From: Timothy Rule <34501912+trulede@users.noreply.github.com> Date: Sat, 22 Nov 2025 21:17:13 +0100 Subject: [PATCH] fix: adjust `run: when_changed` to work correctly with imported tasks (#2511) --- internal/hash/hash.go | 2 +- task_test.go | 23 +++++++++++++++++++ taskfile/ast/task.go | 8 +++---- testdata/run_when_changed/Taskfile.yml | 11 +++++++++ .../run_when_changed/library/Taskfile.yml | 7 ++++++ .../run_when_changed/service-a/Taskfile.yml | 18 +++++++++++++++ .../run_when_changed/service-b/Taskfile.yml | 18 +++++++++++++++ 7 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 testdata/run_when_changed/Taskfile.yml create mode 100644 testdata/run_when_changed/library/Taskfile.yml create mode 100644 testdata/run_when_changed/service-a/Taskfile.yml create mode 100644 testdata/run_when_changed/service-b/Taskfile.yml diff --git a/internal/hash/hash.go b/internal/hash/hash.go index 62596595..68da4a88 100644 --- a/internal/hash/hash.go +++ b/internal/hash/hash.go @@ -20,5 +20,5 @@ func Name(t *ast.Task) (string, error) { func Hash(t *ast.Task) (string, error) { h, err := hashstructure.Hash(t, hashstructure.FormatV2, nil) - return fmt.Sprintf("%s:%d", t.Task, h), err + return fmt.Sprintf("%s:%s:%d", t.Location.Taskfile, t.LocalName(), h), err } diff --git a/task_test.go b/task_test.go index 68d5128a..cc8098fd 100644 --- a/task_test.go +++ b/task_test.go @@ -1851,6 +1851,29 @@ func TestRunOnceSharedDeps(t *testing.T) { assert.Contains(t, buff.String(), `task: [service-b:build] echo "build b"`) } +func TestRunWhenChanged(t *testing.T) { + t.Parallel() + + const dir = "testdata/run_when_changed" + + var buff bytes.Buffer + e := task.NewExecutor( + task.WithDir(dir), + task.WithStdout(&buff), + task.WithStderr(&buff), + task.WithForceAll(true), + task.WithSilent(true), + ) + require.NoError(t, e.Setup()) + require.NoError(t, e.Run(t.Context(), &task.Call{Task: "start"})) + expectedOutputOrder := strings.TrimSpace(` +login server=fubar user=fubar +login server=foo user=foo +login server=bar user=bar +`) + assert.Contains(t, buff.String(), expectedOutputOrder) +} + func TestDeferredCmds(t *testing.T) { t.Parallel() diff --git a/taskfile/ast/task.go b/taskfile/ast/task.go index 2747a00e..325b713e 100644 --- a/taskfile/ast/task.go +++ b/taskfile/ast/task.go @@ -13,7 +13,7 @@ import ( // Task represents a task type Task struct { - Task string + Task string `hash:"ignore"` Cmds []*Cmd Deps []*Dep Label string @@ -36,18 +36,18 @@ type Task struct { Interactive bool Internal bool Method string - Prefix string + Prefix string `hash:"ignore"` IgnoreError bool Run string Platforms []*Platform Watch bool Location *Location // Populated during merging - Namespace string + Namespace string `hash:"ignore"` IncludeVars *Vars IncludedTaskfileVars *Vars - FullName string + FullName string `hash:"ignore"` } func (t *Task) Name() string { diff --git a/testdata/run_when_changed/Taskfile.yml b/testdata/run_when_changed/Taskfile.yml new file mode 100644 index 00000000..e0996dfc --- /dev/null +++ b/testdata/run_when_changed/Taskfile.yml @@ -0,0 +1,11 @@ +version: '3' + +includes: + service-a: ./service-a + service-b: ./service-b + +tasks: + start: + cmds: + - task: service-a:start + - task: service-b:start diff --git a/testdata/run_when_changed/library/Taskfile.yml b/testdata/run_when_changed/library/Taskfile.yml new file mode 100644 index 00000000..ada3d062 --- /dev/null +++ b/testdata/run_when_changed/library/Taskfile.yml @@ -0,0 +1,7 @@ +version: '3' + +tasks: + login: + run: when_changed + cmds: + - echo "login server={{.SERVER}} user={{.USER}}" diff --git a/testdata/run_when_changed/service-a/Taskfile.yml b/testdata/run_when_changed/service-a/Taskfile.yml new file mode 100644 index 00000000..4d13c093 --- /dev/null +++ b/testdata/run_when_changed/service-a/Taskfile.yml @@ -0,0 +1,18 @@ +version: '3' + +includes: + library: + taskfile: ../library/Taskfile.yml + dir: ../library + +tasks: + start: + cmds: + - task: library:login + vars: + SERVER: fubar + USER: fubar + - task: library:login + vars: + SERVER: foo + USER: foo diff --git a/testdata/run_when_changed/service-b/Taskfile.yml b/testdata/run_when_changed/service-b/Taskfile.yml new file mode 100644 index 00000000..12141476 --- /dev/null +++ b/testdata/run_when_changed/service-b/Taskfile.yml @@ -0,0 +1,18 @@ +version: '3' + +includes: + library: + taskfile: ../library/Taskfile.yml + dir: ../library + +tasks: + start: + cmds: + - task: library:login + vars: + SERVER: fubar + USER: fubar + - task: library:login + vars: + SERVER: bar + USER: bar