Make exec a function instead

This commit is contained in:
Michiel Borkent 2022-07-29 21:03:07 +02:00
parent 2a01f8720e
commit 0608c71687
3 changed files with 22 additions and 25 deletions

View file

@ -8,18 +8,21 @@
(def cli-namespace (def cli-namespace
(sci/copy-ns babashka.cli cns)) (sci/copy-ns babashka.cli cns))
(defn exec-fn-snippet [ns var-name] (defn exec-fn-snippet [sym]
(format " (format "
(do (do
(require '%1$s)
(require '[babashka.cli]) (require '[babashka.cli])
(let [ (let [var (requiring-resolve `%1$s)
ns-meta (meta (find-ns '%1$s)) var-meta (meta var)
var-meta (meta (resolve '%1$s/%2$s)) ns (:ns (meta var))
cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta) (:org.babashka/cli var-meta)) ns-meta (meta ns)
opts (babashka.cli/parse-opts *command-line-args* cli-opts) ct (babashka.tasks/current-task)
task-exec-args (:exec-args (babashka.tasks/current-task)) cli-opts (babashka.cli/merge-opts (:org.babashka/cli ns-meta)
cli-exec-args (:exec-args cli-opts) (:org.babashka/cli var-meta)
opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)] (:org.babashka/cli ct))
(%1$s/%2$s opts)))" opts (babashka.cli/parse-opts *command-line-args* cli-opts)
ns var-name)) task-exec-args (:exec-args ct)
cli-exec-args (:exec-args cli-opts)
opts (babashka.cli/merge-opts cli-exec-args task-exec-args opts)]
(var opts)))"
sym))

View file

@ -268,7 +268,7 @@
(intern *ns* 'run babashka.tasks/run)) (intern *ns* 'run babashka.tasks/run))
(when-not (resolve 'exec) (when-not (resolve 'exec)
(intern *ns* (with-meta 'exec {:macro true}) @(var babashka.tasks/exec))) (intern *ns* 'exec @(var babashka.tasks/exec)))
%s %s
%s %s
@ -457,14 +457,10 @@
(let [[[expr]] (assemble-task task parallel)] (let [[[expr]] (assemble-task task parallel)]
(sci/eval-string* @ctx expr)))) (sci/eval-string* @ctx expr))))
(defn ^:macro exec (defn exec
"This is a macro so it works correctly with :init" ([sym]
([_ _ sym] (let [snippet (cli/exec-fn-snippet sym)]
(let [ns (namespace sym) (sci/eval-string* @ctx snippet))))
ns (or ns (symbol (str @sci/ns)))
var-name (name sym)
snippet (cli/exec-fn-snippet ns var-name)]
`(load-string ~snippet))))
(def tasks-namespace (def tasks-namespace
{'shell (sci/copy-var shell sci-ns) {'shell (sci/copy-var shell sci-ns)

View file

@ -874,10 +874,8 @@ Use bb run --help to show this help output.
[[(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])
exec-fn exec-fn
(let [sym (symbol exec-fn) (let [sym (symbol exec-fn)]
ns (namespace sym) [[(cli/exec-fn-snippet sym)] nil])
var-name (name sym)]
[[(cli/exec-fn-snippet ns var-name)] nil])
run (if (:run-help cli-opts) run (if (:run-help cli-opts)
[(print-run-help) 0] [(print-run-help) 0]
(do (do