Merge remote branch 'mtyaka/windows-updates'

Conflicts:
	src/leiningen/jar.clj
	test/test_jar.clj
This commit is contained in:
Phil Hagelberg 2010-11-18 21:21:05 -08:00
commit c85aaf83a5
19 changed files with 210 additions and 90 deletions

View file

@ -69,10 +69,8 @@ set JLINE=jline.ConsoleRunner
:SKIP_JLINE :SKIP_JLINE
if "x%JAVA_CMD%" == "x" set JAVA_CMD="java" if "x%JAVA_CMD%" == "x" set JAVA_CMD="java"
set CLOJURE_JAR=%USERPROFILE%\.m2\repository\org\clojure\clojure\1.2.0\clojure-1.2.0.jar
%JAVA_CMD% -client %JAVA_OPTS% -Dleiningen.original.pwd="%ORIGINAL_PWD%" ^ goto RUN
-cp %CLASSPATH% %JLINE% clojure.main -e "(use 'leiningen.core)(-main)" NUL %*
goto EOF
:NO_LEIN_JAR :NO_LEIN_JAR
@ -170,4 +168,15 @@ goto :LOOK_AGAIN
set PARENT_PATH=%~f1 set PARENT_PATH=%~f1
goto :EOF goto :EOF
:RUN
rem Need to disable delayed expansion because the %* variable
rem may contain bangs (as in test!).
setLocal DisableDelayedExpansion
%JAVA_CMD% -client %JAVA_OPTS% -Xbootclasspath/a:"%CLOJURE_JAR%" ^
-Dleiningen.original.pwd="%ORIGINAL_PWD%" ^
-cp %CLASSPATH% %JLINE% clojure.main -e "(use 'leiningen.core)(-main)" NUL %*
goto EOF
:EOF :EOF

View file

@ -1,6 +1,12 @@
#!/bin/sh #!/bin/sh
CLASSPATH="%s" CLASSPATH="%s"
NULL_DEVICE=/dev/null
if [ "$OSTYPE" = "cygwin" ]; then
CLASSPATH=`cygpath -wp "$CLASSPATH"`
NULL_DEVICE=NUL
fi
java -cp "$CLASSPATH" $JAVA_OPTS \ java -cp "$CLASSPATH" $JAVA_OPTS \
clojure.main -e "(use '%s)(apply -main *command-line-args*)" /dev/null "$@" clojure.main -e "(use '%s)(apply -main *command-line-args*)" $NULL_DEVICE "$@"

View file

@ -0,0 +1,6 @@
@echo off
set CLASSPATH="%s"
java -cp "%%CLASSPATH%%" %%JAVA_OPTS%% ^
clojure.main -e "(use '%s)(apply -main *command-line-args*)" NUL %%*

View file

@ -110,10 +110,25 @@
f f
nil)))) nil))))
(defn- get-jvm-args ;; Split this function out for better testability.
[project] (defn- get-raw-input-args []
(concat (.getInputArguments (ManagementFactory/getRuntimeMXBean)) (.getInputArguments (ManagementFactory/getRuntimeMXBean)))
(:jvm-opts project)))
(defn- get-input-args
"Returns a vector of input arguments, accounting for a bug in RuntimeMXBean
that splits arguments which contain spaces."
[]
;; RuntimeMXBean.getInputArguments() is buggy when an input argument
;; contains spaces. For an input argument of -Dprop="hello world" it
;; returns ["-Dprop=hello", "world"]. Try to work around this bug.
(letfn [(join-broken-args [v arg] (if (= \- (first arg))
(conj v arg)
(conj (vec (butlast v))
(format "%s %s" (last v) arg))))]
(reduce join-broken-args [] (get-raw-input-args))))
(defn- get-jvm-args [project]
(concat (get-input-args) (:jvm-opts project)))
(defn get-readable-form [java project form init] (defn get-readable-form [java project form init]
(let [cp (str (.getClasspath (.getCommandLine java))) (let [cp (str (.getClasspath (.getCommandLine java)))
@ -170,6 +185,7 @@
(.setClasspath java (apply make-path (get-classpath project))) (.setClasspath java (apply make-path (get-classpath project)))
(.setFailonerror java true) (.setFailonerror java true)
(.setFork java true) (.setFork java true)
(.setDir java (file (:root project)))
(doseq [arg (get-jvm-args project)] (doseq [arg (get-jvm-args project)]
(when-not (re-matches #"^-Xbootclasspath.+" arg) (when-not (re-matches #"^-Xbootclasspath.+" arg)
(.setValue (.createJvmarg java) arg))) (.setValue (.createJvmarg java) arg)))
@ -218,6 +234,7 @@ those given as command-line arguments."
(javac project)) (javac project))
(if (seq (compilable-namespaces project)) (if (seq (compilable-namespaces project))
(if-let [namespaces (seq (stale-namespaces project))] (if-let [namespaces (seq (stale-namespaces project))]
(binding [*skip-auto-compile* true] (binding [*skip-auto-compile* true]
(try (try
(if (zero? (eval-in-project project (if (zero? (eval-in-project project

View file

@ -21,37 +21,47 @@
;; any namespace due to load-file; we can't just create a var with ;; any namespace due to load-file; we can't just create a var with
;; def or we would not have access to it once load-file returned. ;; def or we would not have access to it once load-file returned.
`(let [m# (apply hash-map ~(cons 'list (unquote-project args))) `(let [m# (apply hash-map ~(cons 'list (unquote-project args)))
root# ~(.getParent (File. *file*))] root# ~(.getParent (File. *file*))
normalize-path# (fn [p#] (when p# (.getPath (File. p#))))]
(alter-var-root #'project (alter-var-root #'project
(fn [_#] (assoc m# (fn [_#] (assoc m#
:name ~(name project-name) :name ~(name project-name)
:group ~(or (namespace project-name) :group ~(or (namespace project-name)
(name project-name)) (name project-name))
:version ~version :version ~version
:compile-path (or (:compile-path m#) :compile-path (normalize-path#
(str root# "/classes")) (or (:compile-path m#)
:source-path (or (:source-path m#) (str root# "/classes")))
(str root# "/src")) :source-path (normalize-path#
:library-path (or (:library-path m#) (or (:source-path m#)
(str root# "/lib")) (str root# "/src")))
:test-path (or (:test-path m#) :library-path (normalize-path#
(str root# "/test")) (or (:library-path m#)
:resources-path (or (:resources-path m#) (str root# "/lib")))
(str root# "/resources")) :test-path (normalize-path#
(or (:test-path m#)
(str root# "/test")))
:resources-path (normalize-path#
(or (:resources-path m#)
(str root# "/resources")))
:dev-resources-path :dev-resources-path
(or (:dev-resources-path m#) (normalize-path#
(:test-resources-path m#) (or (:dev-resources-path m#)
(str root# "/test-resources")) (:test-resources-path m#)
(str root# "/test-resources")))
;; TODO: remove in 2.0 ;; TODO: remove in 2.0
:test-resources-path :test-resources-path
(or (:dev-resources-path m#) (normalize-path#
(:test-resources-path m#) (or (:dev-resources-path m#)
(str root# "/test-resources")) (:test-resources-path m#)
:target-dir (or (:target-dir m#) (:jar-dir m#) (str root# "/test-resources")))
root#) :target-dir (normalize-path#
(or (:target-dir m#) (:jar-dir m#)
root#))
;; TODO: remove in 2.0 ;; TODO: remove in 2.0
:jar-dir (or (:target-dir m#) (:jar-dir m#) :jar-dir (normalize-path#
root#) (or (:target-dir m#) (:jar-dir m#)
root#))
:root root#))) :root root#)))
(when (:test-resources-path m#) (when (:test-resources-path m#)
(println (str "WARNING: :test-resources-path is deprecated; use " (println (str "WARNING: :test-resources-path is deprecated; use "

View file

@ -6,7 +6,7 @@
[leiningen.util.maven :only [container make-model make-remote-artifact [leiningen.util.maven :only [container make-model make-remote-artifact
make-remote-repo make-local-repo make-remote-repo make-local-repo
make-artifact add-metadata]] make-artifact add-metadata]]
[leiningen.util.file :only [delete-file-recursively]] [leiningen.util.file :only [tmp-dir delete-file-recursively]]
[leiningen.pom :only [pom]] [leiningen.pom :only [pom]]
[clojure.java.io :only [file copy]]) [clojure.java.io :only [file copy]])
(:import [java.util.jar JarFile] (:import [java.util.jar JarFile]
@ -16,14 +16,16 @@
(defn bin-path [] (defn bin-path []
(doto (file (home-dir) "bin") .mkdirs)) (doto (file (home-dir) "bin") .mkdirs))
(defn install-shell-wrapper [jarfile] (defn install-shell-wrappers [jarfile]
(when-let [bin-name ((manifest-map (.getManifest jarfile)) (when-let [bin-name ((manifest-map (.getManifest jarfile))
"Leiningen-shell-wrapper")] "Leiningen-shell-wrapper")]
(let [bin-file (file (bin-path) (last (.split bin-name "/")))] (doseq [entry-path [bin-name (format "%s.bat" bin-name)]]
(.mkdirs (.getParentFile bin-file)) (let [bin-file (file (bin-path) (last (.split entry-path "/")))]
(println "Installing shell wrapper to" (.getAbsolutePath bin-file)) (.mkdirs (.getParentFile bin-file))
(copy (.getInputStream jarfile (.getEntry jarfile bin-name)) bin-file) (when-let [zip-entry (.getEntry jarfile entry-path)]
(.setExecutable bin-file true)))) (println "Installing shell wrapper to" (.getAbsolutePath bin-file))
(copy (.getInputStream jarfile zip-entry) bin-file)
(.setExecutable bin-file true))))))
(defn standalone-download [name group version] (defn standalone-download [name group version]
(.resolveAlways (.lookup container ArtifactResolver/ROLE) (.resolveAlways (.lookup container ArtifactResolver/ROLE)
@ -45,15 +47,15 @@ from a remote repository. May place shell wrappers in ~/.lein/bin."
;; generated and installed in local repo ;; generated and installed in local repo
(if (not= "pom" (.getPackaging model)) (if (not= "pom" (.getPackaging model))
(add-metadata artifact (file (pom project)))) (add-metadata artifact (file (pom project))))
(install-shell-wrapper (JarFile. jarfile)) (install-shell-wrappers (JarFile. jarfile))
(.install installer jarfile artifact local-repo))) (.install installer jarfile artifact local-repo)))
([project-name version] ([project-name version]
(let [[name group] ((juxt name namespace) (symbol project-name)) (let [[name group] ((juxt name namespace) (symbol project-name))
_ (standalone-download name (or group name) version) _ (standalone-download name (or group name) version)
temp-project (format "/tmp/lein-%s" (java.util.UUID/randomUUID)) temp-project (format "%s/lein-%s" tmp-dir (java.util.UUID/randomUUID))
jarfile (-> (local-repo-path name (or group name) version) jarfile (-> (local-repo-path name (or group name) version)
(.replace "$HOME" (System/getenv "HOME")))] (.replace "$HOME" (System/getProperty "user.home")))]
(install-shell-wrapper (JarFile. jarfile)) (install-shell-wrappers (JarFile. jarfile))
;; TODO: use lancet/unjar? ;; TODO: use lancet/unjar?
(try (extract-jar (file jarfile) temp-project) (try (extract-jar (file jarfile) temp-project)
(binding [*ns* (the-ns 'leiningen.core) (binding [*ns* (the-ns 'leiningen.core)

View file

@ -1,10 +1,10 @@
(ns leiningen.jar (ns leiningen.jar
"Create a jar containing the compiled code and original source." "Create a jar containing the compiled code and original source."
(:require [leiningen.compile :as compile] (:require [leiningen.compile :as compile]
[clojure.string :as string]) [clojure.string :as string]
[lancet])
(:use [leiningen.pom :only [make-pom make-pom-properties]] (:use [leiningen.pom :only [make-pom make-pom-properties]]
[leiningen.deps :only [deps]] [leiningen.deps :only [deps]]
[lancet :only [ant-project]]
[clojure.java.io :only [copy file]]) [clojure.java.io :only [copy file]])
(:import [java.util.jar Manifest JarEntry JarOutputStream] (:import [java.util.jar Manifest JarEntry JarOutputStream]
[java.util.regex Pattern] [java.util.regex Pattern]
@ -12,44 +12,71 @@
[java.io BufferedOutputStream FileOutputStream [java.io BufferedOutputStream FileOutputStream
ByteArrayInputStream])) ByteArrayInputStream]))
(def bin-template (-> (.getContextClassLoader (Thread/currentThread)) (defn- read-resource [resource-name]
(.getResourceAsStream "script-template") (-> (.getContextClassLoader (Thread/currentThread))
(slurp))) (.getResourceAsStream resource-name)
(slurp)))
(defn- read-bin-template [system]
(case system
:unix (read-resource "script-template")
:windows (read-resource "script-template.bat")))
(defn unix-path [path]
(.replace path "\\" "/"))
(defn windows-path [path]
(.replace path "/" "\\"))
(defn local-repo-path (defn local-repo-path
([group name version] ([group name version]
(local-repo-path {:group group :name name :version version})) (local-repo-path {:group group :name name :version version}))
([{:keys [group name version]}] ([{:keys [group name version]}]
(format "$HOME/.m2/repository/%s/%s/%s/%s-%s.jar" (unix-path (format
(.replaceAll group "\\." "/") name version name version))) "$HOME/.m2/repository/%s/%s/%s/%s-%s.jar"
(.replace group "." "/") name version name version))))
(defn- script-classpath-for [project deps-fileset] (defn- script-classpath-for [project deps-fileset system]
(string/join ":" (conj (for [dep (when (:dependencies project) (let [deps (when deps-fileset
(-> deps-fileset (-> deps-fileset
(.getDirectoryScanner ant-project) (.getDirectoryScanner lancet/ant-project)
(.getIncludedFiles)))] (.getIncludedFiles)))
(format "$HOME/.m2/repository/%s" dep)) unix-paths (conj (for [dep deps]
(local-repo-path project)))) (unix-path (format "$HOME/.m2/repository/%s" dep)))
(local-repo-path project))]
(case system
:unix (string/join ":" unix-paths)
:windows (string/join ";" (for [path unix-paths]
(windows-path
(.replace path "$HOME"
"%USERPROFILE%")))))))
(defn- shell-wrapper-name [project] (defn- shell-wrapper-name [project]
(or (:bin (:shell-wrapper project) (get-in project [:shell-wrapper :bin]
(format "bin/%s" (:name project))))) (format "bin/%s" (:name project))))
(defn- shell-wrapper-contents [project bin-name main deps-fileset] (defn- shell-wrapper-contents [project bin-name main deps-fileset system]
(let [bin-file (file bin-name)] (let [file-name (case system
:unix bin-name
:windows (format "%s.bat" bin-name))
bin-file (file file-name)]
(format (if (.exists bin-file) (format (if (.exists bin-file)
(slurp bin-file) (slurp bin-file)
bin-template) (read-bin-template system))
(script-classpath-for project deps-fileset) main))) (script-classpath-for project deps-fileset system) main)))
(defn- shell-wrapper-filespecs [project deps-fileset] (defn- shell-wrapper-filespecs [project deps-fileset]
(when (:shell-wrapper project) (when (:shell-wrapper project)
(let [main (or (:main (:shell-wrapper project)) (:main project)) (let [main (or (:main (:shell-wrapper project)) (:main project))
bin-name (shell-wrapper-name project) bin-name (shell-wrapper-name project)
bin (shell-wrapper-contents project bin-name main deps-fileset)] read-bin #(shell-wrapper-contents
project bin-name main deps-fileset %)]
[{:type :bytes [{:type :bytes
:path bin-name :path bin-name
:bytes (.getBytes bin)}]))) :bytes (.getBytes (read-bin :unix))}
{:type :bytes
:path (format "%s.bat" bin-name)
:bytes (.getBytes (read-bin :windows))}])))
(def default-manifest (def default-manifest
{"Created-By" (str "Leiningen " (System/getenv "LEIN_VERSION")) {"Created-By" (str "Leiningen " (System/getenv "LEIN_VERSION"))
@ -73,9 +100,6 @@
(let [attrs (.getMainAttributes manifest)] (let [attrs (.getMainAttributes manifest)]
(zipmap (map str (keys attrs)) (vals attrs)))) (zipmap (map str (keys attrs)) (vals attrs))))
(defn unix-path [path]
(.replaceAll path "\\\\" "/"))
(defn skip-file? [file relative-path patterns] (defn skip-file? [file relative-path patterns]
(or (.isDirectory file) (or (.isDirectory file)
(re-find #"^\.?#" (.getName file)) (re-find #"^\.?#" (.getName file))

View file

@ -1,11 +1,13 @@
(ns leiningen.plugin (ns leiningen.plugin
(:use [leiningen.core :only (home-dir (:use [leiningen.core :only (home-dir
read-project)] read-project
abort)]
[leiningen.uberjar :only (write-components)] [leiningen.uberjar :only (write-components)]
[leiningen.deps :only (deps)] [leiningen.deps :only (deps)]
[leiningen.jar :only (local-repo-path [leiningen.jar :only (local-repo-path
extract-jar extract-jar
get-default-uberjar-name)] get-default-uberjar-name)]
[leiningen.util.file :only (tmp-dir)]
[clojure.java.io :only (file)]) [clojure.java.io :only (file)])
(:require [leiningen.install] (:require [leiningen.install]
[leiningen.help]) [leiningen.help])
@ -30,9 +32,9 @@ Syntax: lein plugin install [GROUP/]ARTIFACT-ID VERSION
[project-name version] [project-name version]
(leiningen.install/install project-name version) (leiningen.install/install project-name version)
(let [[name group] (extract-name-and-group project-name) (let [[name group] (extract-name-and-group project-name)
temp-project (format "/tmp/lein-%s" (java.util.UUID/randomUUID)) temp-project (format "%s/lein-%s" tmp-dir (java.util.UUID/randomUUID))
jarfile (-> (local-repo-path name (or group name) version) jarfile (-> (local-repo-path name (or group name) version)
(.replace "$HOME" (System/getenv "HOME"))) (.replace "$HOME" (System/getProperty "user.home")))
_ (extract-jar (file jarfile) temp-project) _ (extract-jar (file jarfile) temp-project)
project (read-project (format "%s/project.clj" temp-project)) project (read-project (format "%s/project.clj" temp-project))
standalone-filename (plugin-standalone-filename group name version)] standalone-filename (plugin-standalone-filename group name version)]
@ -50,9 +52,15 @@ Syntax: lein plugin install [GROUP/]ARTIFACT-ID VERSION
"Delete the plugin jarfile "Delete the plugin jarfile
Syntax: lein plugin uninstall [GROUP/]ARTIFACT-ID VERSION" Syntax: lein plugin uninstall [GROUP/]ARTIFACT-ID VERSION"
[project-name version] [project-name version]
(let [[name group] (extract-name-and-group project-name)] (let [[name group] (extract-name-and-group project-name)
(.delete (file plugins-path jarfile (file plugins-path
(plugin-standalone-filename group name version))))) (plugin-standalone-filename group name version))]
(if (.exists jarfile)
(if (.delete jarfile)
(println (format "Successfully uninstalled %s %s." project-name version))
(abort (format "Failed to delete \"%s\"." (.getAbsolutePath jarfile))))
(abort (format "Plugin \"%s %s\" doesn't appear to be installed."
project-name version)))))
(defn ^{:doc "Manage user-level plugins." (defn ^{:doc "Manage user-level plugins."
:help-arglists '([subtask project-name version]) :help-arglists '([subtask project-name version])

View file

@ -1,6 +1,8 @@
(ns leiningen.util.file (ns leiningen.util.file
(:use [clojure.java.io :only [file delete-file]])) (:use [clojure.java.io :only [file delete-file]]))
(def tmp-dir (System/getProperty "java.io.tmpdir"))
;; grumble, grumble; why didn't this make it into clojure.java.io? ;; grumble, grumble; why didn't this make it into clojure.java.io?
(defn delete-file-recursively (defn delete-file-recursively
"Delete file f. If it's a directory, recursively delete all its contents. "Delete file f. If it's a directory, recursively delete all its contents.

View file

@ -1,7 +1,8 @@
(ns leiningen.util.maven (ns leiningen.util.maven
(:use [leiningen.core :only [repositories-for abort]] (:use [leiningen.core :only [repositories-for abort]]
[clojure.java.io :only [file reader]]) [clojure.java.io :only [file reader]])
(:import [org.apache.maven.model Build Model Parent Dependency (:import [java.io File]
[org.apache.maven.model Build Model Parent Dependency
Exclusion Repository Scm License MailingList Resource] Exclusion Repository Scm License MailingList Resource]
[org.apache.maven.project.artifact ProjectArtifactMetadata] [org.apache.maven.project.artifact ProjectArtifactMetadata]
[org.apache.maven.settings MavenSettingsBuilder] [org.apache.maven.settings MavenSettingsBuilder]
@ -195,7 +196,7 @@ to exclude from transitive dependencies."
(defn- relative-path (defn- relative-path
[project path-key] [project path-key]
(.replace (path-key project) (str (:root project) "/") "")) (.replace (path-key project) (str (:root project) File/separator) ""))
(defmacro ^{:private true} add-a-resource [build method resource-path] (defmacro ^{:private true} add-a-resource [build method resource-path]
`(let [resource# (Resource.)] `(let [resource# (Resource.)]

View file

@ -41,3 +41,9 @@
(is (some (partial re-find r) classes) (format "missing %s" r)))) (is (some (partial re-find r) classes) (format "missing %s" r))))
(is (not (.exists (file "test_projects" "sample" (is (not (.exists (file "test_projects" "sample"
"classes" "sample2" "core.class"))))) "classes" "sample2" "core.class")))))
(deftest test-spaces-in-project-path
(binding [leiningen.compile/get-raw-input-args
(fn [] ["-Dleiningen.original.pwd=/path/with" "spaces/got-broken"])]
(is (zero? (eval-in-project (make-project "test_projects/sample")
`(System/exit 0))))))

View file

@ -9,17 +9,28 @@
(def m2-dir (file local-repo "nomnomnom" "nomnomnom" "0.5.0-SNAPSHOT")) (def m2-dir (file local-repo "nomnomnom" "nomnomnom" "0.5.0-SNAPSHOT"))
(def unix-shell-wrapper (file (home-dir) "bin" "nom"))
(def windows-shell-wrapper (file (home-dir) "bin" "nom.bat"))
(defonce test-project (read-project "test_projects/sample/project.clj")) (defonce test-project (read-project "test_projects/sample/project.clj"))
(defn delete-shell-wrappers []
(.delete unix-shell-wrapper)
(.delete windows-shell-wrapper))
(deftest test-install (deftest test-install
(delete-file-recursively m2-dir true) (delete-file-recursively m2-dir true)
(delete-shell-wrappers)
(install test-project) (install test-project)
(is (not (empty? (.listFiles m2-dir))))) (is (not (empty? (.listFiles m2-dir))))
(is (.exists unix-shell-wrapper))
(is (.exists windows-shell-wrapper)))
(def jdom-dir (file local-repo "jdom" "jdom" "1.0")) (def jdom-dir (file local-repo "jdom" "jdom" "1.0"))
(deftest test-standalone-install (deftest test-standalone-install
(delete-file-recursively jdom-dir true) (delete-file-recursively jdom-dir true)
(delete-shell-wrappers)
(install "nomnomnom" "0.5.0-SNAPSHOT") (install "nomnomnom" "0.5.0-SNAPSHOT")
(is (not (empty? (.listFiles jdom-dir)))) (is (not (empty? (.listFiles jdom-dir))))
(is (.exists (file (home-dir) "bin" "nom")))) (is (.exists unix-shell-wrapper)))

View file

@ -18,16 +18,24 @@
(deftest test-jar (deftest test-jar
(let [jar-file (JarFile. (jar sample-project)) (let [jar-file (JarFile. (jar sample-project))
manifest (manifest-map (.getManifest jar-file)) manifest (manifest-map (.getManifest jar-file))
bin (slurp (.getInputStream jar-file (.getEntry jar-file "bin/nom")))] bin (slurp (.getInputStream jar-file (.getEntry jar-file "bin/nom")))
bat (slurp (.getInputStream jar-file (.getEntry jar-file
"bin/nom.bat")))]
(is (= "bin/nom" (manifest "Leiningen-shell-wrapper"))) (is (= "bin/nom" (manifest "Leiningen-shell-wrapper")))
(is (re-find #"org/clojure/clojure/1.1.0-master-SNAPSHOT/" bin)) (is (re-find #"org/clojure/clojure/1\.1\.0-master-SNAPSHOT/" bin))
(is (re-find #"org\\clojure\\clojure\\1\.1\.0-master-SNAPSHOT" bat))
(is (re-find #"use 'nom\.nom\.nom\)\(apply -main .command-line-args." bin)) (is (re-find #"use 'nom\.nom\.nom\)\(apply -main .command-line-args." bin))
(is (re-find #"\$HOME/\.m2/repository/rome/rome/0.9/rome-0\.9\.jar" bin)))) (is (re-find #"use 'nom\.nom\.nom\)\(apply -main .command-line-args." bat))
(is (re-find #"\$HOME/\.m2/repository/rome/rome/0\.9/rome-0\.9\.jar" bin))
(is (re-find
#"%USERPROFILE%\\\.m2\\repository\\rome\\rome\\0\.9\\rome-0\.9\.jar"
bat))))
(deftest test-no-bin-jar (deftest test-no-bin-jar
(let [jar-file (JarFile. (jar (dissoc sample-project :shell-wrapper))) (let [jar-file (JarFile. (jar (dissoc sample-project :shell-wrapper)))
manifest (manifest-map (.getManifest jar-file))] manifest (manifest-map (.getManifest jar-file))]
(is (nil? (.getEntry jar-file "bin/nom"))) (is (nil? (.getEntry jar-file "bin/nom")))
(is (nil? (.getEntry jar-file "bin/nom.bat")))
(is (nil? (manifest "Leiningen-shell-wrapper"))))) (is (nil? (manifest "Leiningen-shell-wrapper")))))
(def sample-failing-project (def sample-failing-project
@ -54,9 +62,12 @@
(let [jar-file (JarFile. (jar tricky-name)) (let [jar-file (JarFile. (jar tricky-name))
manifest (manifest-map (.getManifest jar-file)) manifest (manifest-map (.getManifest jar-file))
bin (slurp (.getInputStream bin (slurp (.getInputStream
jar-file (.getEntry jar-file "bin/tricky-name")))] jar-file (.getEntry jar-file "bin/tricky-name")))
bat (slurp (.getInputStream
jar-file (.getEntry jar-file "bin/tricky-name.bat")))]
(is (= "bin/tricky-name" (manifest "Leiningen-shell-wrapper"))) (is (= "bin/tricky-name" (manifest "Leiningen-shell-wrapper")))
(is (re-find #"org/domain/tricky-name/1.0/tricky-name-1\.0\.jar" bin)))) (is (re-find #"org/domain/tricky-name/1\.0/tricky-name-1\.0\.jar" bin))
(is (re-find #"\\domain\\tricky-name\\1\.0\\tricky-name-1\.0\.jar" bat))))
(deftest test-no-deps-jar (deftest test-no-deps-jar
(let [jar-file (jar (dissoc sample-project :dependencies :dev-dependencies))] (let [jar-file (jar (dissoc sample-project :dependencies :dev-dependencies))]

View file

@ -2,9 +2,10 @@
(:use [clojure.test] (:use [clojure.test]
[clojure.java.io :only [delete-file]] [clojure.java.io :only [delete-file]]
[leiningen.core :only [read-project]] [leiningen.core :only [read-project]]
[leiningen.run])) [leiningen.run]
[leiningen.util.file :only [tmp-dir]]))
(def out-file "/tmp/lein-test") (def out-file (format "%s/lein-test" tmp-dir))
(def project (binding [*ns* (find-ns 'leiningen.core)] (def project (binding [*ns* (find-ns 'leiningen.core)]
(read-project "test_projects/tricky-name/project.clj"))) (read-project "test_projects/tricky-name/project.clj")))

View file

@ -1,12 +1,13 @@
(ns test-test (ns test-test
(:refer-clojure :exclude [test]) (:refer-clojure :exclude [test])
(:use [leiningen.test] (:use [leiningen.test]
[leiningen.util.file :only [tmp-dir]]
[leiningen.core :only [read-project]] :reload) [leiningen.core :only [read-project]] :reload)
(:use [clojure.test])) (:use [clojure.test]))
(use-fixtures :each (use-fixtures :each
(fn [f] (fn [f]
(.delete (java.io.File. "/tmp/lein-test-ran")) (.delete (java.io.File. tmp-dir "lein-test-ran"))
(f))) (f)))
(def project (binding [*ns* (find-ns 'leiningen.core)] (def project (binding [*ns* (find-ns 'leiningen.core)]
@ -14,7 +15,8 @@
(defn ran? [& expected] (defn ran? [& expected]
(= (set expected) (= (set expected)
(set (map read-string (.split (slurp "/tmp/lein-test-ran") "\n"))))) (set (map read-string (.split (slurp (format "%s/lein-test-ran" tmp-dir))
"\n")))))
(deftest test-project-selectors (deftest test-project-selectors
(is (= [:default :integration :int2 :no-custom] (is (= [:default :integration :int2 :no-custom]

View file

@ -3,8 +3,10 @@
[clojure.java.io])) [clojure.java.io]))
(defn record-ran [t] (defn record-ran [t]
(with-open [w (writer "/tmp/lein-test-ran" :append true)] (let [file-name (format "%s/lein-test-ran"
(.write w (str t "\n")))) (System/getProperty "java.io.tmpdir"))]
(with-open [w (writer file-name :append true)]
(.write w (str t "\n")))))
(deftest ^{:integration true} integration-test (deftest ^{:integration true} integration-test
(record-ran :integration) (record-ran :integration)

View file

@ -1,4 +1,4 @@
(ns org.domain.tricky-name.brunch) (ns org.domain.tricky-name.brunch)
(defn -main [& args] (defn -main [& args]
(spit "/tmp/lein-test" "BRUNCH")) (spit (format "%s/lein-test" (System/getProperty "java.io.tmpdir")) "BRUNCH"))

View file

@ -2,5 +2,6 @@
(defn -main [& args] (defn -main [& args]
(when-not (empty? args) (when-not (empty? args)
(spit "/tmp/lein-test" (str "nom:" (first args))) (spit (format "%s/lein-test" (System/getProperty "java.io.tmpdir"))
(str "nom:" (first args)))
(recur (rest args)))) (recur (rest args))))

View file

@ -1,4 +1,5 @@
(ns org.domain.tricky-name.munch) (ns org.domain.tricky-name.munch)
(defn -main [& args] (defn -main [& args]
(spit "/tmp/lein-test" (pr-str :munched args))) (spit (format "%s/lein-test" (System/getProperty "java.io.tmpdir"))
(pr-str :munched args)))