diff --git a/deps.edn b/deps.edn index d999f8e..69748b2 100644 --- a/deps.edn +++ b/deps.edn @@ -2,7 +2,7 @@ :deps {org.clojure/clojure {:mvn/version "1.10.3"} - org.clojure/tools.deps.alpha {:mvn/version "0.11.905"} + org.clojure/tools.deps.alpha {:mvn/version "0.11.923-SNAPSHOT"} ;org.clojure/tools.deps.alpha {:git/url "https://github.com/clojure/tools.deps.alpha.git" :sha "6bd58578605212ce2ffec4ad666492d76ff8ef65"} org.clojure/tools.namespace {:mvn/version "1.0.0"} org.slf4j/slf4j-nop {:mvn/version "1.7.25"} diff --git a/src/main/clojure/clojure/tools/build/api.clj b/src/main/clojure/clojure/tools/build/api.clj index 770476a..fc7cd3c 100644 --- a/src/main/clojure/clojure/tools/build/api.clj +++ b/src/main/clojure/clojure/tools/build/api.clj @@ -3,7 +3,8 @@ [clojure.java.io :as jio] [clojure.set :as set] [clojure.string :as str] - [clojure.tools.build.util.file :as file]) + [clojure.tools.build.util.file :as file] + [clojure.tools.cli.help :as cli]) (:import [java.io File])) @@ -242,3 +243,53 @@ (assert-required "install" params [:basis :lib :version :jar-file :class-dir]) ((requiring-resolve 'clojure.tools.build.tasks.install/install) params)) +(defn qualify-fn-symbols [syms] + (let [ns-defs (cli/garner-ns-defaults) + ns-default (:ns-default ns-defs) + ns-aliases (:ns-aliases ns-defs)] + (if (or ns-default ns-aliases) + (vec + (map #(-> % + (cli/qualify-fn ns-aliases ns-default) + requiring-resolve) + syms)) + syms))) + +;; deflinked + +(defmacro deflinked + "Defines a named, linked set of tasks that can short-circuit execution at + a specific task specified via a :to parameter. Tasks comprising the chain + are execute as if by ->." + [nom targets] + `(defn ~nom [params#] + (let [[to#] (when-let [t# (:to params#)] (qualify-fn-symbols [t#]))] + (loop [p# params# + remaining# ~(qualify-fn-symbols targets)] + (let [target# (first remaining#)] + (if target# + (let [nextp# (target# p#)] + (if (and to# (= to# target#)) + nextp# + (recur nextp# (rest remaining#)))) + p#)))))) + +(comment + (defn a [p] (println "A") p) + (defn b [p] (println "B") p) + (defn c [p] (println "C") p) + + (macroexpand-1 '(deflinked abclink [a b c])) + + (defn abclink [params] + (let [[to] (when-let [t (:to params)] (clojure.tools.build.api/qualify-fn-symbols [t]))] + (loop [parms params + remaining-tasks [build/a build/b build/c]] + (let [task (first remaining-tasks)] + (if task + (let [ret (task parms)] + (if (and to (= to task)) + ret + (recur ret (rest remaining-tasks)))) + parms))))) +)