From 240589978dda4b9bfb3cf09288840aadeeda4ee3 Mon Sep 17 00:00:00 2001 From: Sascha Andres Date: Thu, 2 Mar 2017 10:46:20 +0100 Subject: [PATCH] Variable handling Relates to #2 --- task.go | 7 +++++-- variableHandling.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 variableHandling.go diff --git a/task.go b/task.go index e0eab8db..95e17b62 100644 --- a/task.go +++ b/task.go @@ -43,6 +43,7 @@ type Task struct { Sources []string Generates []string Dir string + Variables map[string]string } type taskNotFoundError struct { @@ -101,14 +102,16 @@ func RunTask(name string) error { return nil } + vars := t.handleVariables() + for _, d := range t.Deps { - if err := RunTask(d); err != nil { + if err := RunTask(ReplaceVariables(d, vars)); err != nil { return err } } for _, c := range t.Cmds { - if err := runCommand(c, t.Dir); err != nil { + if err := runCommand(ReplaceVariables(c, vars), ReplaceVariables(t.Dir, vars)); err != nil { return &taskRunError{name, err} } } diff --git a/variableHandling.go b/variableHandling.go new file mode 100644 index 00000000..e9d46dd9 --- /dev/null +++ b/variableHandling.go @@ -0,0 +1,45 @@ +package task + +import ( + "fmt" + "os" + "strings" +) + +func (t Task) handleVariables() map[string]string { + localVariables := make(map[string]string) + for key, value := range t.Variables { + localVariables[key] = value + } + for key, value := range getEnvironmentVariables() { + localVariables[key] = value + } + return localVariables +} + +// 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) + } + return replaced +} + +// GetEnvironmentVariables returns environment variables as map +func getEnvironmentVariables() map[string]string { + getenvironment := func(data []string, getkeyval func(item string) (key, val string)) map[string]string { + items := make(map[string]string) + for _, item := range data { + key, val := getkeyval(item) + items[key] = val + } + return items + } + return getenvironment(os.Environ(), func(item string) (key, val string) { + splits := strings.Split(item, "=") + key = splits[0] + val = splits[1] + return + }) +}