|
| 1 | +#!/usr/bin/env bash |
| 2 | +#_" -*- mode: clojure; -*-" |
| 3 | +#_( |
| 4 | + "exec" "clojure" "-Sdeps" "{:deps {clj-kondo/clj-kondo {:mvn/version \"2020.12.12\"} org.clojure/tools.deps.alpha {:mvn/version \"0.9.857\"} org.slf4j/slf4j-nop {:mvn/version \"1.7.30\"} lambdaisland/deep-diff2 {:mvn/version \"2.0.108\"} juji/editscript {:mvn/version \"0.5.4\"}}}" "-M" "$0" "$@" |
| 5 | + ) |
| 6 | + |
| 7 | +;; Adapted from borkdude's api_diff.clj script: https://gist.github.com/borkdude/2b963db1582654ec28bfd40b4dc35748 |
| 8 | +;; Example usage: |
| 9 | +;; download jars to temp files (from https://downloads.metabase.com), then compare |
| 10 | +;; metabase-api-compare.sh "v0.40.5" "v0.41.0-RC1" > /tmp/diff.txt |
| 11 | +;; |
| 12 | +;; directly reference uberjars already on local disk |
| 13 | +;; metabase-api-compare.sh file:/Users/jeff/dev/metabase/uberjar-testing/0.40.5/metabase.jar file:/tmp/metabase-release/metabase/target/uberjar/metabase.jar >/tmp/diff.txt |
| 14 | + |
| 15 | +(require '[clj-kondo.core :as clj-kondo]) |
| 16 | +(require '[clojure.edn :as edn]) |
| 17 | + |
| 18 | +(def v1 (first *command-line-args*)) |
| 19 | +(def v2 (second *command-line-args*)) |
| 20 | + |
| 21 | +(require '[clojure.java.io :as io]) |
| 22 | +(require '[clojure.tools.deps.alpha :as tda]) |
| 23 | + |
| 24 | +(import java.io.File) |
| 25 | + |
| 26 | +(defn download! [uri file] |
| 27 | + (with-open [in (io/input-stream uri) |
| 28 | + out (io/output-stream file)] |
| 29 | + (io/copy in out))) |
| 30 | + |
| 31 | +(defn metabase-version->download-url [v] |
| 32 | + (format "https://downloads.metabase.com/%s/metabase.jar" v)) |
| 33 | + |
| 34 | +(defn path [v] |
| 35 | + (if (re-matches #"file:/.*" v) |
| 36 | + v |
| 37 | + (let [temp-file (File/createTempFile (str "metabase-" v) ".jar")] |
| 38 | + (.deleteOnExit temp-file) |
| 39 | + (-> (metabase-version->download-url v) |
| 40 | + (download! temp-file)) |
| 41 | + (.getAbsolutePath temp-file)))) |
| 42 | + |
| 43 | +(def path1 (path v1)) |
| 44 | +(def path2 (path v2)) |
| 45 | + |
| 46 | +(defn index-by |
| 47 | + [f coll] |
| 48 | + (persistent! (reduce #(assoc! %1 (f %2) %2) (transient {}) coll))) |
| 49 | + |
| 50 | +(defn group [vars] |
| 51 | + (->> vars |
| 52 | + (map #(select-keys % [:ns :name :fixed-arities :varargs-min-arity])) |
| 53 | + (index-by (juxt :ns :name)))) |
| 54 | + |
| 55 | +(defn vars [lib] |
| 56 | + (-> (clj-kondo/run! {:lint [lib] :config {:output {:analysis true :format :edn}}}) |
| 57 | + :analysis :var-definitions #_ clean)) |
| 58 | + |
| 59 | +(def vars-1 (vars path1)) |
| 60 | +(def vars-2 (vars path2)) |
| 61 | + |
| 62 | +#_(require '[lambdaisland.deep-diff2 :as ddiff]) |
| 63 | +#_(ddiff/pretty-print (ddiff/diff vars-1 vars-2)) |
| 64 | + |
| 65 | +;; (require '[editscript.core :as c]) |
| 66 | +;; (require '[editscript.edit :as e]) |
| 67 | +;; (def d (c/diff vars-1 vars-2)) |
| 68 | + |
| 69 | +;; (require '[clojure.pprint :refer [pprint]]) |
| 70 | +;; (pprint (e/get-edits d)) |
| 71 | + |
| 72 | +(defn var-symbol [[k v]] |
| 73 | + (str k "/" v)) |
| 74 | + |
| 75 | +(def compare-group-1 (group vars-1)) |
| 76 | +(def compare-group-2 (group vars-2)) |
| 77 | + |
| 78 | +(def lookup-1 (index-by (juxt :ns :name) vars-1)) |
| 79 | + |
| 80 | +(doseq [[k var-1] compare-group-1] |
| 81 | + (if-let [var-2 (get compare-group-2 k)] |
| 82 | + (let [fixed-arities-v1 (:fixed-arities var-1) |
| 83 | + fixed-arities-v2 (:fixed-arities var-2) |
| 84 | + varargs-min-arity (:varargs-min-arity var-2)] |
| 85 | + (doseq [arity fixed-arities-v1] |
| 86 | + (when-not (or (contains? fixed-arities-v2 arity) |
| 87 | + (and varargs-min-arity (>= arity varargs-min-arity))) |
| 88 | + (let [{:keys [:filename :row :col :private]} (get lookup-1 k)] |
| 89 | + (println (str filename ":" row ":" col ":") (str (if private "warning" "error") ":") |
| 90 | + "Arity" arity "of" (var-symbol k) "was removed."))))) |
| 91 | + (let [{:keys [:filename :row :col :private]} (get lookup-1 k)] |
| 92 | + (println (str filename ":" row ":" col ":") (str (if private "warning" "error") ":") |
| 93 | + (var-symbol k) "was removed.")))) |
0 commit comments