allow repl outside of a project

This commit is contained in:
Colin Jones 2010-08-20 14:56:04 -05:00
parent eeb32c8371
commit 6dbfd8b2a9
3 changed files with 44 additions and 28 deletions

View file

@ -89,6 +89,23 @@
(concat (.getInputArguments (ManagementFactory/getRuntimeMXBean)) (concat (.getInputArguments (ManagementFactory/getRuntimeMXBean))
(:jvm-opts project))) (:jvm-opts project)))
(defn get-readable-form [java project form]
(let [cp (str (.getClasspath (.getCommandLine java)))
form `(do (def ~'*classpath* ~cp)
(set! ~'*warn-on-reflection*
~(:warn-on-reflection project))
~form)]
(if (= (get-os) :windows)
;; work around java's command line handling
;; on windows http://bit.ly/9c6biv
;; This isn't perfect, but works for what's
;; currently being passed see
;; http://www.perlmonks.org/?node_id=300286
;; for some of the landmines involved in
;; doing it properly
(pr-str (pr-str form))
(prn-str form))))
;; TODO: split this function up ;; TODO: split this function up
(defn eval-in-project (defn eval-in-project
"Executes form in an isolated classloader with the classpath and compile path "Executes form in an isolated classloader with the classpath and compile path
@ -125,26 +142,22 @@
(.setValue (.createJvmarg java) arg))) (.setValue (.createJvmarg java) arg)))
(.setClassname java "clojure.main") (.setClassname java "clojure.main")
(.setValue (.createArg java) "-e") (.setValue (.createArg java) "-e")
(let [cp (str (.getClasspath (.getCommandLine java))) (.setValue (.createArg java) (get-readable-form java project form))
form `(do (def ~'*classpath* ~cp)
(set! ~'*warn-on-reflection*
~(:warn-on-reflection project))
~form)
readable-form (if (= (get-os) :windows)
;; work around java's command line handling
;; on windows http://bit.ly/9c6biv
;; This isn't perfect, but works for what's
;; currently being passed see
;; http://www.perlmonks.org/?node_id=300286
;; for some of the landmines involved in
;; doing it properly
(pr-str (pr-str form))
(prn-str form))]
(.setValue (.createArg java) readable-form))
;; to allow plugins and other tasks to customize ;; to allow plugins and other tasks to customize
(when handler (handler java)) (when handler (handler java))
(.executeJava java))) (.executeJava java)))
(defn eval-without-project [form]
(let [java (Java.)]
(.setProject java lancet/ant-project)
(.setFailonerror java true)
(.setFork java true)
(.setClassname java "clojure.main")
(.setValue (.createArg java) "-e")
(.setValue (.createArg java) (get-readable-form java {} form))
(.executeJava java)))
(defn compile (defn compile
"Ahead-of-time compile the namespaces given under :aot in project.clj or "Ahead-of-time compile the namespaces given under :aot in project.clj or
those given as command-line arguments." those given as command-line arguments."

View file

@ -131,7 +131,7 @@
(:arglists (meta (resolve-task task-name)))) (:arglists (meta (resolve-task task-name))))
(defn project-needed? [task-name] (defn project-needed? [task-name]
(some #{'project} (map first (arglists task-name)))) (every? #{'project} (map first (arglists task-name))))
(defn matching-arity? [task-name project args] (defn matching-arity? [task-name project args]
(let [arg-count (if (project-needed? task-name) (let [arg-count (if (project-needed? task-name)

View file

@ -1,6 +1,6 @@
(ns leiningen.repl (ns leiningen.repl
(:require [clojure.main]) (:require [clojure.main])
(:use [leiningen.compile :only [eval-in-project]] (:use [leiningen.compile :only [eval-in-project eval-without-project]]
[clojure.java.io :only [copy]]) [clojure.java.io :only [copy]])
(:import [java.net Socket] (:import [java.net Socket]
[java.io OutputStreamWriter InputStreamReader File])) [java.io OutputStreamWriter InputStreamReader File]))
@ -74,13 +74,16 @@
(defn repl (defn repl
"Start a repl session. A socket-repl will also be launched in the "Start a repl session. A socket-repl will also be launched in the
background; use the LEIN_REPL_PORT environment variable to set the port." background; use the LEIN_REPL_PORT environment variable to set the port."
[project] ([] (repl {}))
(let [host (or (System/getenv "LEIN_REPL_HOST") "localhost") ([project]
port (Integer. (or (System/getenv "LEIN_REPL_PORT") (let [host (or (System/getenv "LEIN_REPL_HOST") "localhost")
(dec (+ 1024 (rand-int 64512))))) port (Integer. (or (System/getenv "LEIN_REPL_PORT")
server-form (repl-server project host port) (dec (+ 1024 (rand-int 64512)))))
server-thread (Thread. #(try (eval-in-project project server-form) server-form (repl-server project host port)
(catch Exception _)))] server-thread (Thread. #(try (if (empty? project)
(.start server-thread) (eval-without-project server-form)
(poll-for-socket port) (eval-in-project project server-form))
(.stop server-thread))) (catch Exception _)))]
(.start server-thread)
(poll-for-socket port)
(.stop server-thread))))