Skip to content

Commit

Permalink
Merge pull request #57 from liquidz/dev
Browse files Browse the repository at this point in the history
0.11.0
  • Loading branch information
liquidz committed Feb 5, 2021
2 parents cffde09 + 11d5a69 commit ffaa6ab
Show file tree
Hide file tree
Showing 32 changed files with 636 additions and 138 deletions.
16 changes: 16 additions & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,22 @@ All notable changes to this project will be documented in this file. This change

== Unreleased (dev)

== 0.11.0 (2021-02-06)

// {{{
=== Added

* Added support to display diff URLs for outdated dependencies.

=== Changed

* Changed default error message for `format` reporter to add diff URLs.

=== Fixed

* Fixed to return actual tag name for outdated GitHub Actions.
// }}}

== 0.10.3 (2021-02-01)
// {{{
=== Changed
Expand Down
3 changes: 3 additions & 0 deletions README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,9 @@ You can use following variables:
| `{{latest-version}}`
| The latest version.

| `{{diff-url}}`
| The diff URL for Version Control System. (Nullable)

| `{{message}}`
| Default error message.

Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>antq</groupId>
<artifactId>antq</artifactId>
<version>0.10.3</version>
<version>0.11.0</version>
<name>antq</name>
<description>Point out your outdated dependencies</description>
<url>https://github.com/liquidz/antq</url>
Expand Down
18 changes: 15 additions & 3 deletions src/antq/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@
[antq.dep.leiningen :as dep.lein]
[antq.dep.pom :as dep.pom]
[antq.dep.shadow :as dep.shadow]
[antq.diff :as diff]
[antq.diff.git-sha]
[antq.diff.github-tag]
[antq.diff.java]
[antq.log :as log]
[antq.record :as r]
[antq.report :as report]
[antq.report.edn]
Expand Down Expand Up @@ -100,7 +105,7 @@
:name dep-name})
(ver/get-sorted-versions)
(first)
(println))))
(log/info))))

(defn- assoc-latest-version
[dep]
Expand Down Expand Up @@ -146,6 +151,12 @@
assoc-latest-version))
(remove ver/latest?))))

(defn assoc-diff-url
[version-checked-dep]
(if-let [url (diff/get-diff-url version-checked-dep)]
(assoc version-checked-dep :diff-url url)
version-checked-dep))

(defn exit
[outdated-deps]
(System/exit (if (seq outdated-deps) 1 0)))
Expand Down Expand Up @@ -184,7 +195,8 @@
deps (fetch-deps options)
deps (unify-org-clojure-deps deps)]
(if (seq deps)
(let [outdated (outdated-deps deps options)]
(let [outdated (outdated-deps deps options)
outdated (map assoc-diff-url outdated)]
(report/reporter outdated options)

(cond-> outdated
Expand All @@ -193,5 +205,5 @@

true
(exit)))
(do (println "No project file")
(do (log/info "No project file")
(System/exit 1)))))
3 changes: 1 addition & 2 deletions src/antq/dep/github_action.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
(:require
[antq.record :as r]
[antq.util.dep :as u.dep]
[antq.util.ver :as u.ver]
[clj-yaml.core :as yaml]
[clojure.java.io :as io]
[clojure.string :as str]
Expand All @@ -28,7 +27,7 @@
:version version
:extra {:url (name->url name)}}
{:type :github-tag
:version (u.ver/normalize-version version)}))
:version version}))

(defn extract-deps
[file-path workflow-content-str]
Expand Down
9 changes: 9 additions & 0 deletions src/antq/diff.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
(ns antq.diff)

(defmulti get-diff-url
(fn [version-checked-dep]
(:type version-checked-dep)))

(defmethod get-diff-url :default
[_dep]
nil)
19 changes: 19 additions & 0 deletions src/antq/diff/git_sha.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
(ns antq.diff.git-sha
(:require
[antq.diff :as diff]
[antq.log :as log]
[antq.util.url :as u.url]
[clojure.string :as str]))

(defmethod diff/get-diff-url :git-sha
[dep]
(when-let [url (get-in dep [:extra :url])]
(cond
(str/starts-with? url "https://github.com/")
(format "%scompare/%s...%s"
(u.url/ensure-tail-slash url)
(:version dep)
(:latest-version dep))

:else
(log/error (str "Diff is not supported for " url)))))
11 changes: 11 additions & 0 deletions src/antq/diff/github_tag.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
(ns antq.diff.github-tag
(:require
[antq.diff :as diff]
[clojure.string :as str]))

(defmethod diff/get-diff-url :github-tag
[dep]
(format "https://github.com/%s/compare/%s...%s"
(str/join "/" (take 2 (str/split (:name dep) #"/")))
(:version dep)
(:latest-version dep)))
93 changes: 93 additions & 0 deletions src/antq/diff/java.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
(ns antq.diff.java
(:require
[antq.diff :as diff]
[antq.log :as log]
[antq.util.git :as u.git]
[antq.util.maven :as u.mvn]
[antq.util.url :as u.url]
[clojure.string :as str])
(:import
(org.eclipse.aether.resolution
ArtifactRequest)))

(defn memoize-by
[f key-fn]
(let [mem (atom {})]
(fn [m & args]
(if-let [res (get @mem (get m key-fn))]
res
(let [ret (apply f m args)]
(swap! mem assoc (get m key-fn) ret)
ret)))))

(defn- get-repository-url*
[{:keys [name version] :as dep}]
(try
(let [opts (u.mvn/dep->opts dep)
{:keys [system session artifact remote-repos]} (u.mvn/repository-system name version opts)
req (doto (ArtifactRequest.)
(.setArtifact artifact)
(.setRepositories remote-repos))]
(some-> (.resolveArtifact system session req)
(.getRepository)
(.getUrl)))
;; Skip showing diff URL when fetching repository URL is failed
(catch Exception _ nil)))
(def get-repository-url (memoize-by get-repository-url* :name))

(defn- dep->pom-url
[dep]
(let [{:keys [version]} dep
[group-id artifact-id] (str/split (:name dep) #"/" 2)
repo-url (get-repository-url dep)]
(when repo-url
(format "%s%s/%s/%s/%s-%s.pom"
(u.url/ensure-tail-slash repo-url)
(str/replace group-id "." "/")
artifact-id
version
artifact-id
version))))

(defn- get-scm-url*
[dep]
(try
(when-let [model (some-> dep
(dep->pom-url)
(u.mvn/read-pom))]
(-> model
(u.mvn/get-scm)
(u.mvn/get-scm-url)
;; fallback
(or (u.mvn/get-url model))
;; normalize
(u.url/ensure-https)
(u.url/ensure-git-https-url)))

;; Skip showing diff URL when POM file is not found
(catch java.io.FileNotFoundException _ nil)))
(def get-scm-url (memoize-by get-scm-url* :name))

(defmethod diff/get-diff-url :java
[dep]
(when-let [url (get-scm-url dep)]
(cond
(str/starts-with? url "https://github.com/")
(let [tags (u.git/tags-by-ls-remote url)
current (first (filter #(str/includes? % (:version dep)) tags))
latest (or (first (filter #(str/includes? % (:latest-version dep)) tags))
;; If there isn't a tag for latest version
"head")]
(if current
(format "%scompare/%s...%s"
(u.url/ensure-tail-slash url)
current
latest)
(do (log/error (str "The tag for current version is not found: " url))
;; not diff, but URL is useful for finding the differences.
nil)))

:else
(do (log/error (str "Diff is not supported for " url))
;; not diff, but URL is useful for finding the differences.
nil))))
10 changes: 10 additions & 0 deletions src/antq/log.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
(ns antq.log)

(defn info
[s]
(println s))

(defn error
[s]
(binding [*out* *err*]
(println s)))
22 changes: 20 additions & 2 deletions src/antq/record.clj
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
(ns antq.record)

(defrecord Dependency
[type file name version latest-version
repositories project])
[;; Dependency type keyword
;; e.g. :java, :git-sha or :github-tag
type
;; File path for project configuration file
file
;; Dependency name
;; e.g. "org.clojure/clojure", "medley/medley"
name
;; Current version string
version
;; Latest version string (Nullable)
latest-version
;; Additional Maven repositories (Nullable)
;; e.g. {"nexus-snapshots" {:url "http://localhost:8081/repository/maven-snapshots/"}}
repositories
;; Project type keyword
;; e.g. :clojure, :leiningen, :shadow-cljs and so on.
project
;; Diff URL for Version Control System (Nullable)
diff-url])
6 changes: 4 additions & 2 deletions src/antq/report.clj
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
(ns antq.report)
(ns antq.report
(:require
[antq.log :as log]))

(defmulti reporter
(fn [_deps options]
(:reporter options)))

(defmethod reporter :default
[_ options]
(println "Unknown reporter:" (:reporter options)))
(log/error (str "Unknown reporter: " (:reporter options))))
4 changes: 2 additions & 2 deletions src/antq/report/format.clj
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
[clojure.string :as str]))

(def ^:private default-outdated-message-format
"{{name}} {{version}} is outdated. Latest version is {{latest-version}}.")
"{{name}} {{version}} is outdated. Latest version is {{latest-version}}. {{diff-url}}")

(def ^:private default-failed-message-format
"Failed to fetch the latest version of {{name}} {{version}}.")
Expand All @@ -15,7 +15,7 @@
[dep format-string]
(let [dep (-> dep
(assoc :latest-version (u.ver/normalize-latest-version dep))
(select-keys [:file :name :version :latest-version :message]))]
(select-keys [:file :name :version :latest-version :message :diff-url]))]
(reduce-kv (fn [s k v]
(str/replace s (str "{{" (name k) "}}") (or v "")))
format-string
Expand Down
20 changes: 17 additions & 3 deletions src/antq/report/table.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
[antq.report :as report]
[antq.util.dep :as u.dep]
[antq.util.ver :as u.ver]
[clojure.pprint :as pprint]))
[clojure.pprint :as pprint]
[clojure.set :as set]))

(defn skip-duplicated-file-name
[sorted-deps]
Expand All @@ -18,10 +19,23 @@

(defmethod report/reporter "table"
[deps _options]
;; Show table
(if (seq deps)
(->> deps
(sort u.dep/compare-deps)
skip-duplicated-file-name
(map #(assoc % :latest-version (u.ver/normalize-latest-version %)))
(pprint/print-table [:file :name :version :latest-version]))
(println "All dependencies are up-to-date.")))
(map #(set/rename-keys % {:version :current
:latest-version :latest}))
(pprint/print-table [:file :name :current :latest]))
(println "All dependencies are up-to-date."))

;; Show diff URLs
(let [urls (->> deps
(sort u.dep/compare-deps)
(keep :diff-url)
(distinct))]
(when (seq urls)
(println "\nAvailable diffs:")
(doseq [u urls]
(println "-" u)))))
Loading

0 comments on commit ffaa6ab

Please sign in to comment.