-
Notifications
You must be signed in to change notification settings - Fork 14
/
update.clj
97 lines (86 loc) · 3.86 KB
/
update.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
(ns depot.outdated.update
(:require [clojure.tools.deps.alpha.reader :as reader]
[depot.outdated :as depot]
[depot.zip :as dzip]
[rewrite-clj.zip :as rzip]
[clojure.zip :as zip]))
(defmacro with-print-namespace-maps [bool & body]
(if (find-var 'clojure.core/*print-namespace-maps*)
`(binding [*print-namespace-maps* ~bool]
~@body)
;; pre Clojure 1.9
`(do ~@body)))
(defn- new-versions
[deps consider-types repos]
(into {}
(pmap (fn [[artifact coords]]
(let [[old-version version-key]
(or (some-> coords :mvn/version (vector :mvn/version))
(some-> coords :sha (vector :sha)))
new-version (-> (depot/current-latest-map artifact
coords
{:consider-types consider-types
:deps-map repos})
(get "Latest"))]
(when (and old-version
;; ignore these Maven 2 legacy identifiers
(not (#{"RELEASE" "LATEST"} old-version))
new-version)
[artifact {:version-key version-key
:old-version old-version
:new-version new-version}])))
deps)))
(defn update-loc?
"Should the version at the current position be updated?
Returns true unless any ancestor has the `^:depot/ignore` metadata."
[loc]
(not (rzip/find loc
rzip/up
(fn [loc]
(:depot/ignore (meta (rzip/sexpr loc)))))))
(defn- apply-new-version
[new-versions loc]
(let [artifact (rzip/sexpr loc)
coords-loc (dzip/right loc)
{version-key :version-key
new-version :new-version
old-version :old-version :as v} (get new-versions artifact)]
(if (and v (update-loc? loc) (update-loc? coords-loc))
(do
(with-print-namespace-maps false
(println " " artifact (pr-str {version-key old-version}) "->" (pr-str {version-key new-version})))
(dzip/zassoc coords-loc version-key new-version))
coords-loc)))
(defn update-deps
"Update all deps in a `:deps` or `:extra-deps` or `:override-deps` map, at the
top level and in aliases.
`loc` points at the top level map."
[loc consider-types repos]
(let [new-versions (new-versions (doall (dzip/lib-seq loc)) consider-types repos)]
(dzip/transform-libs loc (partial apply-new-version new-versions))))
(defn update-deps-edn!
"Destructively update a `deps.edn` file.
Read a `deps.edn` file, update all dependencies in it to their latest version,
unless marked with `^:depot/ignore` metadata, then overwrite the file with the
updated version. Preserves whitespace and comments.
This will consider user and system-wide `deps.edn` files for locating Maven
repositories, but only considers the given file when determining current
versions.
`consider-types` is a set, one of [[depot.outdated/version-types]]. "
[file consider-types]
(println "Updating:" file)
(let [deps (-> (reader/clojure-env)
:config-files
reader/read-deps)
repos (select-keys deps [:mvn/repos :mvn/local-repo])
loc (rzip/of-file file)
old-deps (slurp file)
loc' (update-deps loc consider-types repos)
new-deps (rzip/root-string loc')]
(when (and loc' new-deps) ;; defensive check to prevent writing an empty deps.edn
(if (= old-deps new-deps)
(println " All up to date!")
(try
(spit file new-deps)
(catch java.io.FileNotFoundException e
(println " [ERROR] Permission denied: " file)))))))