This commit is contained in:
Michiel Borkent 2021-04-12 00:02:52 +02:00
parent f18ec3feeb
commit ac307708ba
2 changed files with 38 additions and 23 deletions

View file

@ -66,10 +66,15 @@
(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?] (defn wrap-future [prog parallel?]
(format "(def %s (future %s)) %s" (if parallel?
task-name prog (format "(future %s)" prog)
(if last? prog))
(defn wrap-def [task-name prog parallel? last?]
(format "(def %s %s) %s"
task-name (wrap-future prog parallel?)
(if (and parallel? last?)
(format "(babashka.tasks/-wait %s)" task-name) (format "(babashka.tasks/-wait %s)" task-name)
task-name))) task-name)))
@ -81,14 +86,14 @@
(defn assemble-task-1 (defn assemble-task-1
"Assembles task, does not process :depends." "Assembles task, does not process :depends."
([task-name task] ([task-name task parallel?]
(assemble-task-1 task-name task nil nil)) (assemble-task-1 task-name task parallel? nil nil))
([task-name task last?] (assemble-task-1 task-name task last? nil)) ([task-name task parallel? last?] (assemble-task-1 task-name task parallel? last? nil))
([task-name task last? depends] ([task-name task parallel? last? depends]
(cond (qualified-symbol? task) (cond (qualified-symbol? task)
(let [prog (format "(apply %s *command-line-args*)" task) (let [prog (format "(apply %s *command-line-args*)" task)
prog (wrap-depends prog depends) prog (wrap-depends prog depends)
prog (wrap-def task-name prog last?) prog (wrap-def task-name prog parallel? last?)
prog (format " prog (format "
(do (require (quote %s)) (do (require (quote %s))
%s)" %s)"
@ -97,9 +102,9 @@
prog) prog)
(map? task) (map? task)
(let [t (:task task)] (let [t (:task task)]
(assemble-task-1 task-name t last? (:depends task))) (assemble-task-1 task-name t parallel? last? (:depends task)))
:else (let [prog (wrap-depends task depends)] :else (let [prog (wrap-depends task depends)]
(wrap-def task-name prog last?))))) (wrap-def task-name prog parallel? last?)))))
(defn format-task [init prog] (defn format-task [init prog]
(format " (format "
@ -122,7 +127,7 @@
(conj order task-name)) (conj order task-name))
order)))))) order))))))
(defn assemble-task [task-name] (defn assemble-task [task-name parallel?]
(let [task-name (symbol task-name) (let [task-name (symbol task-name)
tasks (get @bb-edn :tasks) tasks (get @bb-edn :tasks)
task (get tasks task-name)] task (get tasks task-name)]
@ -137,7 +142,7 @@
targets (next targets)] targets (next targets)]
(if targets (if targets
(if-let [task (get tasks t)] (if-let [task (get tasks t)]
(recur (str prog "\n" (assemble-task-1 t task)) (recur (str prog "\n" (assemble-task-1 t task parallel?))
targets) targets)
[(binding [*out* *err*] [(binding [*out* *err*]
(println "No such task:" task-name)) 1]) (println "No such task:" task-name)) 1])
@ -145,11 +150,11 @@
(let [prog (str prog "\n" (let [prog (str prog "\n"
(apply str (map deref-task depends)) (apply str (map deref-task depends))
"\n" "\n"
(assemble-task-1 t task true))] (assemble-task-1 t task parallel? true))]
[[(format-task init prog)] nil]) [[(format-task init prog)] nil])
[(binding [*out* *err*] [(binding [*out* *err*]
(println "No such task:" task-name)) 1]))))) (println "No such task:" task-name)) 1])))))
[[(format-task init (assemble-task-1 task-name task true))] nil])] [[(format-task init (assemble-task-1 task-name task parallel? true))] nil])]
(when (= "true" (System/getenv "BABASHKA_DEV")) (when (= "true" (System/getenv "BABASHKA_DEV"))
(println (ffirst prog))) (println (ffirst prog)))
prog) prog)

View file

@ -88,6 +88,7 @@
"help" "help"
"doc" "doc"
"tasks" "tasks"
"run"
"uberjar" "uberjar"
"uberscript" "uberscript"
"repl" "repl"
@ -403,6 +404,17 @@ When no eval opts or subcommand is provided, the implicit subcommand is repl.")
(defn shell-seq [in] (defn shell-seq [in]
(line-seq (java.io.BufferedReader. in))) (line-seq (java.io.BufferedReader. in)))
(defn parse-run-opts [opts-map args]
(loop [opts-map opts-map
args (seq args)]
(if args
(let [fst (first args)]
(if (= "--parallel" fst)
(recur (assoc opts-map :parallel-tasks true)
(next args))
(assoc opts-map :run fst :command-line-args (next args))))
opts-map)))
(defn parse-opts [options] (defn parse-opts [options]
(let [opt (first options) (let [opt (first options)
tasks (into #{} (map str) (keys (:tasks @common/bb-edn)))] tasks (into #{} (map str) (keys (:tasks @common/bb-edn)))]
@ -413,9 +425,9 @@ When no eval opts or subcommand is provided, the implicit subcommand is repl.")
(fs/regular-file? opt) (fs/regular-file? opt)
(if (str/ends-with? opt ".jar") (if (str/ends-with? opt ".jar")
{:jar opt {:jar opt
:command-line-args (rest options)} :command-line-args (next options)}
{:file opt {:file opt
:command-line-args (rest options)}) :command-line-args (next options)})
(command? opt) (command? opt)
(recur (cons (str "--" opt) (next options))) (recur (cons (str "--" opt) (next options)))
:else :else
@ -529,9 +541,7 @@ When no eval opts or subcommand is provided, the implicit subcommand is repl.")
(recur (next options) (recur (next options)
(assoc opts-map :main (first options)))) (assoc opts-map :main (first options))))
("--run") ("--run")
(let [options (next options)] (parse-run-opts opts-map (next options))
(recur (next options)
(assoc opts-map :run (first options))))
("--tasks") ("--tasks")
(assoc opts-map :list-tasks true (assoc opts-map :list-tasks true
:command-line-args (next options)) :command-line-args (next options))
@ -556,7 +566,7 @@ When no eval opts or subcommand is provided, the implicit subcommand is repl.")
(def env (atom {})) (def env (atom {}))
(defn exec [opts] (defn exec [cli-opts]
(binding [*unrestricted* true] (binding [*unrestricted* true]
(sci/binding [core/warn-on-reflection @core/warn-on-reflection (sci/binding [core/warn-on-reflection @core/warn-on-reflection
core/data-readers @core/data-readers core/data-readers @core/data-readers
@ -570,7 +580,7 @@ When no eval opts or subcommand is provided, the implicit subcommand is repl.")
:main :uberscript :describe? :main :uberscript :describe?
:jar :uberjar :clojure :jar :uberjar :clojure
:doc :run :list-tasks]} :doc :run :list-tasks]}
opts cli-opts
_ (when verbose? (vreset! common/verbose? true)) _ (when verbose? (vreset! common/verbose? true))
_ (do ;; set properties _ (do ;; set properties
(when main (System/setProperty "babashka.main" main)) (when main (System/setProperty "babashka.main" main))
@ -658,7 +668,7 @@ When no eval opts or subcommand is provided, the implicit subcommand is repl.")
"-main")] "-main")]
[[(format "(ns user (:require [%1$s])) (apply %1$s/%2$s *command-line-args*)" [[(format "(ns user (:require [%1$s])) (apply %1$s/%2$s *command-line-args*)"
ns var-name)] nil]) ns var-name)] nil])
run (tasks/assemble-task run) run (tasks/assemble-task run (:parallel-tasks cli-opts))
file (try [[(read-file file)] nil] file (try [[(read-file file)] nil]
(catch Exception e (catch Exception e
(error-handler e {:expression expressions (error-handler e {:expression expressions