From 7d57e70e3f1bc1915dac0dcc45b7307f4c1977cd Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Thu, 4 Feb 2010 10:36:43 -0500 Subject: [PATCH] Differentiate between no compilable namespaces and no stale namespaces. --- src/leiningen/compile.clj | 53 +++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/leiningen/compile.clj b/src/leiningen/compile.clj index 689f8ff1..4ce7d5cc 100644 --- a/src/leiningen/compile.clj +++ b/src/leiningen/compile.clj @@ -9,22 +9,31 @@ java.lang.management.ManagementFactory (org.apache.tools.ant.types Environment$Variable Path))) -(defn namespaces-to-compile - "Returns a seq of the namespaces which need compiling." +(defn compilable-namespaces + "Retrns a seq of the namespaces that are compilable, regardless of whether + their class files are present and up-to-date." [project] ;; TODO: Compile :main ns if needed - (for [n (cond (coll? (:namespaces project)) - (:namespaces project) - (= :all (:namespaces project)) - (find-namespaces-in-dir (file (:source-path project)))) - :let [ns-file (str (-> (name n) - (.replaceAll "\\." "/") - (.replaceAll "-" "_")))] - :when (> (.lastModified (file (:source-path project) - (str ns-file ".clj"))) - (.lastModified (file (:compile-path project) - (str ns-file "__init.class"))))] - n)) + (cond + (coll? (:namespaces project)) + (:namespaces project) + (= :all (:namespaces project)) + (find-namespaces-in-dir (file (:source-path project))))) + +(defn stale-namespaces + "Given a seq of namespaces that are both compilable and that hav missing or + out-of-date class files." + [project] + (filter + (fn [n] + (let [ns-file (str (-> (name n) + (.replaceAll "\\." "/") + (.replaceAll "-" "_")))] + (> (.lastModified (file (:source-path project) + (str ns-file ".clj"))) + (.lastModified (file (:compile-path project) + (str ns-file "__init.class")))))) + (compilable-namespaces project))) (defn find-lib-jars "Returns a seq of Files for all the jars in the project's library directory." @@ -130,18 +139,18 @@ (defn compile "Ahead-of-time compile the project. Looks for all namespaces under src/ -unless a list of :namespaces is provided in project.clj." + unless a list of :namespaces is provided in project.clj." [project] ;; dependencies should be resolved by explicit "lein deps", ;; otherwise it will be done only if :library-path is empty (when (empty? (find-lib-jars project)) (deps project :skip-dev)) (.mkdir (file (:compile-path project))) - (let [namespaces (namespaces-to-compile project)] - (if (seq namespaces) + (if (compilable-namespaces project) + (if-let [namespaces (seq (stale-namespaces project))] (eval-in-project project - `(doseq [namespace# '~namespaces] - (println "Compiling" namespace#) - (clojure.core/compile namespace#))) - (println "No :namespaces listed for compilation in project.clj.")))) - + `(doseq [namespace# '~namespaces] + (println "Compiling" namespace#) + (clojure.core/compile namespace#))) + (println "All :namespaces already compiled.")) + (println "No :namespaces listed for compilation in project.clj.")))