Skip to content

Commit

Permalink
Add support for private repositories #109
Browse files Browse the repository at this point in the history
  • Loading branch information
liquidz committed Nov 12, 2021
1 parent a25220c commit 9421166
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 4 deletions.
40 changes: 37 additions & 3 deletions src/antq/util/maven.clj
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
(:require
[antq.constant :as const]
[antq.log :as log]
[antq.util.leiningen :as u.lein]
[clojure.java.io :as io]
[clojure.string :as str]
[clojure.tools.deps.alpha.util.maven :as deps.util.maven]
Expand All @@ -11,6 +12,9 @@
Model
Scm)
org.apache.maven.model.io.xpp3.MavenXpp3Reader
(org.apache.maven.settings
Server
Settings)
(org.eclipse.aether
DefaultRepositorySystemSession
RepositorySystem)
Expand Down Expand Up @@ -49,6 +53,33 @@
(normalize-repos))
:snapshots? (snapshot? (:version dep))})

(defn ensure-username-or-password
[x]
(if (string? x)
x
(or (u.lein/env x)
(str x))))

(defn- ^Server new-repository-server
[{:keys [id username password]}]
(doto (Server.)
(.setId id)
(.setUsername (ensure-username-or-password username))
(.setPassword (ensure-username-or-password password))))

(defn ^Settings get-maven-settings
[opts]
(let [settings ^Settings (deps.util.maven/get-settings)
server-ids (set (map #(.getId %) (.getServers settings)))]
;; NOTE
;; In Leiningen, authentication information is defined in project.clj instead of ~/.m2/settings.xml,
;; so if there is authentication information in `:repositories`, apply to `settings`
(doseq [[id {:keys [username password]}] (:repositories opts)]
(when-not (contains? server-ids id)
(.addServer settings
(new-repository-server {:id id :username username :password password}))))
settings))

(def ^TransferListener custom-transfer-listener
"Copy from clojure.tools.deps.alpha.util.maven/console-listener
But no outputs for `transferStarted`"
Expand All @@ -68,12 +99,13 @@
(let [lib (cond-> name (string? name) symbol)
local-repo deps.util.maven/default-local-repo
system ^RepositorySystem (deps.util.session/retrieve :mvn/system #(deps.util.maven/make-system))
session ^DefaultRepositorySystemSession (deps.util.maven/make-session system local-repo)
settings ^Settings (get-maven-settings opts)
session ^DefaultRepositorySystemSession (deps.util.maven/make-session system settings local-repo)
;; Overwrite TransferListener not to show "Downloading" messages
_ (.setTransferListener session custom-transfer-listener)
;; c.f. https://stackoverflow.com/questions/35488167/how-can-you-find-the-latest-version-of-a-maven-artifact-from-java-using-aether
artifact (deps.util.maven/coord->artifact lib {:mvn/version version})
remote-repos (deps.util.maven/remote-repos (:repositories opts))]
remote-repos (deps.util.maven/remote-repos (:repositories opts) settings)]
{:system system
:session session
:artifact artifact
Expand All @@ -93,7 +125,9 @@
(catch java.net.ConnectException e
(if (= "Operation timed out" (.getMessage e))
(log/warning (str "Fetching pom from " url " failed because it timed out, retrying"))
(throw e))))
(throw e)))
(catch java.io.IOException e
(log/warning (str "Fetching pom from " url " failed because of the following error: " (.getMessage e)))))
(recur (inc i))))))

(defn ^String get-url
Expand Down
51 changes: 50 additions & 1 deletion test/antq/util/maven_test.clj
Original file line number Diff line number Diff line change
@@ -1,8 +1,37 @@
(ns antq.util.maven-test
(:require
[antq.record :as r]
[antq.util.leiningen :as u.lein]
[antq.util.maven :as sut]
[clojure.test :as t]))
[clojure.test :as t]
[clojure.tools.deps.alpha.util.maven :as deps.util.maven])
(:import
(org.apache.maven.settings
Server
Settings)))

(def ^:private dummy-settings
(doto (Settings.)
(.addServer (doto (Server.)
(.setId "serv1")))
(.addServer (doto (Server.)
(.setId "serv2")
(.setUsername "two-user")
(.setPassword "two-pass")))))

(def ^:private dummy-repos
{"serv1" {:url "https://one.example.com"}
"serv2" {:url "https://two.example.com"}
"serv3" {:url "https://three.example.com"
:username "three-user"
:password "three-pass"}
"serv4" {:url "https://three.example.com"
:username :env
:password :env/four}})

(def ^:private dummy-env
{"LEIN_PASSWORD" "lein-pass"
"FOUR" "env-four"})

(t/deftest normalize-repo-url-test
(t/are [expected in] (= expected (sut/normalize-repo-url in))
Expand Down Expand Up @@ -42,6 +71,26 @@
(sut/dep->opts (r/map->Dependency {:repositories {"foo" {:url "s3p://foo"}}
:version "1.0.0-SNAPSHOT"})))))

(t/deftest get-maven-settings-test
(with-redefs [deps.util.maven/get-settings (constantly dummy-settings)
u.lein/getenv #(get dummy-env %)]
(let [settings (sut/get-maven-settings {:repositories dummy-repos})
servers (map #(hash-map
:id (.getId %)
:username (.getUsername %)
:password (.getPassword %))
(.getServers settings))]
(t/is (= 4 (count servers)))

(t/is (= #{{:id "serv1" :username nil :password nil}
;; from settings.xml
{:id "serv2" :username "two-user" :password "two-pass"}
;; from project.clj
{:id "serv3" :username "three-user" :password "three-pass"}
;; from project.clj with environmental variable
{:id "serv4" :username "lein-pass" :password "env-four"}}
(set servers))))))

(t/deftest get-url-test
(let [model (sut/read-pom "pom.xml")]
(t/is (= "https://github.com/liquidz/antq"
Expand Down

0 comments on commit 9421166

Please sign in to comment.