From d3dca71ee797e0365195670ed2eef6f190cee15e Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Fri, 30 Dec 2011 12:03:01 -0800 Subject: [PATCH] Download plugins. RT/addURL is a nest of filthy lies. --- bin/lein | 2 +- sample.project.clj | 4 ++++ src/leiningen/deps.clj | 28 ++++++++++++++++++++++------ src/leiningen/jar.clj | 3 ++- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/bin/lein b/bin/lein index 1aa6e389c..e1a89b8fa 100755 --- a/bin/lein +++ b/bin/lein @@ -40,7 +40,7 @@ if [ "$LEIN_HOME" = "" ]; then fi fi -DEV_PLUGINS="$(ls -1 lib/dev/*jar 2> /dev/null)" +DEV_PLUGINS="$(ls -1 lib/dev/*jar .lein-plugins/*jar 2> /dev/null)" USER_PLUGINS="$(ls -1 "$LEIN_HOME"/plugins/*jar 2> /dev/null)" artifact_name () { diff --git a/sample.project.clj b/sample.project.clj index f4fd3d926..cbbc0e787 100644 --- a/sample.project.clj +++ b/sample.project.clj @@ -37,9 +37,13 @@ javax.jms/jms com.sun.jdmk/jmxtools com.sun.jmx/jmxri]]] + ;; The plugins listed here will be accessible in Leiningen's own + ;; process, but not in the project. + :plugins [[lein-tar "1.0.6"]] ;; 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. + ;; These will appear both in Leiningen's process and the project's. :dev-dependencies [[org.clojure/swank-clojure "1.2.1"]] ;; Global exclusions are applied across the board, as an alternative ;; to duplication for multiple depedencies with the same excluded libraries. diff --git a/src/leiningen/deps.clj b/src/leiningen/deps.clj index f0a2184d3..be995731d 100644 --- a/src/leiningen/deps.clj +++ b/src/leiningen/deps.clj @@ -1,6 +1,7 @@ (ns leiningen.deps "Download all dependencies and put them in :library-path." - (:require [lancet.core :as lancet]) + (:require [lancet.core :as lancet] + [clojure.string :as string]) (:use [leiningen.core :only [repositories-for user-settings *current-task* no-dev?]] [leiningen.clean :only [clean]] @@ -109,12 +110,13 @@ (.toString (BigInteger. 1 (-> (MessageDigest/getInstance "SHA1") (.digest (.getBytes content)))) 16)) -(defn- deps-checksum [project] - (sha1-digest (pr-str [(:dependencies project) - (:dev-dependencies project)]))) +(defn- deps-checksum + ([project keys] (sha1-digest (pr-str (map project keys)))) + ([project] (deps-checksum project [:dependencies :dev-dependencies]))) -(defn- new-deps-checksum-file [project] - (File. (:root project) ".lein-deps-sum")) +(defn- new-deps-checksum-file + ([project name] (File. (:root project) name)) + ([project] (new-deps-checksum-file project ".lein-deps-sum"))) (defn- has-dependencies? [project] (some (comp seq project) [:dependencies :dev-dependencies])) @@ -184,11 +186,25 @@ (.mkdirs f) (copy (.getInputStream jar entry) f))))) +(defn download-plugins [project] + (let [dir (.getAbsolutePath (file (:root project) ".lein-plugins"))] + (when (and (seq (:plugins project)) + (or (not (.exists (file dir "checksum"))) + (not= (deps-checksum project [:plugins]) + (slurp (file dir "checksum"))))) + (.setContextClassLoader (Thread/currentThread) (doto classloader prn)) + (doseq [plugin (-> (do-deps (assoc project :library-path dir) :plugins) + .getDirectoryScanner .getIncludedFiles)] + #_(clojure.lang.RT/addURL (str "file://" dir "/" plugin))) + (spit (file dir "checksum") + (deps-checksum project [:plugins]))))) + (defn deps "Download :dependencies and put them in :library-path." [project & [skip-dev]] (when skip-dev (println "WARNING: passing an argument to deps is deprecated.")) + (download-plugins project) (when (fetch-deps? project) (when-not (or (:disable-deps-clean project) (:disable-implicit-clean project)) diff --git a/src/leiningen/jar.clj b/src/leiningen/jar.clj index 2ca4f93a1..d26cecc9d 100644 --- a/src/leiningen/jar.clj +++ b/src/leiningen/jar.clj @@ -35,7 +35,8 @@ ([{:keys [group name version]}] (unix-path (format "%s/%s/%s/%s/%s-%s.jar" - (.getBasedir (make-local-repo)) (.replace group "." "/") name version name version)))) + (.getBasedir (make-local-repo)) + (.replace group "." "/") name version name version)))) (defn- script-classpath-for [project deps-fileset system] (let [deps (when deps-fileset