mirror of
https://github.com/go-task/task.git
synced 2025-03-19 21:17:46 +02:00
Refactor and move logic of reading Taskfiles to its own package
Idea to making things easier to start implementing #98
This commit is contained in:
parent
13f60bae41
commit
9f294b4d10
48
internal/taskfile/read/taskfile.go
Normal file
48
internal/taskfile/read/taskfile.go
Normal file
@ -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)
|
||||
}
|
52
internal/taskfile/read/taskvars.go
Normal file
52
internal/taskfile/read/taskvars.go
Normal file
@ -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)
|
||||
}
|
11
task.go
11
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
|
||||
}
|
||||
|
||||
|
74
taskfile.go
74
taskfile.go
@ -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
|
||||
}
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user