From 268d72379697b73e2672eff191ab83030fc63c33 Mon Sep 17 00:00:00 2001 From: Chas Emerick Date: Wed, 5 Sep 2012 07:59:28 -0400 Subject: [PATCH] Add support for: * namespaced keywords to control lookup of credentials in env vars * using a vector to define a number of credential sources to be checked in series (gh-768) --- .../src/leiningen/core/classpath.clj | 2 +- leiningen-core/src/leiningen/core/project.clj | 1 + leiningen-core/src/leiningen/core/user.clj | 39 ++++++++++++------- .../test/leiningen/core/test/classpath.clj | 4 +- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/leiningen-core/src/leiningen/core/classpath.clj b/leiningen-core/src/leiningen/core/classpath.clj index c179c34f..ee027e62 100644 --- a/leiningen-core/src/leiningen/core/classpath.clj +++ b/leiningen-core/src/leiningen/core/classpath.clj @@ -81,7 +81,7 @@ would be applied to all repositories with URLs matching the regex key that didn't have an explicit entry." [[id repo]] - [id (-> repo user/profile-auth user/gpg-auth user/env-auth)]) + [id (-> repo user/profile-auth user/resolve-credentials)]) (defn get-proxy-settings "Returns a map of the JVM proxy settings" diff --git a/leiningen-core/src/leiningen/core/project.clj b/leiningen-core/src/leiningen/core/project.clj index 8521fe6f..0e7276e5 100755 --- a/leiningen-core/src/leiningen/core/project.clj +++ b/leiningen-core/src/leiningen/core/project.clj @@ -43,6 +43,7 @@ ;; TODO: point to releases-only before 2.0 is out ["clojars" {:url "https://clojars.org/repo/"}]] :deploy-repositories [["clojars" {:url "https://clojars.org/repo/" + :username :gpg :password :gpg}]] :jar-exclusions [#"^\."] :jvm-opts ["-XX:+TieredCompilation"] diff --git a/leiningen-core/src/leiningen/core/user.clj b/leiningen-core/src/leiningen/core/user.clj index 856ec622..178a1014 100644 --- a/leiningen-core/src/leiningen/core/user.clj +++ b/leiningen-core/src/leiningen/core/user.clj @@ -56,16 +56,6 @@ (def credentials (memoize credentials-fn)) -(defn- env-auth-key [settings [k v]] - (assoc settings k (if (= :env v) - (System/getenv (str "LEIN_" (str/upper-case (name k)))) - v))) - -(defn env-auth - "Replace all :env values in map with LEIN_key environment variables." - [settings] - (reduce env-auth-key {} settings)) - (defn- match-credentials [settings auth-map] (get auth-map (:url settings) (first (for [[re? cred] auth-map @@ -73,12 +63,31 @@ (re-find re? (:url settings)))] cred)))) -(defn gpg-auth - "Merge values from ~/.lein/credentials.gpg if settings include :gpg." +(defn- resolve-credential + [source-settings result [k v]] + (letfn [(resolve [v] + (cond + (= :env v) + (System/getenv (str "LEIN_" (str/upper-case (name k)))) + + (and (keyword? v) (= "env" (namespace v))) + (System/getenv (str/upper-case (name v))) + + (= :gpg v) + (get (match-credentials source-settings (credentials)) k) + + (coll? v) + (->> (map resolve v) + (remove nil?) + first) + :else v))] + (assoc result k (resolve v)))) + +(defn resolve-credentials + "Applies credentials from environment or ~/.lein/credentials.clj.gpg + as they are specified and available." [settings] - (if (some (partial = :gpg) (vals settings)) - (merge settings (match-credentials settings (credentials))) - settings)) + (reduce (partial resolve-credential settings) (empty settings) settings)) (def profile-auth-warn (delay (println "Warning: :repository-auth in the :auth profile is deprecated.") diff --git a/leiningen-core/test/leiningen/core/test/classpath.clj b/leiningen-core/test/leiningen/core/test/classpath.clj index d7a35e8d..ed6a0449 100644 --- a/leiningen-core/test/leiningen/core/test/classpath.clj +++ b/leiningen-core/test/leiningen/core/test/classpath.clj @@ -92,9 +92,9 @@ :username "flynn" :password "flotilla"}] ["sonatype" {:url "https://oss.sonatype.org/"}] ["internal" {:password "reindur" :username "milgrim" - :url "https://sekrit.info/repo" :creds :gpg}]] + :url "https://sekrit.info/repo"}]] (map add-repo-auth [["clojars" {:url "http://clojars.org/repo"}] ["sonatype" {:url "https://oss.sonatype.org/"}] ["internal" {:url "https://sekrit.info/repo" - :creds :gpg}]]))))) + :username :gpg :password :gpg}]])))))