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+
2468var (
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