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))
(: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
(defn eval-in-project
"Executes form in an isolated classloader with the classpath and compile path
@ -125,26 +142,22 @@
(.setValue (.createJvmarg java) arg)))
(.setClassname java "clojure.main")
(.setValue (.createArg java) "-e")
(let [cp (str (.getClasspath (.getCommandLine java)))
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))
(.setValue (.createArg java) (get-readable-form java project form))
;; to allow plugins and other tasks to customize
(when handler (handler 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
"Ahead-of-time compile the namespaces given under :aot in project.clj or
those given as command-line arguments."

View file

@ -131,7 +131,7 @@
(:arglists (meta (resolve-task 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]
(let [arg-count (if (project-needed? task-name)

View file

@ -1,6 +1,6 @@
(ns leiningen.repl
(: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]])
(:import [java.net Socket]
[java.io OutputStreamWriter InputStreamReader File]))
@ -74,13 +74,16 @@
(defn repl
"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."
[project]
(let [host (or (System/getenv "LEIN_REPL_HOST") "localhost")
port (Integer. (or (System/getenv "LEIN_REPL_PORT")
(dec (+ 1024 (rand-int 64512)))))
server-form (repl-server project host port)
server-thread (Thread. #(try (eval-in-project project server-form)
(catch Exception _)))]
(.start server-thread)
(poll-for-socket port)
(.stop server-thread)))
([] (repl {}))
([project]
(let [host (or (System/getenv "LEIN_REPL_HOST") "localhost")
port (Integer. (or (System/getenv "LEIN_REPL_PORT")
(dec (+ 1024 (rand-int 64512)))))
server-form (repl-server project host port)
server-thread (Thread. #(try (if (empty? project)
(eval-without-project server-form)
(eval-in-project project server-form))
(catch Exception _)))]
(.start server-thread)
(poll-for-socket port)
(.stop server-thread))))