|
1 | 1 | package task |
2 | 2 |
|
3 | | -// HasCyclicDep checks if a task tree has any cyclic dependency |
4 | | -func (e *Executor) HasCyclicDep() bool { |
| 3 | +// CheckCyclicDep checks if a task tree has any cyclic dependency |
| 4 | +func (e *Executor) CheckCyclicDep() error { |
5 | 5 | visits := make(map[string]struct{}, len(e.Tasks)) |
6 | 6 |
|
7 | | - var checkCyclicDep func(string, *Task) bool |
8 | | - checkCyclicDep = func(name string, t *Task) bool { |
| 7 | + var checkCyclicDep func(string, *Task) error |
| 8 | + checkCyclicDep = func(name string, t *Task) error { |
9 | 9 | if _, ok := visits[name]; ok { |
10 | | - return false |
| 10 | + return ErrCyclicDepDetected |
11 | 11 | } |
12 | 12 | visits[name] = struct{}{} |
13 | 13 | defer delete(visits, name) |
14 | 14 |
|
15 | 15 | for _, d := range t.Deps { |
16 | | - if !checkCyclicDep(d.Task, e.Tasks[d.Task]) { |
17 | | - return false |
| 16 | + // FIXME: ignoring by now. should return an error instead? |
| 17 | + task, ok := e.Tasks[d.Task] |
| 18 | + if !ok { |
| 19 | + continue |
| 20 | + } |
| 21 | + if err := checkCyclicDep(d.Task, task); err != nil { |
| 22 | + return err |
18 | 23 | } |
19 | 24 | } |
20 | | - return true |
| 25 | + return nil |
21 | 26 | } |
22 | 27 |
|
23 | 28 | for k, v := range e.Tasks { |
24 | | - if !checkCyclicDep(k, v) { |
25 | | - return true |
| 29 | + if err := checkCyclicDep(k, v); err != nil { |
| 30 | + return err |
26 | 31 | } |
27 | 32 | } |
28 | | - return false |
| 33 | + return nil |
29 | 34 | } |
0 commit comments