From 91d5fa5fe6b2d35ce18600ffb5138caabd4604b2 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Sun, 5 Mar 2017 16:49:44 -0300 Subject: [PATCH] Switch variable replacing with Go's template engine --- task.go | 20 ++++++++++++++------ variable_handling.go | 26 +++++++++++++++++++------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/task.go b/task.go index 29ad8ccf..1c232a32 100644 --- a/task.go +++ b/task.go @@ -89,7 +89,11 @@ func RunTask(name string) error { } for _, d := range t.Deps { - if err := RunTask(ReplaceVariables(d, vars)); err != nil { + d, err = ReplaceVariables(d, vars) + if err != nil { + return err + } + if err = RunTask(d); err != nil { return err } } @@ -130,11 +134,15 @@ func (t *Task) runCommand(i int) error { if err != nil { return err } - var ( - c = ReplaceVariables(t.Cmds[i], vars) - dir = ReplaceVariables(t.Dir, vars) - cmd *exec.Cmd - ) + c, err := ReplaceVariables(t.Cmds[i], vars) + if err != nil { + return err + } + dir, err := ReplaceVariables(t.Dir, vars) + if err != nil { + return err + } + var cmd *exec.Cmd if ShExists { cmd = exec.Command(ShPath, "-c", c) } else { diff --git a/variable_handling.go b/variable_handling.go index 699d77b8..f6a14060 100644 --- a/variable_handling.go +++ b/variable_handling.go @@ -1,11 +1,13 @@ package task import ( + "bytes" "encoding/json" - "fmt" "io/ioutil" "os" + "runtime" "strings" + "text/template" "github.com/BurntSushi/toml" "gopkg.in/yaml.v2" @@ -34,13 +36,23 @@ func (t Task) handleVariables() (map[string]string, error) { return localVariables, nil } -// ReplaceVariables writes variables into initial string -func ReplaceVariables(initial string, variables map[string]string) string { - replaced := initial - for name, val := range variables { - replaced = strings.Replace(replaced, fmt.Sprintf("{{%s}}", name), val, -1) +var templateFuncs = template.FuncMap{ + "OS": func() string { return runtime.GOOS }, + "ARCH": func() string { return runtime.GOARCH }, + "IsSH": func() bool { return ShExists }, +} + +// ReplaceVariables writes vars into initial string +func ReplaceVariables(initial string, vars map[string]string) (string, error) { + t, err := template.New("").Funcs(templateFuncs).Parse(initial) + if err != nil { + return "", err } - return replaced + b := bytes.NewBuffer(nil) + if err = t.Execute(b, vars); err != nil { + return "", err + } + return b.String(), nil } // GetEnvironmentVariables returns environment variables as map