2017-03-02 11:46:20 +02:00
|
|
|
package task
|
|
|
|
|
|
|
|
import (
|
2019-06-11 20:49:37 +02:00
|
|
|
"io/ioutil"
|
2017-04-16 22:16:56 +02:00
|
|
|
"path/filepath"
|
2019-06-11 20:49:37 +02:00
|
|
|
"strings"
|
2017-03-02 12:28:34 +02:00
|
|
|
|
2018-12-24 19:19:53 +02:00
|
|
|
"github.com/go-task/task/v2/internal/execext"
|
2018-11-05 01:23:35 +02:00
|
|
|
"github.com/go-task/task/v2/internal/taskfile"
|
|
|
|
"github.com/go-task/task/v2/internal/templater"
|
2017-03-02 11:46:20 +02:00
|
|
|
)
|
|
|
|
|
2017-09-03 12:48:06 +02:00
|
|
|
// CompiledTask returns a copy of a task, but replacing variables in almost all
|
|
|
|
// properties using the Go template package.
|
2018-02-17 18:22:18 +02:00
|
|
|
func (e *Executor) CompiledTask(call taskfile.Call) (*taskfile.Task, error) {
|
2017-12-29 22:27:32 +02:00
|
|
|
origTask, ok := e.Taskfile.Tasks[call.Task]
|
2017-08-16 13:04:58 +02:00
|
|
|
if !ok {
|
|
|
|
return nil, &taskNotFoundError{call.Task}
|
|
|
|
}
|
|
|
|
|
2018-02-17 20:12:41 +02:00
|
|
|
vars, err := e.Compiler.GetVariables(origTask, call)
|
2017-11-02 14:25:50 +02:00
|
|
|
if err != nil {
|
2017-08-16 13:04:58 +02:00
|
|
|
return nil, err
|
|
|
|
}
|
2019-06-11 20:49:37 +02:00
|
|
|
|
2018-02-17 20:12:41 +02:00
|
|
|
r := templater.Templater{Vars: vars}
|
2017-07-20 09:05:37 +02:00
|
|
|
|
2018-02-17 18:22:18 +02:00
|
|
|
new := taskfile.Task{
|
2018-08-05 17:53:42 +02:00
|
|
|
Task: origTask.Task,
|
|
|
|
Desc: r.Replace(origTask.Desc),
|
|
|
|
Sources: r.ReplaceSlice(origTask.Sources),
|
|
|
|
Generates: r.ReplaceSlice(origTask.Generates),
|
|
|
|
Dir: r.Replace(origTask.Dir),
|
|
|
|
Vars: nil,
|
2019-01-02 16:05:40 +02:00
|
|
|
Env: nil,
|
2018-08-05 17:53:42 +02:00
|
|
|
Silent: origTask.Silent,
|
|
|
|
Method: r.Replace(origTask.Method),
|
|
|
|
Prefix: r.Replace(origTask.Prefix),
|
|
|
|
IgnoreError: origTask.IgnoreError,
|
2017-07-16 21:09:55 +02:00
|
|
|
}
|
2018-12-24 19:19:53 +02:00
|
|
|
new.Dir, err = execext.Expand(new.Dir)
|
2017-11-02 14:25:50 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2017-08-16 13:04:58 +02:00
|
|
|
if e.Dir != "" && !filepath.IsAbs(new.Dir) {
|
|
|
|
new.Dir = filepath.Join(e.Dir, new.Dir)
|
|
|
|
}
|
2018-04-22 20:41:53 +02:00
|
|
|
if new.Prefix == "" {
|
|
|
|
new.Prefix = new.Task
|
|
|
|
}
|
2019-01-02 16:05:40 +02:00
|
|
|
|
|
|
|
new.Env = make(taskfile.Vars, len(e.Taskfile.Env)+len(origTask.Env))
|
|
|
|
for k, v := range r.ReplaceVars(e.Taskfile.Env) {
|
|
|
|
new.Env[k] = v
|
|
|
|
}
|
|
|
|
for k, v := range r.ReplaceVars(origTask.Env) {
|
|
|
|
new.Env[k] = v
|
|
|
|
}
|
2017-08-16 13:04:58 +02:00
|
|
|
for k, v := range new.Env {
|
2018-02-17 20:12:41 +02:00
|
|
|
static, err := e.Compiler.HandleDynamicVar(v)
|
2017-08-16 13:04:58 +02:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2018-02-17 18:22:18 +02:00
|
|
|
new.Env[k] = taskfile.Var{Static: static}
|
2017-07-31 00:45:01 +02:00
|
|
|
}
|
2017-07-16 21:09:55 +02:00
|
|
|
|
2019-06-11 20:49:37 +02:00
|
|
|
if len(origTask.Status) > 0 {
|
|
|
|
e := &Executor{
|
|
|
|
Dir: new.Dir,
|
|
|
|
Stdout: ioutil.Discard,
|
|
|
|
Stderr: ioutil.Discard,
|
|
|
|
Dry: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
checker, err := e.GetStatusChecker(&new)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
value, err := checker.Value()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
vars[strings.ToUpper(checker.Kind())] = taskfile.Var{Static: value}
|
|
|
|
|
|
|
|
statusTemplater := templater.Templater{Vars: vars}
|
|
|
|
new.Status = statusTemplater.ReplaceSlice(origTask.Status)
|
|
|
|
}
|
|
|
|
|
2017-08-16 13:04:58 +02:00
|
|
|
if len(origTask.Cmds) > 0 {
|
2018-02-17 18:22:18 +02:00
|
|
|
new.Cmds = make([]*taskfile.Cmd, len(origTask.Cmds))
|
2017-08-16 13:04:58 +02:00
|
|
|
for i, cmd := range origTask.Cmds {
|
2018-02-17 18:22:18 +02:00
|
|
|
new.Cmds[i] = &taskfile.Cmd{
|
2018-07-10 10:44:58 +02:00
|
|
|
Task: r.Replace(cmd.Task),
|
|
|
|
Silent: cmd.Silent,
|
|
|
|
Cmd: r.Replace(cmd.Cmd),
|
|
|
|
Vars: r.ReplaceVars(cmd.Vars),
|
|
|
|
IgnoreError: cmd.IgnoreError,
|
2017-07-16 21:09:55 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-08-16 13:04:58 +02:00
|
|
|
if len(origTask.Deps) > 0 {
|
2018-02-17 18:22:18 +02:00
|
|
|
new.Deps = make([]*taskfile.Dep, len(origTask.Deps))
|
2017-08-16 13:04:58 +02:00
|
|
|
for i, dep := range origTask.Deps {
|
2018-02-17 18:22:18 +02:00
|
|
|
new.Deps[i] = &taskfile.Dep{
|
2018-02-17 20:12:41 +02:00
|
|
|
Task: r.Replace(dep.Task),
|
|
|
|
Vars: r.ReplaceVars(dep.Vars),
|
2017-07-16 21:09:55 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-05-28 22:02:59 +02:00
|
|
|
|
|
|
|
if len(origTask.Preconditions) > 0 {
|
|
|
|
new.Preconditions = make([]*taskfile.Precondition, len(origTask.Preconditions))
|
|
|
|
for i, precond := range origTask.Preconditions {
|
|
|
|
new.Preconditions[i] = &taskfile.Precondition{
|
|
|
|
Sh: r.Replace(precond.Sh),
|
|
|
|
Msg: r.Replace(precond.Msg),
|
2019-05-17 22:13:47 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-07-16 21:09:55 +02:00
|
|
|
|
2018-02-17 20:12:41 +02:00
|
|
|
return &new, r.Err()
|
2017-09-03 12:48:06 +02:00
|
|
|
}
|