Skip to content

Commit e8e914b

Browse files
committed
use YAML for dynamix variable instead of $ prefix
$ prefix still works but is now deprecated before: VAR: $echo var after: VAR: sh: echo bar closes #46
1 parent d22b3b0 commit e8e914b

File tree

6 files changed

+89
-22
lines changed

6 files changed

+89
-22
lines changed

command_test.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ vars:
3333
{
3434
yamlTaskCall,
3535
&task.Cmd{},
36-
&task.Cmd{Task: "another-task", Vars: task.Vars{"PARAM1": "VALUE1", "PARAM2": "VALUE2"}},
36+
&task.Cmd{Task: "another-task", Vars: task.Vars{
37+
"PARAM1": task.Var{Static: "VALUE1"},
38+
"PARAM2": task.Var{Static: "VALUE2"},
39+
}},
3740
},
3841
{
3942
yamlDep,
@@ -43,7 +46,10 @@ vars:
4346
{
4447
yamlTaskCall,
4548
&task.Dep{},
46-
&task.Dep{Task: "another-task", Vars: task.Vars{"PARAM1": "VALUE1", "PARAM2": "VALUE2"}},
49+
&task.Dep{Task: "another-task", Vars: task.Vars{
50+
"PARAM1": task.Var{Static: "VALUE1"},
51+
"PARAM2": task.Var{Static: "VALUE2"},
52+
}},
4753
},
4854
}
4955
for _, test := range tests {

task.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,10 @@ type Executor struct {
3939
taskvars Vars
4040
watchingFiles map[string]struct{}
4141

42-
dynamicCache Vars
42+
dynamicCache map[string]string
4343
muDynamicCache sync.Mutex
4444
}
4545

46-
// Vars is a string[string] variables map
47-
type Vars map[string]string
48-
4946
// Tasks representas a group of tasks
5047
type Tasks map[string]*Task
5148

@@ -78,7 +75,7 @@ func (e *Executor) Run(args ...string) error {
7875
}
7976

8077
if e.dynamicCache == nil {
81-
e.dynamicCache = make(Vars, 10)
78+
e.dynamicCache = make(map[string]string, 10)
8279
}
8380

8481
// check if given tasks exist
@@ -167,11 +164,15 @@ func (e *Executor) runDeps(ctx context.Context, call Call) error {
167164
}
168165
depVars := make(Vars, len(d.Vars))
169166
for k, v := range d.Vars {
170-
v, err := e.ReplaceVariables(v, call)
167+
static, err := e.ReplaceVariables(v.Static, call)
168+
if err != nil {
169+
return err
170+
}
171+
sh, err := e.ReplaceVariables(v.Sh, call)
171172
if err != nil {
172173
return err
173174
}
174-
depVars[k] = v
175+
depVars[k] = Var{Static: static, Sh: sh}
175176
}
176177

177178
return e.RunTask(ctx, Call{Task: dep, Vars: depVars})
@@ -260,11 +261,15 @@ func (e *Executor) runCommand(ctx context.Context, call Call, i int) error {
260261
if cmd.Cmd == "" {
261262
cmdVars := make(Vars, len(cmd.Vars))
262263
for k, v := range cmd.Vars {
263-
v, err := e.ReplaceVariables(v, call)
264+
static, err := e.ReplaceVariables(v.Static, call)
265+
if err != nil {
266+
return err
267+
}
268+
sh, err := e.ReplaceVariables(v.Sh, call)
264269
if err != nil {
265270
return err
266271
}
267-
cmdVars[k] = v
272+
cmdVars[k] = Var{Static: static, Sh: sh}
268273
}
269274
return e.RunTask(ctx, Call{Task: cmd.Task, Vars: cmdVars})
270275
}

task_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,10 @@ func TestVars(t *testing.T) {
6161
}{
6262
{"foo.txt", "foo"},
6363
{"bar.txt", "bar"},
64+
{"baz.txt", "baz"},
6465
{"foo2.txt", "foo2"},
6566
{"bar2.txt", "bar2"},
67+
{"baz2.txt", "baz2"},
6668
{"equal.txt", "foo=bar"},
6769
}
6870

testdata/vars/Taskfile.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@ hello:
66
cmds:
77
- echo {{.FOO}} > foo.txt
88
- echo {{.BAR}} > bar.txt
9+
- echo {{.BAZ}} > baz.txt
910
- echo {{.FOO2}} > foo2.txt
1011
- echo {{.BAR2}} > bar2.txt
12+
- echo {{.BAZ2}} > baz2.txt
1113
- echo {{.EQUAL}} > equal.txt
1214
vars:
1315
FOO: foo
1416
BAR: $echo bar
17+
BAZ:
18+
sh: echo baz
1519

1620
set-equal:
1721
set: EQUAL

testdata/vars/Taskvars.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
FOO2: foo2
22
BAR2: $echo bar2
3+
BAZ2:
4+
sh: echo baz2

variables.go

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,50 @@ var (
2121
ErrMultilineResultCmd = errors.New("Got multiline result from command")
2222
)
2323

24+
// Vars is a string[string] variables map
25+
type Vars map[string]Var
26+
27+
// Var represents either a static or dynamic variable
28+
type Var struct {
29+
Static string
30+
Sh string
31+
}
32+
33+
func (vs Vars) toStringMap() (m map[string]string) {
34+
m = make(map[string]string, len(vs))
35+
for k, v := range vs {
36+
m[k] = v.Static
37+
}
38+
return
39+
}
40+
41+
var (
42+
// ErrCantUnmarshalVar is returned for invalid var YAML
43+
ErrCantUnmarshalVar = errors.New("task: can't unmarshal var value")
44+
)
45+
46+
// UnmarshalYAML implements yaml.Unmarshaler interface
47+
func (v *Var) UnmarshalYAML(unmarshal func(interface{}) error) error {
48+
var str string
49+
if err := unmarshal(&str); err == nil {
50+
if strings.HasPrefix(str, "$") {
51+
v.Sh = strings.TrimPrefix(str, "$")
52+
} else {
53+
v.Static = str
54+
}
55+
return nil
56+
}
57+
58+
var sh struct {
59+
Sh string
60+
}
61+
if err := unmarshal(&sh); err == nil {
62+
v.Sh = sh.Sh
63+
return nil
64+
}
65+
return ErrCantUnmarshalVar
66+
}
67+
2468
var (
2569
templateFuncs template.FuncMap
2670
)
@@ -59,7 +103,7 @@ func (e *Executor) ReplaceVariables(initial string, call Call) (string, error) {
59103
}
60104

61105
var b bytes.Buffer
62-
if err = templ.Execute(&b, call.Vars); err != nil {
106+
if err = templ.Execute(&b, call.Vars.toStringMap()); err != nil {
63107
return "", err
64108
}
65109
return b.String(), nil
@@ -86,7 +130,11 @@ func (e *Executor) getVariables(call Call) (Vars, error) {
86130
for k, v := range vars {
87131
if runTemplate {
88132
var err error
89-
v, err = e.ReplaceVariables(v, call)
133+
v.Static, err = e.ReplaceVariables(v.Static, call)
134+
if err != nil {
135+
return err
136+
}
137+
v.Sh, err = e.ReplaceVariables(v.Sh, call)
90138
if err != nil {
91139
return err
92140
}
@@ -97,7 +145,7 @@ func (e *Executor) getVariables(call Call) (Vars, error) {
97145
return err
98146
}
99147

100-
result[k] = v
148+
result[k] = Var{Static: v}
101149
}
102150
return nil
103151
}
@@ -128,25 +176,25 @@ func getEnvironmentVariables() Vars {
128176
for _, e := range env {
129177
keyVal := strings.SplitN(e, "=", 2)
130178
key, val := keyVal[0], keyVal[1]
131-
m[key] = val
179+
m[key] = Var{Static: val}
132180
}
133181
return m
134182
}
135183

136-
func (e *Executor) handleDynamicVariableContent(value string) (string, error) {
137-
if !strings.HasPrefix(value, "$") {
138-
return value, nil
184+
func (e *Executor) handleDynamicVariableContent(v Var) (string, error) {
185+
if v.Static != "" {
186+
return v.Static, nil
139187
}
140188

141189
e.muDynamicCache.Lock()
142190
defer e.muDynamicCache.Unlock()
143-
if result, ok := e.dynamicCache[value]; ok {
191+
if result, ok := e.dynamicCache[v.Sh]; ok {
144192
return result, nil
145193
}
146194

147195
var stdout bytes.Buffer
148196
opts := &execext.RunCommandOptions{
149-
Command: strings.TrimPrefix(value, "$"),
197+
Command: v.Sh,
150198
Dir: e.Dir,
151199
Stdout: &stdout,
152200
Stderr: e.Stderr,
@@ -161,7 +209,7 @@ func (e *Executor) handleDynamicVariableContent(value string) (string, error) {
161209
}
162210

163211
result = strings.TrimSpace(result)
164-
e.verbosePrintfln(`task: dynamic variable: "%s", result: "%s"`, value, result)
165-
e.dynamicCache[value] = result
212+
e.verbosePrintfln(`task: dynamic variable: "%s", result: "%s"`, v.Sh, result)
213+
e.dynamicCache[v.Sh] = result
166214
return result, nil
167215
}

0 commit comments

Comments
 (0)