Files
go-task/cyclic.go
2017-07-08 10:25:15 -03:00

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
}