Skip to content

Commit bf9cd76

Browse files
committed
Refactor task.Setup(): Move to its own file and split in separated functions
1 parent afbf98c commit bf9cd76

File tree

2 files changed

+277
-219
lines changed

2 files changed

+277
-219
lines changed

setup.go

Lines changed: 277 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,277 @@
1+
package task
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
"os"
8+
"path/filepath"
9+
"strings"
10+
"sync"
11+
12+
compilerv2 "github.com/go-task/task/v3/internal/compiler/v2"
13+
compilerv3 "github.com/go-task/task/v3/internal/compiler/v3"
14+
"github.com/go-task/task/v3/internal/execext"
15+
"github.com/go-task/task/v3/internal/logger"
16+
"github.com/go-task/task/v3/internal/output"
17+
"github.com/go-task/task/v3/taskfile"
18+
"github.com/go-task/task/v3/taskfile/read"
19+
)
20+
21+
func (e *Executor) Setup() error {
22+
if err := e.readTaskfile(); err != nil {
23+
return err
24+
}
25+
26+
v, err := e.Taskfile.ParsedVersion()
27+
if err != nil {
28+
return err
29+
}
30+
31+
if err := e.setupTempDir(); err != nil {
32+
return err
33+
}
34+
e.setupStdFiles()
35+
e.setupLogger()
36+
if err := e.setupOutput(); err != nil {
37+
return err
38+
}
39+
if err := e.setupCompiler(v); err != nil {
40+
return err
41+
}
42+
if err := e.readDotEnvFiles(v); err != nil {
43+
return err
44+
}
45+
46+
if err := e.doVersionChecks(v); err != nil {
47+
return err
48+
}
49+
e.setupDefaults(v)
50+
e.setupConcurrencyState()
51+
52+
return nil
53+
}
54+
55+
func (e *Executor) readTaskfile() error {
56+
var err error
57+
e.Taskfile, err = read.Taskfile(&read.ReaderNode{
58+
Dir: e.Dir,
59+
Entrypoint: e.Entrypoint,
60+
Parent: nil,
61+
Optional: false,
62+
})
63+
return err
64+
}
65+
66+
func (e *Executor) setupTempDir() error {
67+
if e.TempDir != "" {
68+
return nil
69+
}
70+
71+
if os.Getenv("TASK_TEMP_DIR") == "" {
72+
e.TempDir = filepath.Join(e.Dir, ".task")
73+
} else if filepath.IsAbs(os.Getenv("TASK_TEMP_DIR")) || strings.HasPrefix(os.Getenv("TASK_TEMP_DIR"), "~") {
74+
tempDir, err := execext.Expand(os.Getenv("TASK_TEMP_DIR"))
75+
if err != nil {
76+
return err
77+
}
78+
projectDir, _ := filepath.Abs(e.Dir)
79+
projectName := filepath.Base(projectDir)
80+
e.TempDir = filepath.Join(tempDir, projectName)
81+
} else {
82+
e.TempDir = filepath.Join(e.Dir, os.Getenv("TASK_TEMP_DIR"))
83+
}
84+
85+
return nil
86+
}
87+
88+
func (e *Executor) setupStdFiles() {
89+
if e.Stdin == nil {
90+
e.Stdin = os.Stdin
91+
}
92+
if e.Stdout == nil {
93+
e.Stdout = os.Stdout
94+
}
95+
if e.Stderr == nil {
96+
e.Stderr = os.Stderr
97+
}
98+
}
99+
100+
func (e *Executor) setupLogger() {
101+
e.Logger = &logger.Logger{
102+
Stdout: e.Stdout,
103+
Stderr: e.Stderr,
104+
Verbose: e.Verbose,
105+
Color: e.Color,
106+
}
107+
}
108+
109+
func (e *Executor) setupOutput() error {
110+
if !e.OutputStyle.IsSet() {
111+
e.OutputStyle = e.Taskfile.Output
112+
}
113+
114+
var err error
115+
e.Output, err = output.BuildFor(&e.OutputStyle)
116+
return err
117+
}
118+
119+
func (e *Executor) setupCompiler(v float64) error {
120+
if v < 3 {
121+
var err error
122+
e.taskvars, err = read.Taskvars(e.Dir)
123+
if err != nil {
124+
return err
125+
}
126+
127+
e.Compiler = &compilerv2.CompilerV2{
128+
Dir: e.Dir,
129+
Taskvars: e.taskvars,
130+
TaskfileVars: e.Taskfile.Vars,
131+
Expansions: e.Taskfile.Expansions,
132+
Logger: e.Logger,
133+
}
134+
} else {
135+
e.Compiler = &compilerv3.CompilerV3{
136+
Dir: e.Dir,
137+
TaskfileEnv: e.Taskfile.Env,
138+
TaskfileVars: e.Taskfile.Vars,
139+
Logger: e.Logger,
140+
}
141+
}
142+
143+
return nil
144+
}
145+
146+
func (e *Executor) readDotEnvFiles(v float64) error {
147+
if v < 3.0 {
148+
return nil
149+
}
150+
151+
env, err := read.Dotenv(e.Compiler, e.Taskfile, e.Dir)
152+
if err != nil {
153+
return err
154+
}
155+
156+
err = env.Range(func(key string, value taskfile.Var) error {
157+
if _, ok := e.Taskfile.Env.Mapping[key]; !ok {
158+
e.Taskfile.Env.Set(key, value)
159+
}
160+
return nil
161+
})
162+
return err
163+
}
164+
165+
func (e *Executor) setupDefaults(v float64) {
166+
// Color available only on v3
167+
if v < 3 {
168+
e.Logger.Color = false
169+
}
170+
171+
if e.Taskfile.Method == "" {
172+
if v >= 3 {
173+
e.Taskfile.Method = "checksum"
174+
} else {
175+
e.Taskfile.Method = "timestamp"
176+
}
177+
}
178+
179+
if e.Taskfile.Run == "" {
180+
e.Taskfile.Run = "always"
181+
}
182+
}
183+
184+
func (e *Executor) setupConcurrencyState() {
185+
e.executionHashes = make(map[string]context.Context)
186+
187+
e.taskCallCount = make(map[string]*int32, len(e.Taskfile.Tasks))
188+
e.mkdirMutexMap = make(map[string]*sync.Mutex, len(e.Taskfile.Tasks))
189+
for k := range e.Taskfile.Tasks {
190+
e.taskCallCount[k] = new(int32)
191+
e.mkdirMutexMap[k] = &sync.Mutex{}
192+
}
193+
194+
if e.Concurrency > 0 {
195+
e.concurrencySemaphore = make(chan struct{}, e.Concurrency)
196+
}
197+
}
198+
199+
func (e *Executor) doVersionChecks(v float64) error {
200+
if v < 2 {
201+
return fmt.Errorf(`task: Taskfile versions prior to v2 are not supported anymore`)
202+
}
203+
204+
// consider as equal to the greater version if round
205+
if v == 2.0 {
206+
v = 2.6
207+
}
208+
if v == 3.0 {
209+
v = 3.8
210+
}
211+
212+
if v > 3.8 {
213+
return fmt.Errorf(`task: Taskfile versions greater than v3.8 not implemented in the version of Task`)
214+
}
215+
216+
if v < 2.1 && !e.Taskfile.Output.IsSet() {
217+
return fmt.Errorf(`task: Taskfile option "output" is only available starting on Taskfile version v2.1`)
218+
}
219+
if v < 2.2 && e.Taskfile.Includes.Len() > 0 {
220+
return fmt.Errorf(`task: Including Taskfiles is only available starting on Taskfile version v2.2`)
221+
}
222+
if v >= 3.0 && e.Taskfile.Expansions > 2 {
223+
return fmt.Errorf(`task: The "expansions" setting is not available anymore on v3.0`)
224+
}
225+
if v < 3.8 && e.Taskfile.Output.Group.IsSet() {
226+
return fmt.Errorf(`task: Taskfile option "output.group" is only available starting on Taskfile version v3.8`)
227+
}
228+
229+
if v <= 2.1 {
230+
err := errors.New(`task: Taskfile option "ignore_error" is only available starting on Taskfile version v2.1`)
231+
232+
for _, task := range e.Taskfile.Tasks {
233+
if task.IgnoreError {
234+
return err
235+
}
236+
for _, cmd := range task.Cmds {
237+
if cmd.IgnoreError {
238+
return err
239+
}
240+
}
241+
}
242+
}
243+
244+
if v < 2.6 {
245+
for _, task := range e.Taskfile.Tasks {
246+
if len(task.Preconditions) > 0 {
247+
return errors.New(`task: Task option "preconditions" is only available starting on Taskfile version v2.6`)
248+
}
249+
}
250+
}
251+
252+
if v < 3 {
253+
err := e.Taskfile.Includes.Range(func(_ string, taskfile taskfile.IncludedTaskfile) error {
254+
if taskfile.AdvancedImport {
255+
return errors.New(`task: Import with additional parameters is only available starting on Taskfile version v3`)
256+
}
257+
return nil
258+
})
259+
if err != nil {
260+
return err
261+
}
262+
}
263+
264+
if v < 3.7 {
265+
if e.Taskfile.Run != "" {
266+
return errors.New(`task: Setting the "run" type is only available starting on Taskfile version v3.7`)
267+
}
268+
269+
for _, task := range e.Taskfile.Tasks {
270+
if task.Run != "" {
271+
return errors.New(`task: Setting the "run" type is only available starting on Taskfile version v3.7`)
272+
}
273+
}
274+
}
275+
276+
return nil
277+
}

0 commit comments

Comments
 (0)