Tasks: detect cycles
This commit is contained in:
parent
fb3d24b23c
commit
12c29eb308
2 changed files with 17 additions and 3 deletions
|
|
@ -225,13 +225,15 @@
|
||||||
prog))
|
prog))
|
||||||
|
|
||||||
(defn target-order
|
(defn target-order
|
||||||
([tasks task-name] (target-order tasks task-name (volatile! #{})))
|
([tasks task-name] (target-order tasks task-name (volatile! #{}) #{}))
|
||||||
([tasks task-name processed]
|
([tasks task-name processed processing]
|
||||||
(let [task (tasks task-name)
|
(let [task (tasks task-name)
|
||||||
depends (:depends task)]
|
depends (:depends task)]
|
||||||
|
(when (contains? processing task-name)
|
||||||
|
(throw (Exception. (str "Cyclic task: " task-name))))
|
||||||
(loop [deps (seq depends)]
|
(loop [deps (seq depends)]
|
||||||
(let [deps (remove #(contains? @processed %) deps)
|
(let [deps (remove #(contains? @processed %) deps)
|
||||||
order (vec (mapcat #(target-order tasks % processed) deps))]
|
order (vec (mapcat #(target-order tasks % processed (conj processing task-name)) deps))]
|
||||||
(if-not (contains? @processed task-name)
|
(if-not (contains? @processed task-name)
|
||||||
(do (vswap! processed conj task-name)
|
(do (vswap! processed conj task-name)
|
||||||
(conj order task-name))
|
(conj order task-name))
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,18 @@
|
||||||
:task (+ a 4 5 6)}}}
|
:task (+ a 4 5 6)}}}
|
||||||
(is (thrown-with-msg?
|
(is (thrown-with-msg?
|
||||||
Exception #"No such task: x"
|
Exception #"No such task: x"
|
||||||
|
(bb "run" "b")))))
|
||||||
|
(testing "cyclic task"
|
||||||
|
(test-utils/with-config '{:tasks {b {:depends [b]
|
||||||
|
:task (+ a 4 5 6)}}}
|
||||||
|
(is (thrown-with-msg?
|
||||||
|
Exception #"Cyclic task: b"
|
||||||
|
(bb "run" "b"))))
|
||||||
|
(test-utils/with-config '{:tasks {c {:depends [b]}
|
||||||
|
b {:depends [c]
|
||||||
|
:task (+ a 4 5 6)}}}
|
||||||
|
(is (thrown-with-msg?
|
||||||
|
Exception #"Cyclic task: b"
|
||||||
(bb "run" "b"))))))
|
(bb "run" "b"))))))
|
||||||
|
|
||||||
(deftest list-tasks-test
|
(deftest list-tasks-test
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue