diff --git a/docs/docs/usage.md b/docs/docs/usage.md index 840f15e6..98f09705 100644 --- a/docs/docs/usage.md +++ b/docs/docs/usage.md @@ -1292,8 +1292,8 @@ Task also adds the following functions: based on a base path (first argument). The same as Go's [filepath.Rel](https://pkg.go.dev/path/filepath#Rel). - `merge`: Creates a new map that is a copy of the first map with the keys of - the second map merged into it. If there are duplicate keys, the value of the - second map is used. + each subsequent map merged into it. If there is a duplicate key, the value of + the last map with that key is used. - `spew`: Returns the Go representation of a specific variable. Useful for debugging. Uses the [davecgh/go-spew](https://github.com/davecgh/go-spew) package. diff --git a/internal/templater/funcs.go b/internal/templater/funcs.go index 859ef9f7..231ad041 100644 --- a/internal/templater/funcs.go +++ b/internal/templater/funcs.go @@ -53,15 +53,21 @@ func init() { "relPath": func(basePath, targetPath string) (string, error) { return filepath.Rel(basePath, targetPath) }, - "merge": func(a, b map[string]any) map[string]any { - m := make(map[string]any, len(a)+len(b)) - for k, v := range a { - m[k] = v + "merge": func(base map[string]any, v ...map[string]any) map[string]any { + cap := len(v) + for _, m := range v { + cap += len(m) } - for k, v := range b { - m[k] = v + result := make(map[string]any, cap) + for k, v := range base { + result[k] = v } - return m + for _, m := range v { + for k, v := range m { + result[k] = v + } + } + return result }, "spew": func(v any) string { return spew.Sdump(v) diff --git a/testdata/vars/any/Taskfile.yml b/testdata/vars/any/Taskfile.yml index 7226cd98..a2eb2767 100644 --- a/testdata/vars/any/Taskfile.yml +++ b/testdata/vars/any/Taskfile.yml @@ -61,9 +61,10 @@ tasks: map: vars: MAP_1: {A: 1, B: 2, C: 3} - MAP_2: {D: 4, E: 5, F: 6} + MAP_2: {B: 4, C: 5, D: 6} + MAP_3: {C: 7, D: 8, E: 9} cmds: - - echo '{{merge .MAP_1 .MAP_2}}' + - echo '{{merge .MAP_1 .MAP_2 .MAP_3}}' for-string: vars: