mirror of
https://github.com/go-task/task.git
synced 2025-02-03 13:22:11 +02:00
Fixes env: remove square braces and evaluate shell (#62)
Fixes bug #61, and makes `env` work more similar to `vars` by allowing dynamic shell values to be evaluated as part of `CompiledTask`.
This commit is contained in:
parent
300376b0b1
commit
72bfd94329
30
task.go
30
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
|
||||
|
12
task_test.go
12
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",
|
||||
|
1
testdata/env/.gitignore
vendored
Normal file
1
testdata/env/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
env.txt
|
10
testdata/env/Taskfile.yml
vendored
Normal file
10
testdata/env/Taskfile.yml
vendored
Normal file
@ -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
|
53
variables.go
53
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),
|
||||
|
Loading…
x
Reference in New Issue
Block a user