/
clojure.clj
77 lines (68 loc) · 2.47 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
66
67
68
69
70
71
72
73
74
75
76
77
(ns antq.upgrade.clojure
(:require
[antq.upgrade :as upgrade]
[antq.util.dep :as u.dep]
[antq.util.git :as u.git]
[antq.util.zip :as u.zip]
[rewrite-clj.zip :as z]))
(defn- in-deps?
[loc]
(->> loc z/up z/left z/sexpr
(contains? #{:deps :extra-deps :replace-deps :override-deps})))
(defmulti replace-versions
(fn [_loc version-checked-dep]
(:type version-checked-dep)))
(defmethod replace-versions :default
[loc version-checked-dep]
(some-> loc
(z/find-value z/right :mvn/version)
(z/right)
(z/replace (:latest-version version-checked-dep))))
(defmethod replace-versions :git-sha
[loc version-checked-dep]
(some-> (or (z/find-value loc z/right :sha)
(z/find-value loc z/right :git/sha))
(z/right)
(z/replace (:latest-version version-checked-dep))))
(defmethod replace-versions :git-tag-and-sha
[loc version-checked-dep]
(let [tag-loc (some-> (or (z/find-value loc z/right :tag)
(z/find-value loc z/right :git/tag))
(z/right)
(z/replace (:latest-version version-checked-dep))
(z/up)
(z/down))
sha-loc (when tag-loc
(or (z/find-value tag-loc z/right :sha)
(z/find-value tag-loc z/right :git/sha)))]
(cond
(and tag-loc sha-loc)
(let [{:keys [latest-version extra]} version-checked-dep
;; NOTE: the result of `git ls-remote` should be cached by `memoize`
new-sha (-> (u.git/tag-sha-by-ls-remote (:url extra) latest-version)
(subs 0 (count (:sha extra))))]
(-> sha-loc
(z/right)
(z/replace new-sha)))
tag-loc
tag-loc
:else
loc)))
(defn upgrade-dep
[loc version-checked-dep]
(let [name-set (u.dep/name-candidates (:name version-checked-dep))]
(loop [loc loc]
(if-let [loc (z/find-value loc z/next name-set)]
(recur (if (in-deps? loc)
(or (some-> loc
;; move to map
(z/right) (z/down)
(replace-versions version-checked-dep))
(z/next loc))
(z/next loc)))
(u.zip/move-to-root loc)))))
(defmethod upgrade/upgrader :clojure
[version-checked-dep]
(-> (z/of-file (:file version-checked-dep))
(upgrade-dep version-checked-dep)
(z/root-string)))