From 88181a4bbfc992c3a1b7c78a60b8fbb9b2dd0ae6 Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Tue, 22 Apr 2014 15:03:34 -0700 Subject: [PATCH] Use dep-key for distinct call in pom task. group/artifact version tuple isn't enough to de-dupe correctly. Fixes #1494. --- leiningen-core/src/leiningen/core/classpath.clj | 2 -- leiningen-core/src/leiningen/core/project.clj | 4 ++-- src/leiningen/pom.clj | 15 +++++++-------- test/leiningen/test/pom.clj | 9 ++++++++- test_projects/native/project.clj | 2 ++ 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/leiningen-core/src/leiningen/core/classpath.clj b/leiningen-core/src/leiningen/core/classpath.clj index 092ccd7b..1ffd589e 100644 --- a/leiningen-core/src/leiningen/core/classpath.clj +++ b/leiningen-core/src/leiningen/core/classpath.clj @@ -288,8 +288,6 @@ #(-> % aether/repository-session (pedantic/use-transformer ranges overrides)))) -;; Exclusion(groupId, artifactId, classifier, extension) - (defn ^:internal get-dependencies [dependencies-key project & args] (let [ranges (atom []), overrides (atom []) session (pedantic-session project ranges overrides) diff --git a/leiningen-core/src/leiningen/core/project.clj b/leiningen-core/src/leiningen/core/project.clj index c1aca410..ecc137b2 100644 --- a/leiningen-core/src/leiningen/core/project.clj +++ b/leiningen-core/src/leiningen/core/project.clj @@ -193,11 +193,11 @@ #"META-INF/services/.*" `[slurp str spit]} :global-vars {}}) -(defn- dep-key +(defn dep-key "The unique key used to dedupe dependencies." [dep] (-> (dependency-map dep) - (select-keys [:group-id :artifact-id :classifier :extension]))) + (select-keys [:group-id :artifact-id :classifier :extension]))) (defn- reduce-dep-step [deps dep] (let [k (dep-key dep)] diff --git a/src/leiningen/pom.clj b/src/leiningen/pom.clj index fb4f4e2e..4d571077 100644 --- a/src/leiningen/pom.clj +++ b/src/leiningen/pom.clj @@ -315,7 +315,12 @@ ([_ project] (let [reprofile #(-> project (project/merge-profiles %) (relativize)) provided-project (reprofile [:provided]) - test-project (reprofile [:base :provided :dev :test])] + test-project (reprofile [:base :provided :dev :test]) + deps (concat (->> project :dependencies) + (->> provided-project :dependencies + (map (partial make-scope "provided"))) + (->> test-project :dependencies + (map (partial make-scope "test"))))] (list [:project {:xsi:schemaLocation (str "http://maven.apache.org/POM/4.0.0" @@ -338,13 +343,7 @@ (write-scm-tag (guess-scm project) project) (xml-tags :build [project test-project]) (xml-tags :repositories (:repositories project)) - (xml-tags :dependencies - (->> (concat (->> project :dependencies) - (->> provided-project :dependencies - (map (partial make-scope "provided"))) - (->> test-project :dependencies - (map (partial make-scope "test")))) - (distinct-key (partial take 2)))) + (xml-tags :dependencies (distinct-key project/dep-key deps)) (and (:pom-addition project) (:pom-addition project))])))) (defn snapshot? [project] diff --git a/test/leiningen/test/pom.clj b/test/leiningen/test/pom.clj index c16e4da3..54d633eb 100644 --- a/test/leiningen/test/pom.clj +++ b/test/leiningen/test/pom.clj @@ -297,10 +297,17 @@ (is (re-find #"(?m)^\s+nomnomnom$" (make-pom sample-project)))) - (deftest test-snapshot-checking (binding [main/*exit-process?* false] (let [project (vary-meta sample-project update-in [:without-profiles] assoc :version "1.0" :dependencies [['clojure "1.0.0-SNAPSHOT"]])] (is (thrown? Exception (pom project)))))) + +(deftest test-classifier-kept + (let [xml (xml/parse-str (make-pom lthelper/native-project))] + (is (= [["gdx-platform" nil] ["gdx-platform" "natives-desktop"]] + (for [dep (deep-content xml [:project :dependencies]) + :let [artifact (first-in dep [:dependency :artifactId])] + :when (= "gdx-platform" artifact)] + [artifact (first-in dep [:dependency :classifier])]))))) diff --git a/test_projects/native/project.clj b/test_projects/native/project.clj index ce226b5e..a90dbf62 100644 --- a/test_projects/native/project.clj +++ b/test_projects/native/project.clj @@ -4,6 +4,8 @@ :dependencies [[org.clojure/clojure "1.4.0"] [serial-port "1.0.7"] [penumbra/lwjgl "2.4.2"] + [com.badlogicgames.gdx/gdx-platform "0.9.9"] + [com.badlogicgames.gdx/gdx-platform "0.9.9" :classifier "natives-desktop"] [org.clojars.samaaron/rxtx "2.2.0"] [jriengine "0.8.4"] [tokyocabinet "1.24.0"]])