Skip to content

Commit

Permalink
Merge pull request #262 from Kaspazza/main
Browse files Browse the repository at this point in the history
Add forced focus option
  • Loading branch information
liquidz authored Sep 29, 2024
2 parents c1d0f9e + 37db88b commit c83562f
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 10 deletions.
4 changes: 4 additions & 0 deletions README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ NOTE: You must specify `groupId/artifactId` for Java dependencies.

WARNING: `focus` option is prefer than `exclude` option.

If you want to focus the upgrade on specific version of dependency, you can use --focus=ARTIFACT_NAME[@VERSION]
E.g. `--focus=com.github.liquidz/[email protected]`
Will set antq dep to version 50.2.0, even if that version doesn't exist

=== --skip=PROJECT_TYPE
Skip to search specified project files.
Must be one of `boot`, `clojure-cli`, `github-action`, `pom`, `shadow-cljs` and `leiningen`.
Expand Down
49 changes: 40 additions & 9 deletions src/antq/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,28 @@
[nil "--changes-in-table"]
[nil "--transitive"]])

(defn- parse-artifact
"Retrieve artifact name and version from artifact string"
[artifact]
(zipmap [:name :version]
(str/split (str artifact) #"@" 2)))

(defn forced-artifact-version-map
"Forced artifacts are coming from focus param and contain specific version targeted with @"
[options]
(->> (:focus options)
(map parse-artifact)
(filter :version)
(map (juxt :name :version))
(into {})))

(defn skip-artifacts?
[dep options]
(let [exclude-artifacts (set (:exclude options []))
focus-artifacts (set (:focus options []))]
focus-artifacts (->> []
(:focus options)
(map (comp :name parse-artifact))
set)]
(cond
;; `focus` is prefer than `exclude`
(seq focus-artifacts)
Expand All @@ -117,9 +135,9 @@
[versions dep options]
(let [dep-name (:name dep)
skip-vers (->> (:exclude options)
(map #(str/split % #"@" 2))
(filter #(= dep-name (first %)))
(keep second)
(map parse-artifact)
(filter #(= dep-name (:name %)))
(keep :version)
(concat (or (:exclude-versions dep) []))
(distinct))]
(remove (fn [target-version]
Expand All @@ -130,9 +148,18 @@
[dep]
(contains? #{"RELEASE" "master" "main" "latest"} (:version dep)))

(defn mark-forced-version
"If dependency is in focused artifacts, sets `:forced-version` information"
[dep forced-artifacts]
(if-let [forced-version (get forced-artifacts (:name dep))]
(assoc dep :forced-version forced-version)
dep))

(defn- assoc-versions
[dep options]
(let [res (assoc dep :_versions (ver/get-sorted-versions dep options))]
(let [res (if-let [forced-version (:forced-version dep)]
(assoc dep :_versions [forced-version])
(assoc dep :_versions (ver/get-sorted-versions dep options)))]
(report/run-progress dep options)
res))

Expand Down Expand Up @@ -166,7 +193,7 @@
(defn distinct-deps
[deps]
(->> deps
(map #(select-keys % [:type :name :version :repositories :extra]))
(map #(select-keys % [:type :name :version :repositories :extra :forced-version]))
(map #(if (ver/snapshot? (:version %))
%
(dissoc % :version)))
Expand All @@ -183,13 +210,16 @@

(defn outdated-deps
[deps options]
(let [org-deps (cond->> deps
(let [forced-artifacts (forced-artifact-version-map options)
org-deps (cond->> deps
(:transitive options)
(concat (dep.transitive/resolve-transitive-deps deps))

:always
(remove #(or (skip-artifacts? % options)
(using-release-version? %))))
(using-release-version? %)))
(seq forced-artifacts)
(mapv #(mark-forced-version % forced-artifacts)))
uniq-deps (distinct-deps org-deps)
_ (report/init-progress uniq-deps options)
uniq-deps-with-vers (doall (pmap #(assoc-versions % options) uniq-deps))
Expand All @@ -204,7 +234,8 @@
(keep :parent)
(set))]
(->> version-checked-deps
(remove #(and (ver/latest? %)
(remove #(and (not (:forced-version %))
(ver/latest? %)
(not (contains? parent-dep-names (:name %))))))))

(defn assoc-changes-url
Expand Down
23 changes: 22 additions & 1 deletion test/antq/core_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@
false "foo"
true "foo/bar"))

(t/testing "focus works with specified version `@`"
(t/are [expected in] (= expected (sut/skip-artifacts? (r/map->Dependency {:name in})
{:focus ["org.clojure/clojure" "[email protected]"]}))
false "org.clojure/clojure"
true "org.clojure/foo"
true "foo/clojure"
false "foo"
true "foo/bar"))
(t/testing "`focus` shoud be prefer than `exclude`"
(t/is (false? (sut/skip-artifacts? (r/map->Dependency {:name "org.clojure/clojure"})
{:exclude ["org.clojure/clojure"]
Expand Down Expand Up @@ -184,7 +192,13 @@
(t/testing "[email protected] should be excluded"
(t/is (= [(test-dep {:name "alice" :version "1.0.0" :latest-version "2.0.0"})
(test-dep {:name "bob" :version "2.0.0" :latest-version "3.0.0"})]
(sut/outdated-deps deps {:exclude ["[email protected]"]}))))))
(sut/outdated-deps deps {:exclude ["[email protected]"]}))))
(t/testing "alice is focused so only this dep should be kept"
(t/is (= [(test-dep {:name "alice" :version "1.0.0" :latest-version "3.0.0"})]
(sut/outdated-deps deps {:focus ["alice"]}))))
(t/testing "focus containing specific version, should force it (0.5.0) even when newer exists (3.0.0)"
(t/is (= [(test-dep {:name "alice" :version "1.0.0" :latest-version "0.5.0" :forced-version "0.5.0"})]
(sut/outdated-deps deps {:focus ["[email protected]"]}))))))

(t/deftest assoc-changes-url-test
(let [dummy-dep {:type :java :name "foo/bar" :version "1" :latest-version "2"}]
Expand Down Expand Up @@ -309,3 +323,10 @@
(str/trim
(with-out-str
(sut/latest {:type :test :name 'foo/bar}))))))

(t/deftest forced-artifacts-test
(t/testing "default"
(t/is [] (sut/forced-artifact-version-map {:focus ["foo"]}))
(t/is [{:name "foo" :latest-version "2.0.0"}] (sut/forced-artifact-version-map {:focus ["[email protected]"]}))
(t/is [{:name "foo" :latest-version "2.0.0"}
{:name "foo/zbar2" :latest-version "2"}] (sut/forced-artifact-version-map {:focus ["[email protected]" "foo" "foo/bar" "foo/zbar2@2"]}))))

0 comments on commit c83562f

Please sign in to comment.