@@ -91,19 +91,6 @@ func (c *Compiler) getVariables(t *ast.Task, call *Call, evaluateShVars bool) (*
9191 }
9292 rangeFunc := getRangeFunc (c .Dir )
9393
94- var taskRangeFunc func (k string , v ast.Var ) error
95- if t != nil {
96- // NOTE(@andreynering): We're manually joining these paths here because
97- // this is the raw task, not the compiled one.
98- cache := & templater.Cache {Vars : result }
99- dir := templater .Replace (t .Dir , cache )
100- if err := cache .Err (); err != nil {
101- return nil , err
102- }
103- dir = filepathext .SmartJoin (c .Dir , dir )
104- taskRangeFunc = getRangeFunc (dir )
105- }
106-
10794 for k , v := range c .TaskfileEnv .All () {
10895 if err := rangeFunc (k , v ); err != nil {
10996 return nil , err
@@ -114,31 +101,54 @@ func (c *Compiler) getVariables(t *ast.Task, call *Call, evaluateShVars bool) (*
114101 return nil , err
115102 }
116103 }
104+
117105 if t != nil {
118106 for k , v := range t .IncludeVars .All () {
119107 if err := rangeFunc (k , v ); err != nil {
120108 return nil , err
121109 }
122110 }
111+
112+ if ! evaluateShVars {
113+ // Add includedTaskfile.Vars, and replace/overwrite taskfile.Vars,
114+ // _before_ calculating the t.Dir using the templater. Because
115+ // evaluateShVars is not set, the dir used when creating rangeFunc
116+ // will not be used (sh vars are evaluated on subsequent calls).
117+ for k , v := range t .IncludedTaskfileVars .All () {
118+ if err := rangeFunc (k , v ); err != nil {
119+ return nil , err
120+ }
121+ }
122+ }
123+
124+ // Calculate the taskDir for evaluation of IncludeVars. If the original TaskDir
125+ // was saved to t.IncludeTaskDir then that path needs to be used.
126+ cache := & templater.Cache {Vars : result }
127+ t .Dir = templater .Replace (t .Dir , cache )
128+ if len (t .IncludeTaskDir ) > 0 {
129+ // If the included TaskDir is absolute, then it will become
130+ // the TaskDir, otherwise join with the existing TaskDir.
131+ taskDir := templater .Replace (t .IncludeTaskDir , cache )
132+ t .Dir = filepathext .SmartJoin (t .Dir , taskDir )
133+ }
134+ taskRangeFunc := getRangeFunc (t .Dir )
135+
123136 for k , v := range t .IncludedTaskfileVars .All () {
124137 if err := taskRangeFunc (k , v ); err != nil {
125138 return nil , err
126139 }
127140 }
128- }
129-
130- if t == nil || call == nil {
131- return result , nil
132- }
133-
134- for k , v := range call .Vars .All () {
135- if err := rangeFunc (k , v ); err != nil {
136- return nil , err
141+ if call != nil {
142+ for k , v := range call .Vars .All () {
143+ if err := rangeFunc (k , v ); err != nil {
144+ return nil , err
145+ }
146+ }
137147 }
138- }
139- for k , v := range t . Vars . All () {
140- if err := taskRangeFunc ( k , v ); err != nil {
141- return nil , err
148+ for k , v := range t . Vars . All () {
149+ if err := taskRangeFunc ( k , v ); err != nil {
150+ return nil , err
151+ }
142152 }
143153 }
144154
0 commit comments