Skip to content

Commit 5e39be1

Browse files
committed
re-fix deftask option parsing bug that wasn't really fixed
1 parent 960089f commit 5e39be1

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

boot/core/src/boot/cli.clj

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,14 @@
133133
(let [cli-args (mapv (partial apply argspec->cli-argspec) argspecs)]
134134
(:summary (cli/parse-opts [] cli-args))))
135135

136+
(defn split-args [args]
137+
(loop [kw {} cli [] [arg & more] args]
138+
(if-not arg
139+
{:kw kw :cli cli}
140+
(if-not (keyword? arg)
141+
(recur kw (conj cli arg) more)
142+
(recur (assoc kw arg (first more)) cli (rest more))))))
143+
136144
(defmacro clifn [doc argspecs & body]
137145
(assert (string? doc) "missing docstring")
138146
(let [doc (string/replace doc #"\n " "\n")
@@ -146,10 +154,10 @@
146154
varmeta {:doc clj-doc :arglists arglists :argspec cli-args}]
147155
`(->
148156
(fn [& args#]
149-
(let [cli?# (every? string? args#)
150-
parsed# (when cli?# (cli/parse-opts args# ~cli-args))
151-
~bindings (if-not cli?# args# (:options parsed#))
152-
~'*args* (when cli?# (:arguments parsed#))]
157+
(let [{kws# :kw clis# :cli} (split-args args#)
158+
parsed# (cli/parse-opts clis# ~cli-args)
159+
~bindings (merge kws# (:options parsed#))
160+
~'*args* (:arguments parsed#)]
153161
~@(mapv (partial apply argspec->assert) argspecs)
154162
(if-not ~'help (do ~@body) (print ~cli-doc))))
155163
(with-meta ~varmeta))))

boot/core/src/boot/core.clj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,11 +261,10 @@
261261
(when-not (and op (:boot.core/task (meta op)))
262262
(throw (IllegalArgumentException. (format "No such task (%s)" op-str))))
263263
(let [spec (:argspec (meta op))
264-
parsed (cli/parse-opts args spec :in-order true)
265-
opts (->> parsed :options (mapcat identity))]
264+
parsed (cli/parse-opts args spec :in-order true)]
266265
(when (seq (:errors parsed))
267266
(throw (IllegalArgumentException. (string/join "\n" (:errors parsed)))))
268-
(recur (conj ret (apply (var-get op) opts)) (:arguments parsed)))))))
267+
(recur (conj ret (apply (var-get op) args)) (:arguments parsed)))))))
269268

270269
(def ^:dynamic *warnings* nil)
271270

0 commit comments

Comments
 (0)