diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index d4d84b1a..27d04d66 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -85,11 +85,12 @@ (let [task (tasks task-name) depends (:depends task)] (loop [deps (seq depends)] - (let [p @processed - deps (remove #(contains? p %) deps) + (let [deps (remove #(contains? @processed %) deps) order (vec (mapcat #(target-order tasks % processed) deps))] - (vswap! processed conj task-name) - (conj order task-name)))))) + (if-not (contains? @processed task-name) + (do (vswap! processed conj task-name) + (conj order task-name)) + order)))))) (defn assemble-task [task-name] (let [task-name (symbol task-name) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index 537dbc25..2dfa6400 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -41,7 +41,15 @@ (test-utils/with-config {:tasks {'foo (list 'shell {:out out} "echo hello")}} (bb "foo") - (is (= "hello\n" (slurp out)))))) + (is (= "hello\n" (slurp out)))) + (test-utils/with-config {:tasks {'quux (list 'spit out "quux\n") + 'baz (list 'spit out "baz\n" :append true) + 'bar {:depends ['baz] + :task (list 'spit out "bar\n" :append true)} + 'foo {:depends ['quux 'bar 'baz] + :task (list 'spit out "foo\n" :append true)}}} + (bb "foo") + (is (= "quux\nbaz\nbar\nfoo\n" (slurp out)))))) ;; TODO: ;; Do we want to support the same parsing as the clj CLI? diff --git a/test/babashka/impl/tasks_test.clj b/test/babashka/impl/tasks_test.clj new file mode 100644 index 00000000..a53f25b4 --- /dev/null +++ b/test/babashka/impl/tasks_test.clj @@ -0,0 +1,10 @@ +(ns babashka.impl.tasks-test + (:require [babashka.impl.tasks :as sut] + [clojure.test :as t])) + +(t/deftest target-order-test + (t/is (= '[quux bar foo] + (sut/target-order + {'foo {:depends ['bar 'quux]} + 'bar {:depends ['quux]}} + 'foo))))