Let deps :tree print a dependency tree

This commit is contained in:
Nelson Morris 2012-03-21 23:43:57 -05:00
parent f28018a075
commit d633fad0b6
4 changed files with 69 additions and 13 deletions

View file

@ -76,6 +76,19 @@
(defn add-auth [repositories] (defn add-auth [repositories]
(map add-repo-auth repositories)) (map add-repo-auth repositories))
(defn- get-dependencies
[dependencies-key {:keys [repositories native-path] :as project}
& {:keys [add-classpath?]}]
{:pre [(every? vector? (project dependencies-key))]}
((if add-classpath?
pomegranate/add-dependencies
aether/resolve-dependencies)
:local-repo (:local-repo project)
:offline? (:offline project)
:repositories (add-auth repositories)
:coordinates (project dependencies-key)
:transfer-listener :stdout))
(defn resolve-dependencies (defn resolve-dependencies
"Simply delegate regular dependencies to pomegranate. This will "Simply delegate regular dependencies to pomegranate. This will
ensure they are downloaded into ~/.m2/repositories and that native ensure they are downloaded into ~/.m2/repositories and that native
@ -85,19 +98,18 @@
Returns a set of the dependencies' files." Returns a set of the dependencies' files."
[dependencies-key {:keys [repositories native-path] :as project} [dependencies-key {:keys [repositories native-path] :as project}
& {:keys [add-classpath?]}] & rest]
{:pre [(every? vector? (project dependencies-key))]}
(doto (set (aether/dependency-files (doto (set (aether/dependency-files
((if add-classpath? (apply get-dependencies dependencies-key project rest)))
pomegranate/add-dependencies
aether/resolve-dependencies)
:local-repo (:local-repo project)
:offline? (:offline project)
:repositories (add-auth repositories)
:coordinates (project dependencies-key)
:transfer-listener :stdout)))
(extract-native-deps native-path))) (extract-native-deps native-path)))
(defn dependency-hierarchy
"Returns a graph of the project's dependencies."
[dependencies-key project]
(aether/dependency-hierarchy
(project dependencies-key)
(get-dependencies dependencies-key project)))
(defn- normalize-path [root path] (defn- normalize-path [root path]
(let [f (io/file path)] (let [f (io/file path)]
(.getAbsolutePath (if (.isAbsolute f) f (io/file root path))))) (.getAbsolutePath (if (.isAbsolute f) f (io/file root path)))))

View file

@ -29,6 +29,17 @@
"commons-fileupload-1.2.1.jar"))} "commons-fileupload-1.2.1.jar"))}
(resolve-dependencies :dependencies project)))) (resolve-dependencies :dependencies project))))
(deftest test-dependency-hierarchy
(doseq [f (reverse (file-seq (io/file (:root project))))]
(when (.exists f) (io/delete-file f)))
(is (= '{[org.clojure/clojure "1.3.0"] nil
[ring/ring-core "1.0.0-RC1"
:exclusions [[commons-codec]]]
{[commons-fileupload "1.2.1"] nil
[commons-io "1.4"] nil
[javax.servlet/servlet-api "2.5"] nil}}
(dependency-hierarchy :dependencies project))))
(def directories (def directories
["/tmp/lein-sample-project/test" ["/tmp/lein-sample-project/test"
"/tmp/lein-sample-project/src" "/tmp/lein-sample-project/src"

View file

@ -1,10 +1,16 @@
(ns leiningen.deps (ns leiningen.deps
"Download all dependencies." "Download all dependencies."
(:require [leiningen.core.classpath :as classpath])) (:require [leiningen.core.classpath :as classpath]
[clojure.pprint :as pp]))
(defn deps (defn deps
"Download all dependencies. "Download all dependencies.
You should never need to invoke this manually." You should never need to invoke this manually."
[project] ([project]
(classpath/resolve-dependencies :dependencies project)) (deps project nil))
([project tree]
(if (= tree ":tree")
(do (pp/pprint (classpath/dependency-hierarchy :dependencies project))
(flush))
(classpath/resolve-dependencies :dependencies project))))

View file

@ -16,6 +16,33 @@
(doseq [[n v] sample-deps] (doseq [[n v] sample-deps]
(is (.exists (m2-dir n v)) (str n " was not downloaded."))))) (is (.exists (m2-dir n v)) (str n " was not downloaded.")))))
(deftest ^:online test-dependency-hierarchy
(let [sample-deps [["ring" "1.0.0"] ["rome" "0.9"] ["jdom" "1.0"]]]
(doseq [[n v] sample-deps]
(delete-file-recursively (m2-dir n v) :silently))
(is (= (with-out-str
(clojure.pprint/pprint
'{[org.clojure/clojure "1.1.0"] nil
[ring "1.0.0"]
{[ring/ring-core "1.0.0"]
{[commons-codec "1.4"] nil
[commons-fileupload "1.2.1"] nil
[commons-io "1.4"] nil
[javax.servlet/servlet-api "2.5"] nil}
[ring/ring-devel "1.0.0"]
{[clj-stacktrace "0.2.2"] nil
[hiccup "0.3.7"] nil
[ns-tracker "0.1.1"]
{[org.clojure/tools.namespace "0.1.0"]
{[org.clojure/java.classpath "0.1.0"] nil}}}
[ring/ring-jetty-adapter "1.0.0"]
{[org.mortbay.jetty/jetty-util "6.1.25"] nil
[org.mortbay.jetty/jetty "6.1.25"]
{[org.mortbay.jetty/servlet-api "2.5-20081211"] nil}}
[ring/ring-servlet "1.0.0"] nil}
[rome "0.9"] {[jdom "1.0"] nil}}))
(with-out-str (deps sample-project ":tree"))))))
(deftest ^:online test-snapshots-releases (deftest ^:online test-snapshots-releases
(let [pr (assoc sample-project :omit-default-repositories true (let [pr (assoc sample-project :omit-default-repositories true
:repositories {"clojars" {:url "http://clojars.org/repo/" :repositories {"clojars" {:url "http://clojars.org/repo/"