mirror of
https://github.com/go-task/task.git
synced 2024-12-14 10:52:43 +02:00
29 lines
509 B
Go
29 lines
509 B
Go
|
package task
|
||
|
|
||
|
func HasCyclicDep(m map[string]*Task) bool {
|
||
|
visits := make(map[string]struct{}, len(m))
|
||
|
|
||
|
var checkCyclicDep func(string, *Task) bool
|
||
|
checkCyclicDep = func(name string, t *Task) bool {
|
||
|
if _, ok := visits[name]; ok {
|
||
|
return false
|
||
|
}
|
||
|
visits[name] = struct{}{}
|
||
|
defer delete(visits, name)
|
||
|
|
||
|
for _, d := range t.Deps {
|
||
|
if !checkCyclicDep(d, m[d]) {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
for k, v := range m {
|
||
|
if !checkCyclicDep(k, v) {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|