From b2621a8bc3b1ba3e6bced5ef75b025fdb20f7bc9 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Sun, 26 Feb 2017 21:18:53 -0300 Subject: [PATCH] Support task dependencies --- task.go | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/task.go b/task.go index fa049985..1a56ed65 100644 --- a/task.go +++ b/task.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "io/ioutil" "log" "os" @@ -14,6 +15,8 @@ import ( var ( CurrentDirectory, _ = osext.ExecutableFolder() TaskFilePath = filepath.Join(CurrentDirectory, "Taskfile.yml") + + Tasks = make(map[string]*Task) ) type Task struct { @@ -23,6 +26,14 @@ type Task struct { Generates string } +type TaskNotFoundError struct { + taskName string +} + +func (err *TaskNotFoundError) Error() string { + return fmt.Sprintf(`Task "%s" not found`, err.taskName) +} + func main() { log.SetFlags(0) @@ -33,25 +44,33 @@ func main() { file, err := ioutil.ReadFile(TaskFilePath) if err != nil { + if os.IsNotExist(err) { + log.Fatal("Taskfile.yml not found") + } log.Fatal(err) } - tasks := make(map[string]*Task) - if err = yaml.Unmarshal(file, &tasks); err != nil { + if err = yaml.Unmarshal(file, &Tasks); err != nil { log.Fatal(err) } - task, ok := tasks[args[0]] - if !ok { - log.Fatalf(`Task "%s" not found`, args[0]) - } - - if err = RunTask(task); err != nil { + if err = RunTask(args[0]); err != nil { log.Fatal(err) } } -func RunTask(t *Task) error { +func RunTask(name string) error { + t, ok := Tasks[name] + if !ok { + return &TaskNotFoundError{name} + } + + for _, d := range t.Deps { + if err := RunTask(d); err != nil { + return err + } + } + for _, c := range t.Cmds { cmd := exec.Command("/bin/sh", "-c", c) cmd.Stdout = os.Stdout