/
clojure.clj
65 lines (58 loc) · 1.87 KB
/
clojure.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
(ns antq.dep.clojure
"Clojure CLI"
(:require
[antq.record :as r]
[antq.util.dep :as u.dep]
[clojure.edn :as edn]
[clojure.java.io :as io]
[clojure.walk :as walk]))
(def ^:private project-file "deps.edn")
(defn- ignore?
[opt]
(contains? opt :local/root))
(defmulti extract-type-and-version
(fn [opt]
(or (and (:mvn/version opt) :java)
(and (:git/url opt) :git-sha))))
(defmethod extract-type-and-version :default
[opt]
{:type :java
:version (:mvn/version opt)})
(defmethod extract-type-and-version :git-sha
[opt]
{:type :git-sha
:version (:sha opt)
:extra {:url (:git/url opt)}})
(defn extract-deps
[file-path deps-edn-content-str]
(let [deps (atom [])
edn (edn/read-string deps-edn-content-str)]
(walk/postwalk (fn [form]
(when (and (sequential? form)
(#{:deps :extra-deps :replace-deps :override-deps} (first form)))
(->> form
(second)
(seq)
(swap! deps concat)))
form)
edn)
(for [[dep-name opt] @deps
:let [type-and-version (extract-type-and-version opt)]
:when (and (not (ignore? opt))
(string? (:version type-and-version))
(seq (:version type-and-version)))]
(-> {:project :clojure
:file file-path
:name (if (u.dep/qualified-symbol?' dep-name)
(str dep-name)
(str dep-name "/" dep-name))
:repositories (:mvn/repos edn)}
(merge type-and-version)
(r/map->Dependency)))))
(defn load-deps
([] (load-deps "."))
([dir]
(let [file (io/file dir project-file)]
(when (.exists file)
(extract-deps (u.dep/relative-path file)
(slurp file))))))