mirror of
https://github.com/go-task/task.git
synced 2026-06-15 11:51:41 +00:00
35 lines
761 B
Go
35 lines
761 B
Go
package task
|
|
|
|
// CheckCyclicDep checks if a task tree has any cyclic dependency
|
|
func (e *Executor) CheckCyclicDep() error {
|
|
visits := make(map[string]struct{}, len(e.Tasks))
|
|
|
|
var checkCyclicDep func(string, *Task) error
|
|
checkCyclicDep = func(name string, t *Task) error {
|
|
if _, ok := visits[name]; ok {
|
|
return ErrCyclicDepDetected
|
|
}
|
|
visits[name] = struct{}{}
|
|
defer delete(visits, name)
|
|
|
|
for _, d := range t.Deps {
|
|
// FIXME: ignoring by now. should return an error instead?
|
|
task, ok := e.Tasks[d.Task]
|
|
if !ok {
|
|
continue
|
|
}
|
|
if err := checkCyclicDep(d.Task, task); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
for k, v := range e.Tasks {
|
|
if err := checkCyclicDep(k, v); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|