-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathorkfile.go
100 lines (83 loc) · 2.04 KB
/
orkfile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"context"
"errors"
"fmt"
"io"
"io/ioutil"
"gopkg.in/yaml.v3"
)
const (
DEFAULT_ORKFILE = "Orkfile.yml"
)
type Orkfile struct {
Default string `yaml:"default"`
Tasks []*Task `yaml:"tasks"`
inventory Inventory
stdin io.Reader
}
func Read(path string) (contents []byte, err error) {
contents, err = ioutil.ReadFile(path)
if err != nil {
return
}
return
}
func New() *Orkfile { return &Orkfile{} }
func (f *Orkfile) WithStdin(stdin io.Reader) *Orkfile {
f.stdin = stdin
return f
}
// parse the orkfile and populate the task inventory
func (f *Orkfile) Parse(contents []byte) error {
if err := yaml.Unmarshal(contents, f); err != nil {
return err
}
// populate the task inventory
f.inventory = Inventory{}
return f.inventory.Populate(f.Tasks)
}
func (f *Orkfile) Run(ctx context.Context, labels []string, logger Logger) error {
if len(labels) == 0 {
return f.RunDefault(ctx, logger)
} else {
for _, label := range labels {
if err := f.RunTask(ctx, label, logger); err != nil {
return err
}
}
return nil
}
}
// run the requested task
func (f *Orkfile) RunTask(ctx context.Context, label string, logger Logger) error {
task := f.inventory.Find(label)
if task == nil {
return fmt.Errorf("task %s does not exist", label)
}
return task.WithStdin(f.stdin).Execute(ctx, f.inventory, logger)
}
// run the default task (if any)
func (f *Orkfile) RunDefault(ctx context.Context, logger Logger) error {
if f.Default == "" {
return errors.New("default task has not been set")
}
return f.WithStdin(f.stdin).RunTask(ctx, f.Default, logger)
}
// return info for the requested task
func (f *Orkfile) Info(label string) (info string) {
if task := f.inventory.Find(label); task != nil {
desc := task.Description
if desc == "" {
desc = "<no description>"
}
info = fmt.Sprintf("[%s] %s", label, desc)
}
return
}
func (f *Orkfile) GetTasks(sel TaskSelector) []*LabeledTask {
return f.inventory.Tasks(sel)
}
func (f *Orkfile) Labels(sel TaskSelector) []string {
return f.inventory.Labels(sel)
}