-
Notifications
You must be signed in to change notification settings - Fork 14
/
outdated.clj
122 lines (110 loc) · 4.77 KB
/
outdated.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
(ns depot.outdated
(:require [clojure.java.shell :as sh]
[clojure.string :as str]
[clojure.tools.deps.alpha :as deps]
[clojure.tools.deps.alpha.extensions :as ext]
[clojure.tools.deps.alpha.reader :as reader]
[clojure.tools.deps.alpha.util.maven :as maven]
[version-clj.core :as version])
(:import org.apache.maven.repository.internal.MavenRepositorySystemUtils
[org.eclipse.aether RepositorySystem RepositorySystemSession]
org.eclipse.aether.resolution.VersionRangeRequest))
(def version-types #{:snapshot :qualified :release})
(defn version-type [v]
(let [type (-> (version/version->seq v)
(last)
(first))]
(cond
(= type "snapshot") :snapshot
(string? type) :qualified
(integer? type) :release
:else :unrecognised)))
(defn make-session
^RepositorySystemSession [^RepositorySystem system local-repo]
(let [session (MavenRepositorySystemUtils/newSession)
local-repo-mgr (.newLocalRepositoryManager system session (maven/make-local-repo local-repo))]
(.setLocalRepositoryManager session local-repo-mgr)
session))
(defn coord->version-status [lib coord {:keys [mvn/repos mvn/local-repo]}]
(let [local-repo (or local-repo maven/default-local-repo)
remote-repos (mapv maven/remote-repo repos)
system (maven/make-system)
session (make-session system local-repo)
selected (:mvn/version coord)
artifact (maven/coord->artifact lib (assoc coord :mvn/version "[0,)"))
versions-req (doto (new VersionRangeRequest)
(.setArtifact artifact)
(.setRepositories remote-repos))
versions (->> (.resolveVersionRange system session versions-req)
(.getVersions)
(map str))]
{:selected selected
:types (group-by version-type versions)}))
(defn find-latest [types consider-types]
(let [versions (->> (select-keys types consider-types)
(vals)
(apply concat))]
(-> (sort version/version-compare versions)
(last))))
(defmulti -current-latest-map (fn [_ coord _] (ext/coord-type coord)))
(defmethod -current-latest-map :default
[_ _ _]
nil)
(defmethod -current-latest-map :mvn
[lib coord {:keys [deps-map consider-types]}]
(let [{:keys [types selected]} (coord->version-status lib coord deps-map)
latest (find-latest types consider-types)]
(when (and (not (str/blank? selected))
(not (str/blank? latest))
(= (version/version-compare latest selected) 1))
{"Current" selected
"Latest" latest})))
(defn- parse-git-ls-remote
"Returns a map of ref name to the latest sha for that ref name."
[s]
(let [lines (-> s
(str/trim-newline)
(str/split #"\n"))]
(into {}
(comp
(map (fn [x]
(-> x
(str/triml)
(str/split #"\t")
(reverse)
(vec))))
(filter #(= 2 (count %))))
lines)))
(defmethod -current-latest-map :git
[lib coord _]
(let [{:keys [exit out]} (sh/sh "git" "ls-remote" (:git/url coord))
latest-remote-sha (get (parse-git-ls-remote out) "HEAD")]
(when (and (= exit 0)
(neg? (ext/compare-versions
lib coord (assoc coord :sha latest-remote-sha) {})))
{"Current" (:sha coord)
"Latest" latest-remote-sha})))
(defn current-latest-map
"Returns a map containing `'Current'` and `'Latest'` if the dependency has a
newer version otherwise returns `nil`."
[lib coord data]
(-current-latest-map lib coord data))
(defn gather-outdated [consider-types aliases include-overrides]
(let [deps-map (-> (reader/clojure-env)
(:config-files)
(reader/read-deps))
args-map (deps/combine-aliases deps-map aliases)
overrides (:override-deps args-map)
all-deps (merge (:deps deps-map) (:extra-deps args-map)
(when include-overrides overrides))]
(->> (pmap (fn [[lib coord]]
(let [outdated (current-latest-map lib
(if include-overrides
coord
(get overrides lib coord))
{:consider-types consider-types
:deps-map deps-map})]
(when outdated
(assoc outdated "Dependency" lib)))) all-deps)
(keep identity)
(sort-by #(get % "Dependency")))))