From 665ad07b7477883d5f7110dd71465fe097bc7b29 Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Fri, 6 May 2011 21:11:14 -0700 Subject: [PATCH] Merge native-deps functionality. Needs more testing. --- src/leiningen/deps.clj | 86 ++++++++++++++++++------------------ src/leiningen/install.clj | 3 +- src/leiningen/jar.clj | 3 +- src/leiningen/plugin.clj | 2 +- test/leiningen/test/deps.clj | 3 +- todo.org | 3 +- 6 files changed, 51 insertions(+), 49 deletions(-) diff --git a/src/leiningen/deps.clj b/src/leiningen/deps.clj index 67ef8f2c..5256a874 100644 --- a/src/leiningen/deps.clj +++ b/src/leiningen/deps.clj @@ -77,7 +77,7 @@ (symlink {:link destination :resource (.getCanonicalPath (File. dir f))})))) -(defn make-deps-task [project deps-set] +(defn make-deps-task [project & [deps-set]] (let [deps-task (DependenciesTask.)] (.setProject deps-task lancet/ant-project) ;; in maven-ant-tasks (at least 2.0.10 and 2.1.1) if there's an @@ -95,62 +95,64 @@ (.setPathId deps-task (:name project)) (doseq [repo (make-repositories project)] (.addConfiguredRemoteRepository deps-task repo)) - (doseq [dep (project deps-set)] + (doseq [dep (project (or deps-set :dependencies))] (.addDependency deps-task (make-dependency dep project))) deps-task)) -(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)]))) + (:dev-dependencies project) + (:native-dependencies project)]))) (defn- new-deps-checksum-file [project] (File. (:root project) ".lein-deps-sum")) -(defn fetch-deps? [project deps-set skip-dev] +(defn- has-dependencies? [project] + (some (comp seq project) [:dependencies :dev-dependencies + :native-dependencies])) + +(defn fetch-deps? [project] (let [deps-checksum-file (new-deps-checksum-file project)] - (and (or (seq (project deps-set)) (use-dev-deps? project skip-dev)) - (or (not (:checksum-deps project)) - (not (:checksum-deps (user-settings))) - (empty? (.list (File. (:library-path project)))) + (and (has-dependencies? project) + (or (empty? (.list (File. (:library-path project)))) + (not (:checksum-deps project (:checksum-deps (user-settings)))) (not (.exists deps-checksum-file)) (not= (slurp deps-checksum-file) (deps-checksum project)))))) -(defn ^{:help-arglists '([])} deps +(defn deps "Download :dependencies and put them in :library-path." - ([project skip-dev deps-set] - (when (fetch-deps? project deps-set skip-dev) - (when-not (or (:disable-deps-clean project) - (:disable-implicit-clean project)) - (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))) - (copy-dependencies (:jar-behavior project) - ;; Leiningen's process only has access to lib/dev. - (if (:eval-in-leiningen project) - "lib/dev" - (:library-path project)) - true fileset) - (when (use-dev-deps? project skip-dev) - ;; TODO: skip-dev/deps-set args are nonsense; we should - ;; just replace :dependencies with :dev-dependencies and - ;; recur in 2.0. - (deps (assoc project :library-path (str (:root project) "/lib/dev") - :disable-implicit-clean (if (:eval-in-leiningen project) - false - (:disable-implicit-clean - project))) - true :dev-dependencies)) - (when (:checksum-deps project) - (spit (new-deps-checksum-file project) (deps-checksum project))) - fileset))) - ([project skip-dev] (deps project skip-dev :dependencies)) - ([project] (deps project false))) + [project] + (when (fetch-deps? project) + (when-not (or (:disable-deps-clean project) + (:disable-implicit-clean project)) + (delete-file-recursively (:library-path project) :silently)) + (let [deps-task (make-deps-task project)] + (when (seq (:dependencies project)) + (.execute deps-task) + (.mkdirs (File. (:library-path project))) + (copy-dependencies (:jar-behavior project) + ;; Leiningen's process only has access to lib/dev. + (if (:eval-in-leiningen project) + "lib/dev" + (:library-path project)) + true (.getReference lancet/ant-project + (.getFilesetId deps-task)))) + (when (seq (:native-dependencies project)) + (deps (assoc project :disable-deps-clean true + :dependencies (:native-dependencies project) + :native-dependencies nil :dev-dependencies nil))) + (when (seq (:dev-dependencies project)) + (deps (assoc project :library-path (str (:root project) "/lib/dev") + :dependencies (:dev-dependencies project) + :native-dependencies nil :dev-dependencies nil + :disable-implicit-clean (if (:eval-in-leiningen project) + false + (:disable-implicit-clean + project))))) + (when (:checksum-deps project) + (spit (new-deps-checksum-file project) (deps-checksum project))) + (.getReference lancet/ant-project (.getFilesetId deps-task))))) diff --git a/src/leiningen/install.clj b/src/leiningen/install.clj index c9e09a00..b95f9d39 100644 --- a/src/leiningen/install.clj +++ b/src/leiningen/install.clj @@ -67,6 +67,7 @@ shell wrappers in ~/.lein/bin when provided." ;; TODO: use lancet/unjar? (try (extract-jar (file jarfile) temp-project) (binding [copy-dependencies (constantly nil)] - (deps (read-project (format "%s/project.clj" temp-project)) true)) + (deps (dissoc (read-project (format "%s/project.clj" temp-project)) + :dev-dependencies :native-dependencies))) (finally (delete-file-recursively temp-project :silently)))))) diff --git a/src/leiningen/jar.clj b/src/leiningen/jar.clj index 43e764a1..97b1a244 100644 --- a/src/leiningen/jar.clj +++ b/src/leiningen/jar.clj @@ -202,7 +202,8 @@ function in that namespace will be used as the main-class for executable jar." deps (memoize deps)] (when (zero? (compile/compile project)) (let [jar-path (get-jar-filename project jar-name) - deps-fileset (deps project)] + deps-fileset (deps (dissoc project :dev-dependencies + :native-dependencies))] (write-jar project jar-path (filespecs project deps-fileset)) (println "Created" jar-path) jar-path)))) diff --git a/src/leiningen/plugin.clj b/src/leiningen/plugin.clj index 8fb87131..a296b770 100644 --- a/src/leiningen/plugin.clj +++ b/src/leiningen/plugin.clj @@ -37,7 +37,7 @@ Syntax: lein plugin install [GROUP/]ARTIFACT-ID VERSION _ (extract-jar (file jarfile) temp-project) project (read-project (str (file temp-project "project.clj"))) standalone-filename (plugin-standalone-filename group name version)] - (deps (dissoc project :dev-dependencies)) + (deps (dissoc project :dev-dependencies :native-dependencies)) (with-open [out (-> (file plugins-path standalone-filename) (FileOutputStream.) (ZipOutputStream.))] diff --git a/test/leiningen/test/deps.clj b/test/leiningen/test/deps.clj index cc42fde2..4b321b91 100644 --- a/test/leiningen/test/deps.clj +++ b/test/leiningen/test/deps.clj @@ -25,8 +25,7 @@ (let [jars (set (map #(.getName %) (.listFiles (file (:root dev-deps-project) "lib" "dev"))))] - (doseq [j ["clojure-1.2.0.jar"]] - (is (jars j))))) + (is (contains? jars "clojure-1.2.0.jar")))) (deftest test-snapshots-releases (try diff --git a/todo.org b/todo.org index afdad14b..b26cd7f7 100644 --- a/todo.org +++ b/todo.org @@ -40,12 +40,11 @@ See also https://github.com/technomancy/leiningen/issues - improve test coverage - new push task based on clj-ssh lein-clojars task doesn't support DSA keys - - merge lucene-based lein-search plugin * For 1.6 - Merge lein-search - Merge lein-retest - Merge native-deps - - Add leiningen.util.inject namespace + - Add leiningen.util.injected namespace - Trampoline functionality http://groups.google.com/group/leiningen/browse_thread/thread/a07a7f10edb77c9b * For 1.5.1