Skip to content

Commit

Permalink
feat: support refs in dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
pd93 committed Dec 30, 2023
1 parent 2f029cf commit 9d9536a
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
11 changes: 9 additions & 2 deletions docs/docs/experiments/any_variables.mdx
Expand Up @@ -225,7 +225,8 @@ tasks:
```

This means that the type of the variable is maintained when it is passed to
another Task. This also works when defining a variable:
another Task. This also works the same way when calling `deps` and when defining
a variable and can be used in any combination:

```yaml
version: 3
Expand All @@ -236,8 +237,14 @@ tasks:
FOO: [A, B, C] # <-- FOO is defined as an array
BAR:
ref: FOO # <-- BAR is defined as a reference to FOO
deps:
- task: bar
vars:
BAR:
ref: BAR # <-- BAR gets passed by reference to bar and maintains its type
bar:
cmds:
- 'echo {{index .BAR 0}}' # <-- BAR refers to FOO so the task outputs 'A'
- 'echo {{index .BAR 0}}' # <-- BAR still refers to FOO so the task outputs 'A'
```

</TabItem></Tabs>
Expand Down
14 changes: 12 additions & 2 deletions testdata/vars/any2/Taskfile.yml
Expand Up @@ -16,7 +16,7 @@ tasks:
VAR:
ref: MAP

map-ref:
ref:
vars:
MAP:
map: {"name":"Alice","age":30,"children":[{"name":"Bob","age":5},{"name":"Charlie","age":3},{"name":"Diane","age":1}]}
Expand All @@ -28,7 +28,7 @@ tasks:
VAR:
ref: MAP_REF

map-ref-sh:
ref-sh:
vars:
JSON_STRING:
sh: echo '{"name":"Alice","age":30,"children":[{"name":"Bob","age":5},{"name":"Charlie","age":3},{"name":"Diane","age":1}]}'
Expand All @@ -42,6 +42,16 @@ tasks:
VAR:
ref: MAP_REF

ref-dep:
vars:
MAP:
map: {"name":"Alice","age":30,"children":[{"name":"Bob","age":5},{"name":"Charlie","age":3},{"name":"Diane","age":1}]}
deps:
- task: print-var
vars:
VAR:
ref: MAP

json:
vars:
JSON_STRING:
Expand Down
11 changes: 11 additions & 0 deletions variables.go
Expand Up @@ -234,6 +234,17 @@ func (e *Executor) compiledTask(call ast.Call, evaluateShVars bool) (*ast.Task,
newDep := dep.DeepCopy()
newDep.Task = r.Replace(dep.Task)
newDep.Vars = r.ReplaceVars(dep.Vars)
// Loop over the dep's variables and resolve any references to other variables
err := dep.Vars.Range(func(k string, v ast.Var) error {
if v.Ref != "" {
refVal := vars.Get(v.Ref)
newDep.Vars.Set(k, refVal)
}
return nil
})
if err != nil {
return nil, err
}
new.Deps = append(new.Deps, newDep)
}
}
Expand Down

0 comments on commit 9d9536a

Please sign in to comment.