bb tasks: support parallel via future

This commit is contained in:
Michiel Borkent 2021-04-11 21:25:15 +02:00
parent ed17a190d2
commit 2b2e602eac

View file

@ -45,9 +45,16 @@
:out :inherit :out :inherit
:err :inherit} opts))))) :err :inherit} opts)))))
(defn -wait [res]
(when res
(if (future? res)
@res
res)))
(def tasks-namespace (def tasks-namespace
{'shell (sci/copy-var shell sci-ns) {'shell (sci/copy-var shell sci-ns)
'clojure (sci/copy-var clojure sci-ns)}) 'clojure (sci/copy-var clojure sci-ns)
'-wait (sci/copy-var -wait sci-ns)})
(defn depends-map [tasks target-name] (defn depends-map [tasks target-name]
(let [deps (seq (:depends (get tasks target-name))) (let [deps (seq (:depends (get tasks target-name)))
@ -59,19 +66,30 @@
(format "(when %s %s)" (second when-expr) expr) (format "(when %s %s)" (second when-expr) expr)
expr)) expr))
(defn wrap-def [task-name prog last?]
(format "(def %s %s) %s"
task-name prog
(if last?
(format "(babashka.tasks/-wait %s)" task-name)
task-name)))
(defn assemble-task-1 (defn assemble-task-1
"Assembles task, does not process :depends." "Assembles task, does not process :depends."
[task] ([task-name task] (assemble-task-1 task-name task nil))
(cond (qualified-symbol? task) ([task-name task last?]
(format " (cond (qualified-symbol? task)
(let [prog (format "(apply %s *command-line-args*)" task)
prog (wrap-def task-name prog last?)
prog (format "
(do (require (quote %s)) (do (require (quote %s))
(apply %s *command-line-args*))" %s)"
(namespace task) (namespace task)
task) prog)]
(map? task) prog)
(let [task (:task task)] (map? task)
(assemble-task-1 task)) (let [task (:task task)]
:else task)) (assemble-task-1 task-name task last?))
:else (wrap-def task-name task last?))))
(defn format-task [init prog] (defn format-task [init prog]
(format " (format "
@ -94,6 +112,9 @@
(conj order task-name)) (conj order task-name))
order)))))) order))))))
(defn deref-task [dep]
(format "(babashka.tasks/-wait %s)" dep))
(defn assemble-task [task-name] (defn assemble-task [task-name]
(let [task-name (symbol task-name) (let [task-name (symbol task-name)
tasks (get @bb-edn :tasks) tasks (get @bb-edn :tasks)
@ -101,18 +122,27 @@
(if task (if task
(let [m? (map? task) (let [m? (map? task)
init (and m? (get tasks :init)) init (and m? (get tasks :init))
prog (if (and m? (:depends task)) prog (if-let [depends (when m? (:depends task))]
(let [targets (target-order tasks task-name)] (let [targets (target-order tasks task-name)]
(loop [prog "" (loop [prog ""
targets (seq targets)] targets (seq targets)]
(if-let [t (first targets)] (let [t (first targets)
(if-let [task (get tasks t)] targets (next targets)]
(recur (str prog "\n" (assemble-task-1 task)) (if targets
(next targets)) (if-let [task (get tasks t)]
[(binding [*out* *err*] (recur (str prog "\n" (assemble-task-1 t task))
(println "No such task:" task-name)) 1]) targets)
[[(format-task init prog)] nil]))) [(binding [*out* *err*]
[[(format-task init (assemble-task-1 task))] nil])] (println "No such task:" task-name)) 1])
(if-let [task (get tasks t)]
(let [prog (str prog "\n"
(apply str (map deref-task depends))
"\n"
(assemble-task-1 t task true))]
[[(format-task init prog)] nil])
[(binding [*out* *err*]
(println "No such task:" task-name)) 1])))))
[[(format-task init (assemble-task-1 task-name task))] nil])]
prog) prog)
[(binding [*out* *err*] [(binding [*out* *err*]
(println "No such task:" task-name)) 1]))) (println "No such task:" task-name)) 1])))