|
11 | 11 | [clojure.java.io :as jio] |
12 | 12 | [clojure.set :as set] |
13 | 13 | [clojure.string :as str] |
| 14 | + [clojure.tools.deps.edn :as depsedn] |
14 | 15 | [clojure.tools.deps.util.concurrent :as concurrent] |
15 | 16 | [clojure.tools.deps.util.dir :as dir] |
16 | 17 | [clojure.tools.deps.util.io :as io] |
17 | 18 | [clojure.tools.deps.util.session :as session] |
18 | | - [clojure.tools.deps.extensions :as ext] |
19 | | - [clojure.tools.deps.specs :as specs] |
20 | | - [clojure.walk :as walk]) |
| 19 | + [clojure.tools.deps.extensions :as ext]) |
21 | 20 | (:import |
22 | | - [clojure.lang EdnReader$ReaderException] |
23 | 21 | [clojure.lang PersistentQueue] |
24 | | - [java.io File InputStreamReader BufferedReader] |
| 22 | + [java.io File] |
25 | 23 | [java.lang ProcessBuilder ProcessBuilder$Redirect] |
26 | 24 | [java.util List] |
27 | 25 | [java.util.concurrent ConcurrentHashMap ExecutorService])) |
28 | 26 |
|
29 | 27 | ;(set! *warn-on-reflection* true) |
30 | 28 |
|
31 | | -;;;; deps.edn reading |
32 | | - |
33 | | -(defn- io-err |
34 | | - ^Throwable [fmt ^File f] |
35 | | - (let [path (.getAbsolutePath f)] |
36 | | - (ex-info (format fmt path) {:path path}))) |
37 | | - |
38 | | -(defn- slurp-edn-map |
39 | | - "Read the file specified by the path-segments, slurp it, and read it as edn." |
40 | | - [^File f] |
41 | | - (let [val (try (io/slurp-edn f) |
42 | | - (catch EdnReader$ReaderException e (throw (io-err (str (.getMessage e) " (%s)") f))) |
43 | | - (catch RuntimeException t |
44 | | - (if (str/starts-with? (.getMessage t) "EOF while reading") |
45 | | - (throw (io-err "Error reading edn, delimiter unmatched (%s)" f)) |
46 | | - (throw (io-err (str "Error reading edn. " (.getMessage t) " (%s)") f)))))] |
47 | | - (if (specs/valid-deps? val) |
48 | | - val |
49 | | - (throw (io-err (str "Error reading deps %s. " (specs/explain-deps val)) f))))) |
50 | | - |
51 | | -;; all this canonicalization is deprecated and will eventually be removed |
52 | | - |
53 | | -(defn- canonicalize-sym |
54 | | - ([s] |
55 | | - (canonicalize-sym s nil)) |
56 | | - ([s file-name] |
57 | | - (if (simple-symbol? s) |
58 | | - (let [cs (as-> (name s) n (symbol n n))] |
59 | | - (io/printerrln "DEPRECATED: Libs must be qualified, change" s "=>" cs |
60 | | - (if file-name (str "(" file-name ")") "")) |
61 | | - cs) |
62 | | - s))) |
63 | | - |
64 | | -(defn- canonicalize-exclusions |
65 | | - [{:keys [exclusions] :as coord} file-name] |
66 | | - (if (seq (filter simple-symbol? exclusions)) |
67 | | - (assoc coord :exclusions (mapv #(canonicalize-sym % file-name) exclusions)) |
68 | | - coord)) |
69 | | - |
70 | | -(defn- canonicalize-dep-map |
71 | | - [deps-map file-name] |
72 | | - (when deps-map |
73 | | - (reduce-kv (fn [acc lib coord] |
74 | | - (let [new-lib (if (simple-symbol? lib) (canonicalize-sym lib file-name) lib) |
75 | | - new-coord (canonicalize-exclusions coord file-name)] |
76 | | - (assoc acc new-lib new-coord))) |
77 | | - {} deps-map))) |
78 | | - |
79 | | -(defn- canonicalize-all-syms |
80 | | - ([deps-edn] |
81 | | - (canonicalize-all-syms deps-edn nil)) |
82 | | - ([deps-edn file-name] |
83 | | - (walk/postwalk |
84 | | - (fn [x] |
85 | | - (if (map? x) |
86 | | - (reduce (fn [xr k] |
87 | | - (if-let [xm (get xr k)] |
88 | | - (assoc xr k (canonicalize-dep-map xm file-name)) |
89 | | - xr)) |
90 | | - x #{:deps :default-deps :override-deps :extra-deps :classpath-overrides}) |
91 | | - x)) |
92 | | - deps-edn))) |
| 29 | +;;;; deps.edn reading - moved to clojure.tools.deps.edn |
93 | 30 |
|
94 | 31 | (defn slurp-deps |
95 | | - "Read a single deps.edn file from disk and canonicalize symbols, |
96 | | - return a deps map. If the file doesn't exist, returns nil." |
| 32 | + "DEPRECATED: use clojure.tools.deps.edn/read-deps" |
| 33 | + {:deprecated "1.0"} |
97 | 34 | [^File dep-file] |
98 | | - (when (.exists dep-file) |
99 | | - (-> dep-file slurp-edn-map (canonicalize-all-syms (.getPath dep-file))))) |
| 35 | + (depsedn/read-deps dep-file)) |
100 | 36 |
|
101 | 37 | (defn root-deps |
102 | | - "Read the root deps.edn resource from the classpath at the path |
103 | | - clojure/tools/deps/deps.edn" |
| 38 | + "DEPRECATED: Use clojure.tools.deps.edn/root-deps" |
| 39 | + {:deprecated "1.0"} |
104 | 40 | [] |
105 | | - (let [url (jio/resource "clojure/tools/deps/deps.edn")] |
106 | | - (io/read-edn (BufferedReader. (InputStreamReader. (.openStream url)))))) |
| 41 | + (depsedn/root-deps)) |
107 | 42 |
|
108 | 43 | (defn user-deps-path |
109 | | - "Use the same logic as clj to calculate the location of the user deps.edn. |
110 | | - Note that it's possible no file may exist at this location." |
| 44 | + "DEPRECATED: Use clojure.tools.deps.edn/user-deps-path" |
| 45 | + {:deprecated "1.0"} |
111 | 46 | [] |
112 | | - (let [config-env (System/getenv "CLJ_CONFIG") |
113 | | - xdg-env (System/getenv "XDG_CONFIG_HOME") |
114 | | - home (System/getProperty "user.home") |
115 | | - config-dir (cond config-env config-env |
116 | | - xdg-env (str xdg-env File/separator "clojure") |
117 | | - :else (str home File/separator ".clojure"))] |
118 | | - (str config-dir File/separator "deps.edn"))) |
| 47 | + (depsedn/user-deps-path)) |
119 | 48 |
|
120 | 49 | (defn find-edn-maps |
121 | | - "Finds and returns standard deps edn maps in a map with keys |
122 | | - :root-edn, :user-edn, :project-edn |
123 | | - If no project-edn is supplied, use the deps.edn in current directory" |
| 50 | + "DEPRECATED: Use clojure.tools.deps.edn/create-edn-maps (note api differs)" |
| 51 | + {:deprecated "1.0"} |
124 | 52 | ([] |
125 | 53 | (find-edn-maps nil)) |
126 | 54 | ([project-edn-file] |
127 | | - (let [user-loc (jio/file (user-deps-path)) |
128 | | - project-loc (jio/file (if project-edn-file project-edn-file (str dir/*the-dir* File/separator "deps.edn")))] |
129 | | - (cond-> {:root-edn (root-deps)} |
130 | | - (.exists user-loc) (assoc :user-edn (slurp-deps user-loc)) |
131 | | - (.exists project-loc) (assoc :project-edn (slurp-deps project-loc)))))) |
132 | | - |
133 | | -(defn- merge-or-replace |
134 | | - "If maps, merge, otherwise replace" |
135 | | - [& vals] |
136 | | - (when (some identity vals) |
137 | | - (reduce (fn [ret val] |
138 | | - (if (and (map? ret) (map? val)) |
139 | | - (merge ret val) |
140 | | - (or val ret))) |
141 | | - nil vals))) |
| 55 | + (let [key-adapter {:root :root-edn, :user :user-edn, :project :project-edn}] |
| 56 | + (-> (depsedn/create-edn-maps {:project project-edn-file}) |
| 57 | + (update-keys key-adapter))))) |
| 58 | + |
| 59 | +(defn create-edn-maps |
| 60 | + "DEPRECATED - use clojure.tools.deps.edn/create-edn-maps" |
| 61 | + {:deprecated "1.0"} |
| 62 | + [params] |
| 63 | + (depsedn/create-edn-maps params)) |
142 | 64 |
|
143 | 65 | (defn merge-edns |
144 | | - "Merge multiple deps edn maps from left to right into a single deps edn map." |
| 66 | + "DEPRECATED: Use clojure.tools.deps.edn/merge-edns" |
| 67 | + {:deprecated "1.0"} |
145 | 68 | [deps-edn-maps] |
146 | | - (apply merge-with merge-or-replace (remove nil? deps-edn-maps))) |
| 69 | + (depsedn/merge-edns deps-edn-maps)) |
147 | 70 |
|
148 | 71 | ;;;; Aliases |
149 | 72 |
|
150 | | -;; per-key binary merge-with rules |
151 | | - |
152 | | -(def ^:private last-wins (comp last #(remove nil? %) vector)) |
153 | | -(def ^:private append (comp vec concat)) |
154 | | -(def ^:private append-unique (comp vec distinct concat)) |
155 | | - |
156 | | -(def ^:private merge-alias-rules |
157 | | - {:deps merge ;; FUTURE: remove |
158 | | - :replace-deps merge ;; formerly :deps |
159 | | - :extra-deps merge |
160 | | - :override-deps merge |
161 | | - :default-deps merge |
162 | | - :classpath-overrides merge |
163 | | - :paths append-unique ;; FUTURE: remove |
164 | | - :replace-paths append-unique ;; formerly :paths |
165 | | - :extra-paths append-unique |
166 | | - :jvm-opts append |
167 | | - :main-opts last-wins |
168 | | - :exec-fn last-wins |
169 | | - :exec-args merge-or-replace |
170 | | - :ns-aliases merge |
171 | | - :ns-default last-wins}) |
172 | | - |
173 | | -(defn- choose-rule [alias-key val] |
174 | | - (or (merge-alias-rules alias-key) |
175 | | - (if (map? val) |
176 | | - merge |
177 | | - (fn [_v1 v2] v2)))) |
178 | | - |
179 | | -(defn- merge-alias-maps |
180 | | - "Like merge-with, but using custom per-alias-key merge function" |
181 | | - [& ms] |
182 | | - (reduce |
183 | | - #(reduce |
184 | | - (fn [m [k v]] (update m k (choose-rule k v) v)) |
185 | | - %1 %2) |
186 | | - {} ms)) |
187 | | - |
188 | 73 | (defn combine-aliases |
189 | | - "Find, read, and combine alias maps identified by alias keywords from |
190 | | - a deps edn map into a single args map." |
| 74 | + "DEPRECATED: Use clojure.tools.deps.edn/combine-aliases" |
| 75 | + {:deprecated "1.0"} |
191 | 76 | [edn-map alias-kws] |
192 | | - (->> alias-kws |
193 | | - (map #(get-in edn-map [:aliases %])) |
194 | | - (apply merge-alias-maps))) |
| 77 | + (depsedn/combine-aliases edn-map alias-kws)) |
195 | 78 |
|
196 | 79 | (defn lib-location |
197 | 80 | "Find the file path location of where a lib/coord would be located if procured |
|
767 | 650 | cp (make-classpath-map merged-edn libs classpath-args)] |
768 | 651 | (merge merged-edn {:libs libs} cp))))) |
769 | 652 |
|
770 | | -;(defn runtime-basis |
771 | | -; "Load the runtime execution basis context and return it." |
772 | | -; [] |
773 | | -; (when-let [f (jio/file (System/getProperty "clojure.basis"))] |
774 | | -; (if (and f (.exists f)) |
775 | | -; {:basis (slurp-deps f)} |
776 | | -; (throw (IllegalArgumentException. "No basis declared in clojure.basis system property"))))) |
777 | | - |
778 | | -(defn- choose-deps |
779 | | - [requested standard-fn] |
780 | | - (cond |
781 | | - (= :standard requested) (standard-fn) |
782 | | - (string? requested) (-> requested jio/file dir/canonicalize slurp-deps) |
783 | | - (or (nil? requested) (map? requested)) requested |
784 | | - :else (throw (ex-info (format "Unexpected dep source: %s" (pr-str requested)) |
785 | | - {:requested requested})))) |
786 | | - |
787 | | -(defn create-edn-maps |
788 | | - "Create a set of edn maps from the standard dep sources and return |
789 | | - them in a map with keys :root :user :project :extra" |
790 | | - [{:keys [root user project extra] :as params |
791 | | - :or {root :standard, user :standard, project :standard}}] |
792 | | - (let [root-edn (choose-deps root #(root-deps)) |
793 | | - user-edn (choose-deps user #(-> (user-deps-path) jio/file dir/canonicalize slurp-deps)) |
794 | | - project-edn (choose-deps project #(-> "deps.edn" jio/file dir/canonicalize slurp-deps)) |
795 | | - extra-edn (choose-deps extra (constantly nil))] |
796 | | - (cond-> {} |
797 | | - root-edn (assoc :root root-edn) |
798 | | - user-edn (assoc :user user-edn) |
799 | | - project-edn (assoc :project project-edn) |
800 | | - extra-edn (assoc :extra extra-edn)))) |
801 | | - |
802 | 653 | (defn create-basis |
803 | 654 | "Create a basis from a set of deps sources and a set of aliases. By default, use |
804 | 655 | root, user, and project deps and no argmaps (essentially the same classpath you get by |
|
851 | 702 | argmap-data (->> aliases |
852 | 703 | (remove nil?) |
853 | 704 | (map #(get alias-data %))) |
854 | | - argmap (apply merge-alias-maps (concat argmap-data [args])) |
| 705 | + argmap (apply depsedn/merge-alias-maps (concat argmap-data [args])) |
855 | 706 |
|
856 | 707 | project-tooled-edn (tool project-edn argmap) |
857 | | - merged-edn (merge-edns [root-edn user-edn project-tooled-edn extra-edn]) |
| 708 | + merged-edn (depsedn/merge-edns [root-edn user-edn project-tooled-edn extra-edn]) |
858 | 709 | basis (if (:skip-cp argmap) ;; UNSUPPORTED, USE AT YOUR OWN RISK |
859 | 710 | (assoc merged-edn :argmap argmap) |
860 | 711 | (calc-basis merged-edn {:resolve-args argmap, :classpath-args argmap}))] |
|
0 commit comments