From 9f294b4d10f9da3962d2322fdde37721c57135c3 Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Sun, 22 Jul 2018 16:05:47 -0300 Subject: [PATCH] Refactor and move logic of reading Taskfiles to its own package Idea to making things easier to start implementing #98 --- internal/taskfile/read/taskfile.go | 48 +++++++++++++++++++ internal/taskfile/read/taskvars.go | 52 +++++++++++++++++++++ task.go | 11 +++-- taskfile.go | 74 ------------------------------ variables.go | 5 -- 5 files changed, 108 insertions(+), 82 deletions(-) create mode 100644 internal/taskfile/read/taskfile.go create mode 100644 internal/taskfile/read/taskvars.go delete mode 100644 taskfile.go diff --git a/internal/taskfile/read/taskfile.go b/internal/taskfile/read/taskfile.go new file mode 100644 index 00000000..6fe01b30 --- /dev/null +++ b/internal/taskfile/read/taskfile.go @@ -0,0 +1,48 @@ +package read + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + + "github.com/go-task/task/internal/taskfile" + + "github.com/imdario/mergo" + "gopkg.in/yaml.v2" +) + +// Taskfile reads a Taskfile for a given directory +func Taskfile(dir string) (*taskfile.Taskfile, error) { + path := filepath.Join(dir, "Taskfile.yml") + t, err := readTaskfile(path) + if err != nil { + return nil, err + } + + path = filepath.Join(dir, fmt.Sprintf("Taskfile_%s.yml", runtime.GOOS)) + if _, err = os.Stat(path); err == nil { + osTaskfile, err := readTaskfile(path) + if err != nil { + return nil, err + } + if err = mergo.MapWithOverwrite(&t.Tasks, osTaskfile.Tasks); err != nil { + return nil, err + } + } + + for name, task := range t.Tasks { + task.Task = name + } + + return t, nil +} + +func readTaskfile(file string) (*taskfile.Taskfile, error) { + f, err := os.Open(file) + if err != nil { + return nil, err + } + var t taskfile.Taskfile + return &t, yaml.NewDecoder(f).Decode(&t) +} diff --git a/internal/taskfile/read/taskvars.go b/internal/taskfile/read/taskvars.go new file mode 100644 index 00000000..8d3e2eb2 --- /dev/null +++ b/internal/taskfile/read/taskvars.go @@ -0,0 +1,52 @@ +package read + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + + "github.com/go-task/task/internal/taskfile" + + "gopkg.in/yaml.v2" +) + +// Taskvars reads a Taskvars for a given directory +func Taskvars(dir string) (taskfile.Vars, error) { + vars := make(taskfile.Vars) + + path := filepath.Join(dir, "Taskvars.yml") + if _, err := os.Stat(path); err == nil { + vars, err = readTaskvars(path) + if err != nil { + return nil, err + } + } + + path = filepath.Join(dir, fmt.Sprintf("Taskvars_%s.yml", runtime.GOOS)) + if _, err := os.Stat(path); err == nil { + osVars, err := readTaskvars(path) + if err != nil { + return nil, err + } + + if vars == nil { + vars = osVars + } else { + for k, v := range osVars { + vars[k] = v + } + } + } + + return vars, nil +} + +func readTaskvars(file string) (taskfile.Vars, error) { + f, err := os.Open(file) + if err != nil { + return nil, err + } + var vars taskfile.Vars + return vars, yaml.NewDecoder(f).Decode(&vars) +} diff --git a/task.go b/task.go index f8805bd3..48092e48 100644 --- a/task.go +++ b/task.go @@ -14,6 +14,7 @@ import ( "github.com/go-task/task/internal/logger" "github.com/go-task/task/internal/output" "github.com/go-task/task/internal/taskfile" + "github.com/go-task/task/internal/taskfile/read" "github.com/go-task/task/internal/taskfile/version" "github.com/Masterminds/semver" @@ -21,8 +22,6 @@ import ( ) const ( - // TaskFilePath is the default Taskfile - TaskFilePath = "Taskfile" // MaximumTaskCall is the max number of times a task can be called. // This exists to prevent infinite loops on cyclic dependencies MaximumTaskCall = 100 @@ -77,7 +76,13 @@ func (e *Executor) Run(calls ...taskfile.Call) error { // Setup setups Executor's internal state func (e *Executor) Setup() error { - if err := e.readTaskfile(); err != nil { + var err error + e.Taskfile, err = read.Taskfile(e.Dir) + if err != nil { + return err + } + e.taskvars, err = read.Taskvars(e.Dir) + if err != nil { return err } diff --git a/taskfile.go b/taskfile.go deleted file mode 100644 index 0b667993..00000000 --- a/taskfile.go +++ /dev/null @@ -1,74 +0,0 @@ -package task - -import ( - "fmt" - "io/ioutil" - "path/filepath" - "runtime" - - "github.com/go-task/task/internal/taskfile" - - "github.com/imdario/mergo" - "gopkg.in/yaml.v2" -) - -// readTaskfile parses Taskfile from the disk -func (e *Executor) readTaskfile() error { - path := filepath.Join(e.Dir, TaskFilePath) - - var err error - e.Taskfile, err = e.readTaskfileData(path) - if err != nil { - return err - } - - osTasks, err := e.readTaskfileData(fmt.Sprintf("%s_%s", path, runtime.GOOS)) - if err != nil { - switch err.(type) { - case taskFileNotFound: - default: - return err - } - } else { - if err := mergo.MapWithOverwrite(&e.Taskfile.Tasks, osTasks.Tasks); err != nil { - return err - } - } - for name, task := range e.Taskfile.Tasks { - task.Task = name - } - - return e.readTaskvars() -} - -func (e *Executor) readTaskfileData(path string) (*taskfile.Taskfile, error) { - if b, err := ioutil.ReadFile(path + ".yml"); err == nil { - var taskfile taskfile.Taskfile - return &taskfile, yaml.Unmarshal(b, &taskfile) - } - return nil, taskFileNotFound{path} -} - -func (e *Executor) readTaskvars() error { - var ( - file = filepath.Join(e.Dir, TaskvarsFilePath) - osSpecificFile = fmt.Sprintf("%s_%s", file, runtime.GOOS) - ) - - if b, err := ioutil.ReadFile(file + ".yml"); err == nil { - if err := yaml.Unmarshal(b, &e.taskvars); err != nil { - return err - } - } - - if b, err := ioutil.ReadFile(osSpecificFile + ".yml"); err == nil { - osTaskvars := make(taskfile.Vars, 10) - if err := yaml.Unmarshal(b, &osTaskvars); err != nil { - return err - } - for k, v := range osTaskvars { - e.taskvars[k] = v - } - } - return nil -} diff --git a/variables.go b/variables.go index 5ac9d080..3e8947d6 100644 --- a/variables.go +++ b/variables.go @@ -9,11 +9,6 @@ import ( "mvdan.cc/sh/shell" ) -var ( - // TaskvarsFilePath file containing additional variables. - TaskvarsFilePath = "Taskvars" -) - // CompiledTask returns a copy of a task, but replacing variables in almost all // properties using the Go template package. func (e *Executor) CompiledTask(call taskfile.Call) (*taskfile.Task, error) {