From 8a0689328b4accf80cc193c6b4fa9022223cd468 Mon Sep 17 00:00:00 2001 From: Hudson Clark Date: Sat, 8 Jul 2023 08:42:38 -0600 Subject: [PATCH] fix: propagate include vars in multi-level includes (#1256) --- task_test.go | 23 +++++++++++++++++++ taskfile/read/taskfile.go | 5 +++- .../Taskfile.yml | 17 ++++++++++++++ .../bar/Taskfile.yml | 7 ++++++ .../foo/Taskfile.yml | 7 ++++++ .../lib/Taskfile.yml | 9 ++++++++ 6 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 testdata/include_with_vars_multi_level/Taskfile.yml create mode 100644 testdata/include_with_vars_multi_level/bar/Taskfile.yml create mode 100644 testdata/include_with_vars_multi_level/foo/Taskfile.yml create mode 100644 testdata/include_with_vars_multi_level/lib/Taskfile.yml diff --git a/task_test.go b/task_test.go index b60dea7b..c3b2bc3e 100644 --- a/task_test.go +++ b/task_test.go @@ -1798,6 +1798,29 @@ VAR_2 is included-default-var2 assert.Equal(t, strings.TrimSpace(buff.String()), expectedOutputOrder) } +func TestIncludedVarsMultiLevel(t *testing.T) { + const dir = "testdata/include_with_vars_multi_level" + var buff bytes.Buffer + e := task.Executor{ + Dir: dir, + Stdout: &buff, + Stderr: &buff, + } + require.NoError(t, e.Setup()) + + expectedOutputOrder := strings.TrimSpace(` +task: [lib:greet] echo 'Hello world' +Hello world +task: [foo:lib:greet] echo 'Hello foo' +Hello foo +task: [bar:lib:greet] echo 'Hello bar' +Hello bar +`) + require.NoError(t, e.Run(context.Background(), taskfile.Call{Task: "default"})) + t.Log(buff.String()) + assert.Equal(t, strings.TrimSpace(buff.String()), expectedOutputOrder) +} + func TestErrorCode(t *testing.T) { const dir = "testdata/error_code" diff --git a/taskfile/read/taskfile.go b/taskfile/read/taskfile.go index 74c7d53a..4bc8a2fa 100644 --- a/taskfile/read/taskfile.go +++ b/taskfile/read/taskfile.go @@ -149,7 +149,10 @@ func Taskfile(readerNode *ReaderNode) (*taskfile.Taskfile, string, error) { for _, task := range includedTaskfile.Tasks.Values() { task.Dir = filepathext.SmartJoin(dir, task.Dir) - task.IncludeVars = includedTask.Vars + if task.IncludeVars == nil { + task.IncludeVars = &taskfile.Vars{} + } + task.IncludeVars.Merge(includedTask.Vars) task.IncludedTaskfileVars = includedTaskfile.Vars task.IncludedTaskfile = &includedTask } diff --git a/testdata/include_with_vars_multi_level/Taskfile.yml b/testdata/include_with_vars_multi_level/Taskfile.yml new file mode 100644 index 00000000..ba097e0d --- /dev/null +++ b/testdata/include_with_vars_multi_level/Taskfile.yml @@ -0,0 +1,17 @@ +version: "3" + +includes: + lib: + taskfile: lib/Taskfile.yml + internal: true + foo: + taskfile: foo/Taskfile.yml + bar: + taskfile: bar/Taskfile.yml + +tasks: + default: + cmds: + - task: lib:greet + - task: foo:lib:greet + - task: bar:lib:greet diff --git a/testdata/include_with_vars_multi_level/bar/Taskfile.yml b/testdata/include_with_vars_multi_level/bar/Taskfile.yml new file mode 100644 index 00000000..f280f3fa --- /dev/null +++ b/testdata/include_with_vars_multi_level/bar/Taskfile.yml @@ -0,0 +1,7 @@ +version: "3" + +includes: + lib: + taskfile: ../lib/Taskfile.yml + vars: + RECEIVER: "bar" diff --git a/testdata/include_with_vars_multi_level/foo/Taskfile.yml b/testdata/include_with_vars_multi_level/foo/Taskfile.yml new file mode 100644 index 00000000..0dc83e99 --- /dev/null +++ b/testdata/include_with_vars_multi_level/foo/Taskfile.yml @@ -0,0 +1,7 @@ +version: "3" + +includes: + lib: + taskfile: ../lib/Taskfile.yml + vars: + RECEIVER: "foo" diff --git a/testdata/include_with_vars_multi_level/lib/Taskfile.yml b/testdata/include_with_vars_multi_level/lib/Taskfile.yml new file mode 100644 index 00000000..43ac52e9 --- /dev/null +++ b/testdata/include_with_vars_multi_level/lib/Taskfile.yml @@ -0,0 +1,9 @@ +version: "3" + +vars: + RECEIVER: "world" + +tasks: + greet: + cmds: + - echo 'Hello {{.RECEIVER}}'