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/logger"
|
||||||
"github.com/go-task/task/internal/output"
|
"github.com/go-task/task/internal/output"
|
||||||
"github.com/go-task/task/internal/taskfile"
|
"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/go-task/task/internal/taskfile/version"
|
||||||
|
|
||||||
"github.com/Masterminds/semver"
|
"github.com/Masterminds/semver"
|
||||||
@ -21,8 +22,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// TaskFilePath is the default Taskfile
|
|
||||||
TaskFilePath = "Taskfile"
|
|
||||||
// MaximumTaskCall is the max number of times a task can be called.
|
// MaximumTaskCall is the max number of times a task can be called.
|
||||||
// This exists to prevent infinite loops on cyclic dependencies
|
// This exists to prevent infinite loops on cyclic dependencies
|
||||||
MaximumTaskCall = 100
|
MaximumTaskCall = 100
|
||||||
@ -77,7 +76,13 @@ func (e *Executor) Run(calls ...taskfile.Call) error {
|
|||||||
|
|
||||||
// Setup setups Executor's internal state
|
// Setup setups Executor's internal state
|
||||||
func (e *Executor) Setup() error {
|
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
|
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"
|
"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
|
// CompiledTask returns a copy of a task, but replacing variables in almost all
|
||||||
// properties using the Go template package.
|
// properties using the Go template package.
|
||||||
func (e *Executor) CompiledTask(call taskfile.Call) (*taskfile.Task, error) {
|
func (e *Executor) CompiledTask(call taskfile.Call) (*taskfile.Task, error) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user