diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index bf249f75..41bcab09 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -66,10 +66,15 @@ (format "(when %s %s)" (second when-expr) expr) expr)) -(defn wrap-def [task-name prog last?] - (format "(def %s (future %s)) %s" - task-name prog - (if last? +(defn wrap-future [prog parallel?] + (if parallel? + (format "(future %s)" prog) + 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) task-name))) @@ -81,14 +86,14 @@ (defn assemble-task-1 "Assembles task, does not process :depends." - ([task-name task] - (assemble-task-1 task-name task nil nil)) - ([task-name task last?] (assemble-task-1 task-name task last? nil)) - ([task-name task last? depends] + ([task-name task parallel?] + (assemble-task-1 task-name task parallel? nil nil)) + ([task-name task parallel? last?] (assemble-task-1 task-name task parallel? last? nil)) + ([task-name task parallel? last? depends] (cond (qualified-symbol? task) (let [prog (format "(apply %s *command-line-args*)" task) prog (wrap-depends prog depends) - prog (wrap-def task-name prog last?) + prog (wrap-def task-name prog parallel? last?) prog (format " (do (require (quote %s)) %s)" @@ -97,9 +102,9 @@ prog) (map? 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)] - (wrap-def task-name prog last?))))) + (wrap-def task-name prog parallel? last?))))) (defn format-task [init prog] (format " @@ -122,7 +127,7 @@ (conj order task-name)) order)))))) -(defn assemble-task [task-name] +(defn assemble-task [task-name parallel?] (let [task-name (symbol task-name) tasks (get @bb-edn :tasks) task (get tasks task-name)] @@ -137,7 +142,7 @@ targets (next targets)] (if targets (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) [(binding [*out* *err*] (println "No such task:" task-name)) 1]) @@ -145,11 +150,11 @@ (let [prog (str prog "\n" (apply str (map deref-task depends)) "\n" - (assemble-task-1 t task true))] + (assemble-task-1 t task parallel? 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 true))] nil])] + [[(format-task init (assemble-task-1 task-name task parallel? true))] nil])] (when (= "true" (System/getenv "BABASHKA_DEV")) (println (ffirst prog))) prog) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 14d44998..fa9828fc 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -88,6 +88,7 @@ "help" "doc" "tasks" + "run" "uberjar" "uberscript" "repl" @@ -403,6 +404,17 @@ When no eval opts or subcommand is provided, the implicit subcommand is repl.") (defn shell-seq [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] (let [opt (first options) 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) (if (str/ends-with? opt ".jar") {:jar opt - :command-line-args (rest options)} + :command-line-args (next options)} {:file opt - :command-line-args (rest options)}) + :command-line-args (next options)}) (command? opt) (recur (cons (str "--" opt) (next options))) :else @@ -529,9 +541,7 @@ When no eval opts or subcommand is provided, the implicit subcommand is repl.") (recur (next options) (assoc opts-map :main (first options)))) ("--run") - (let [options (next options)] - (recur (next options) - (assoc opts-map :run (first options)))) + (parse-run-opts opts-map (next options)) ("--tasks") (assoc opts-map :list-tasks true :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 {})) -(defn exec [opts] +(defn exec [cli-opts] (binding [*unrestricted* true] (sci/binding [core/warn-on-reflection @core/warn-on-reflection 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? :jar :uberjar :clojure :doc :run :list-tasks]} - opts + cli-opts _ (when verbose? (vreset! common/verbose? true)) _ (do ;; set properties (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")] [[(format "(ns user (:require [%1$s])) (apply %1$s/%2$s *command-line-args*)" ns var-name)] nil]) - run (tasks/assemble-task run) + run (tasks/assemble-task run (:parallel-tasks cli-opts)) file (try [[(read-file file)] nil] (catch Exception e (error-handler e {:expression expressions