Skip to content

Commit

Permalink
fix: included variable merging
Browse files Browse the repository at this point in the history
  • Loading branch information
pd93 committed May 10, 2024
1 parent ced3e7a commit 37f32cc
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 1 deletion.
28 changes: 28 additions & 0 deletions task_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1228,6 +1228,34 @@ func TestIncludesInterpolation(t *testing.T) {
}
}

func TestIncludedTaskfileVarMerging(t *testing.T) {
const dir = "testdata/included_taskfile_var_merging"
tests := []struct {
name string
task string
expectedOutput string
}{
{"foo", "foo:pwd", "included_taskfile_var_merging/foo\n"},
{"bar", "bar:pwd", "included_taskfile_var_merging/bar\n"},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
var buff bytes.Buffer
e := task.Executor{
Dir: dir,
Stdout: &buff,
Stderr: &buff,
Silent: true,
}
require.NoError(t, e.Setup())

err := e.Run(context.Background(), &ast.Call{Task: test.task})
require.NoError(t, err)
assert.Contains(t, buff.String(), test.expectedOutput)
})
}
}

func TestInternalTask(t *testing.T) {
const dir = "testdata/internal_task"
tests := []struct {
Expand Down
11 changes: 11 additions & 0 deletions taskfile/ast/include.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,17 @@ func (includes *Includes) Range(f func(k string, v *Include) error) error {
return includes.OrderedMap.Range(f)
}

// DeepCopy creates a new instance of Includes and copies
// data by value from the source struct.
func (includes *Includes) DeepCopy() *Includes {
if includes == nil {
return nil
}
return &Includes{
OrderedMap: includes.OrderedMap.DeepCopy(),
}
}

func (include *Include) UnmarshalYAML(node *yaml.Node) error {
switch node.Kind {

Expand Down
21 changes: 21 additions & 0 deletions taskfile/ast/taskfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (

"github.com/Masterminds/semver/v3"
"gopkg.in/yaml.v3"

"github.com/go-task/task/v3/internal/deepcopy"
)

// NamespaceSeparator contains the character that separates namespaces
Expand Down Expand Up @@ -103,3 +105,22 @@ func (tf *Taskfile) UnmarshalYAML(node *yaml.Node) error {

return fmt.Errorf("yaml: line %d: cannot unmarshal %s into taskfile", node.Line, node.ShortTag())
}

func (tf *Taskfile) DeepCopy() *Taskfile {
return &Taskfile{
Location: tf.Location,
Version: semver.New(tf.Version.Major(), tf.Version.Minor(), tf.Version.Patch(), tf.Version.Prerelease(), tf.Version.Metadata()),
Output: tf.Output,
Method: tf.Method,
Includes: tf.Includes.DeepCopy(),
Set: deepcopy.Slice(tf.Set),
Shopt: deepcopy.Slice(tf.Shopt),
Vars: tf.Vars.DeepCopy(),
Env: tf.Env.DeepCopy(),
Tasks: *tf.Tasks.DeepCopy(),
Silent: tf.Silent,
Dotenv: deepcopy.Slice(tf.Dotenv),
Run: tf.Run,
Interval: tf.Interval,
}
}
13 changes: 12 additions & 1 deletion taskfile/ast/tasks.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ func (t1 *Tasks) Merge(t2 Tasks, include *Include, includedTaskfileVars *Vars) {
task.IncludeVars = &Vars{}
}
task.IncludeVars.Merge(include.Vars, nil)
task.IncludedTaskfileVars = includedTaskfileVars
task.IncludedTaskfileVars = includedTaskfileVars.DeepCopy()
}

// Add the task to the merged taskfile
Expand Down Expand Up @@ -153,6 +153,17 @@ func (t *Tasks) UnmarshalYAML(node *yaml.Node) error {
return fmt.Errorf("yaml: line %d: cannot unmarshal %s into tasks", node.Line, node.ShortTag())
}

// DeepCopy creates a new instance of Tasks and copies
// data by value from the source struct.
func (tasks *Tasks) DeepCopy() *Tasks {
if tasks == nil {
return nil
}
return &Tasks{
OrderedMap: tasks.OrderedMap.DeepCopy(),
}
}

func taskNameWithNamespace(taskName string, namespace string) string {
if strings.HasPrefix(taskName, NamespaceSeparator) {
return strings.TrimPrefix(taskName, NamespaceSeparator)
Expand Down
12 changes: 12 additions & 0 deletions testdata/included_taskfile_var_merging/Taskfile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
version: "3"

includes:
foo:
taskfile: ./foo/Taskfile.yaml
bar:
taskfile: ./bar/Taskfile.yaml

tasks:
stub:
cmds:
- echo 0
11 changes: 11 additions & 0 deletions testdata/included_taskfile_var_merging/bar/Taskfile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
version: "3"

vars:
DIR: bar

tasks:
pwd:
dir: ./{{ .DIR }}
cmds:
- echo "{{ .DIR }}"
- pwd
11 changes: 11 additions & 0 deletions testdata/included_taskfile_var_merging/foo/Taskfile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
version: "3"

vars:
DIR: foo

tasks:
pwd:
dir: ./{{ .DIR }}
cmds:
- echo "{{ .DIR }}"
- pwd

0 comments on commit 37f32cc

Please sign in to comment.