From e30a38d54943f251878a1d0c3bc26f78340bade6 Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Sat, 15 Jan 2011 09:23:03 -0500 Subject: [PATCH] Skip fetching deps unnecessarily when :checksum-deps is set. --- NEWS | 3 +++ sample.project.clj | 11 +++++++---- src/leiningen/deps.clj | 24 ++++++++++++++++++++---- todo.org | 1 - 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index c674a8ca9..16c2c173f 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ Leiningen NEWS -- history of user-visible changes = 1.5.0 / ??? +* Skip fetching dependencies when they haven't changed in project.clj + if :checksum-deps is set. + * Add system property for $PROJECT.version. * Add deploy task. diff --git a/sample.project.clj b/sample.project.clj index 9d29f3f54..4dd6f3fe9 100644 --- a/sample.project.clj +++ b/sample.project.clj @@ -36,6 +36,13 @@ javax.jms/jms com.sun.jdmk/jmxtools com.sun.jmx/jmxri]]] + ;; Dev dependencies are intended for use only during + ;; development. Projects that depend on this project will not pull + ;; in its dev-dependencies, and they won't be included in the uberjar. + :dev-dependencies [[org.clojure/swank-clojure "1.2.1"]] + ;; Only re-fetch dependencies when they change in project.clj or + ;; when :library-path directory is empty. + :checksum-deps true ;; Warns users of earlier versions of Leiningen. :min-lein-version "1.3.0" ;; Before fetching dependencies, the contents of the lib/ directory @@ -58,10 +65,6 @@ ;; namespaces matching leiningen.hooks.*. Warning: this will cause ;; Leiningen to start slowly, especially with many dependencies. :implicit-hooks false - ;; Dev dependencies are intended for use only during - ;; development. Projects that depend on this project will not pull - ;; in its dev-dependencies, and they won't be included in the uberjar. - :dev-dependencies [[org.clojure/swank-clojure "1.2.1"]] ;; These namespaces will be AOT-compiled. Needed for gen-class and ;; other Java interop functionality. :namespaces is an alias for this. ;; Put a regex here to compile all namespaces whose names match. diff --git a/src/leiningen/deps.clj b/src/leiningen/deps.clj index f5f653b9c..c67bf8d91 100644 --- a/src/leiningen/deps.clj +++ b/src/leiningen/deps.clj @@ -5,6 +5,7 @@ [leiningen.util.maven :only [make-dependency]] [leiningen.util.file :only [delete-file-recursively]]) (:import (java.io File) + (java.security MessageDigest) (org.apache.maven.artifact.ant Authentication DependenciesTask RemoteRepository) (org.apache.maven.settings Server) @@ -68,15 +69,30 @@ (defn use-dev-deps? [project skip-dev] (and (not skip-dev) (seq (:dev-dependencies project)))) +(defn- sha1-digest [content] + (.toString (BigInteger. 1 (-> (MessageDigest/getInstance "SHA1") + (.digest (.getBytes content)))) 16)) + +(defn- deps-checksum [project] + (sha1-digest (pr-str [(:dependencies project) + (:dev-dependencies project)]))) + +(defn fetch-deps? [project deps-set skip-dev] + (let [deps-checksum-file (File. (:root project) ".lein-deps-sum")] + (and (or (seq (project deps-set)) (use-dev-deps? project skip-dev)) + (or (not (:checksum-deps project)) + (empty? (.list (File. (:library-path project)))) + (not (.exists deps-checksum-file)) + (not= (slurp deps-checksum-file) (deps-checksum project)))))) + (defn ^{:help-arglists '([] [skip-dev])} deps "Download and install all :dependencies and :dev-dependencies listed in project.clj. With an argument it will skip development dependencies." ([project skip-dev deps-set] - (when (or (seq (project deps-set)) (use-dev-deps? project skip-dev)) + (when (fetch-deps? project deps-set skip-dev) (when-not (:disable-implicit-clean project) - (delete-file-recursively (:library-path project) true)) - (let [deps-task (make-deps-task project deps-set) - _ (.execute deps-task) + (delete-file-recursively (:library-path project) :silently)) + (let [deps-task (doto (make-deps-task project deps-set) .execute) fileset (.getReference lancet/ant-project (.getFilesetId deps-task))] (.mkdirs (File. (:library-path project))) diff --git a/todo.org b/todo.org index 299dbbcf0..622fdbf61 100644 --- a/todo.org +++ b/todo.org @@ -41,7 +41,6 @@ See also https://github.com/technomancy/leiningen/issues ** TODO re-compile all deps with current clojure version Another thing that's going to start becoming more important as more Clojure versions are introduced. -** TODO fail gracefully when run without an Internet connection (Issue #100) ** TODO improve test coverage ** TODO merge push task based on clj-ssh lein-clojars task doesn't support DSA keys