diff --git a/task.go b/task.go index e791819e..c633d3ac 100644 --- a/task.go +++ b/task.go @@ -109,36 +109,22 @@ func (e *Executor) Run(args ...string) error { // RunTask runs a task by its name func (e *Executor) RunTask(ctx context.Context, call Call) error { - origTask, ok := e.Tasks[call.Task] - if !ok { - return &taskNotFoundError{call.Task} + t, err := e.CompiledTask(call) + if err != nil { + return err } if !e.Watch && atomic.AddInt32(e.taskCallCount[call.Task], 1) >= MaximumTaskCall { return &MaximumTaskCallExceededError{task: call.Task} } - vars, err := e.getVariables(call) - if err != nil { - return err - } - - t, err := origTask.CompiledTask(e.Dir, vars) - if err != nil { - return err - } - if err := e.runDeps(ctx, t); err != nil { return err } - // FIXME: doing again, since a var may have been overriden - // using the `set:` attribute of a dependecy. - // Remove this when `set` (that is deprecated) be removed - vars, err = e.getVariables(call) - if err != nil { - return err - } - t, err = origTask.CompiledTask(e.Dir, vars) + // FIXME: doing again, since a var may have been overriden using the + // `set:` attribute of a dependecy. Remove this when `set` (that is + // deprecated) be removed. + t, err = e.CompiledTask(call) if err != nil { return err } @@ -214,7 +200,7 @@ func (t *Task) getEnviron() []string { } envs := os.Environ() - for k, v := range t.Env { + for k, v := range t.Env.toStringMap() { envs = append(envs, fmt.Sprintf("%s=%s", k, v)) } return envs diff --git a/task_test.go b/task_test.go index 28d27432..ab67a03b 100644 --- a/task_test.go +++ b/task_test.go @@ -54,6 +54,18 @@ func (fct fileContentTest) Run(t *testing.T) { } +func TestEnv(t *testing.T) { + tt := fileContentTest{ + Dir: "testdata/env", + Target: "default", + TrimSpace: false, + Files: map[string]string{ + "env.txt": "GOOS='linux' GOARCH='amd64' CGO_ENABLED='0'\n", + }, + } + tt.Run(t) +} + func TestVars(t *testing.T) { tt := fileContentTest{ Dir: "testdata/vars", diff --git a/testdata/env/.gitignore b/testdata/env/.gitignore new file mode 100644 index 00000000..7a7d633f --- /dev/null +++ b/testdata/env/.gitignore @@ -0,0 +1 @@ +env.txt diff --git a/testdata/env/Taskfile.yml b/testdata/env/Taskfile.yml new file mode 100644 index 00000000..9aab4252 --- /dev/null +++ b/testdata/env/Taskfile.yml @@ -0,0 +1,10 @@ +default: + vars: + AMD64: amd64 + env: + GOOS: linux + GOARCH: "{{.AMD64}}" + CGO_ENABLED: + sh: echo '0' + cmds: + - echo "GOOS='$GOOS' GOARCH='$GOARCH' CGO_ENABLED='$CGO_ENABLED'" > env.txt diff --git a/variables.go b/variables.go index 6df72560..1d3d1415 100644 --- a/variables.go +++ b/variables.go @@ -228,27 +228,44 @@ func (e *Executor) handleShVar(v Var) (string, error) { // CompiledTask returns a copy of a task, but replacing // variables in almost all properties using the Go template package -func (t *Task) CompiledTask(dir string, vars Vars) (*Task, error) { - r := varReplacer{vars: vars} +func (e *Executor) CompiledTask(call Call) (*Task, error) { + origTask, ok := e.Tasks[call.Task] + if !ok { + return nil, &taskNotFoundError{call.Task} + } + + var r varReplacer + if vars, err := e.getVariables(call); err == nil { + r.vars = vars + } else { + return nil, err + } new := Task{ - Desc: r.replace(t.Desc), - Sources: r.replaceSlice(t.Sources), - Generates: r.replaceSlice(t.Generates), - Status: r.replaceSlice(t.Status), - Dir: r.replace(t.Dir), + Desc: r.replace(origTask.Desc), + Sources: r.replaceSlice(origTask.Sources), + Generates: r.replaceSlice(origTask.Generates), + Status: r.replaceSlice(origTask.Status), + Dir: r.replace(origTask.Dir), Vars: nil, - Set: r.replace(t.Set), - Env: r.replaceVars(t.Env), - Silent: t.Silent, + Set: r.replace(origTask.Set), + Env: r.replaceVars(origTask.Env), + Silent: origTask.Silent, } - if dir != "" && !filepath.IsAbs(new.Dir) { - new.Dir = filepath.Join(dir, new.Dir) + if e.Dir != "" && !filepath.IsAbs(new.Dir) { + new.Dir = filepath.Join(e.Dir, new.Dir) + } + for k, v := range new.Env { + static, err := e.handleShVar(v) + if err != nil { + return nil, err + } + new.Env[k] = Var{Static: static} } - if len(t.Cmds) > 0 { - new.Cmds = make([]*Cmd, len(t.Cmds)) - for i, cmd := range t.Cmds { + if len(origTask.Cmds) > 0 { + new.Cmds = make([]*Cmd, len(origTask.Cmds)) + for i, cmd := range origTask.Cmds { new.Cmds[i] = &Cmd{ Task: r.replace(cmd.Task), Silent: cmd.Silent, @@ -258,9 +275,9 @@ func (t *Task) CompiledTask(dir string, vars Vars) (*Task, error) { } } - if len(t.Deps) > 0 { - new.Deps = make([]*Dep, len(t.Deps)) - for i, dep := range t.Deps { + if len(origTask.Deps) > 0 { + new.Deps = make([]*Dep, len(origTask.Deps)) + for i, dep := range origTask.Deps { new.Deps[i] = &Dep{ Task: r.replace(dep.Task), Vars: r.replaceVars(dep.Vars),