Make repl task listen on a repl socket.

This commit is contained in:
Phil Hagelberg 2010-08-15 15:47:01 -07:00
parent 0773058473
commit 4f64c64afb

View file

@ -5,7 +5,7 @@
(:import [java.net Socket] (:import [java.net Socket]
[java.io OutputStreamWriter InputStreamReader File])) [java.io OutputStreamWriter InputStreamReader File]))
(defn repl-server [project port] (defn repl-server [project host port]
(let [init-form [:init `#(let [is# ~(:repl-init-script project) (let [init-form [:init `#(let [is# ~(:repl-init-script project)
mn# '~(:main project)] mn# '~(:main project)]
(when (and is# (.exists (File. str))) (when (and is# (.exists (File. str)))
@ -18,16 +18,30 @@
[java.io ~'InputStreamReader ~'OutputStream [java.io ~'InputStreamReader ~'OutputStream
~'OutputStreamWriter ~'PrintWriter] ~'OutputStreamWriter ~'PrintWriter]
[clojure.lang ~'LineNumberingPushbackReader])) [clojure.lang ~'LineNumberingPushbackReader]))
(let [server# (ServerSocket. ~port) (let [server# (ServerSocket. ~port 0 (~'InetAddress/getByName ~host))
socket# (.accept server#) acc# (fn [s#]
ins# (.getInputStream socket#) (let [ins# (.getInputStream s#)
outs# (.getOutputStream socket#)] outs# (.getOutputStream s#)]
(binding [*in* (-> ins# InputStreamReader. (doto (Thread.
#(binding [*in* (-> ins# InputStreamReader.
LineNumberingPushbackReader.) LineNumberingPushbackReader.)
*out* (OutputStreamWriter. outs#) *out* (OutputStreamWriter. outs#)
*err* (PrintWriter. outs# true)] *err* (PrintWriter. outs# true)]
(clojure.main/repl ~@init-form)) (try
(.close server#))))) (clojure.main/repl ~@init-form)
(catch ~'SocketException _#
(doto s#
.shutdownInput
.shutdownOutput
.close)))))
.start)))]
(doto (Thread. #(when-not (.isClosed server#)
(try
(acc# (.accept server#))
(catch ~'SocketException _#))
(recur)))
.start)
(format "REPL started; server listening on %s:%s." ~host ~port)))))
(defn copy-out [reader] (defn copy-out [reader]
(Thread/sleep 100) (Thread/sleep 100)
@ -58,8 +72,10 @@
(defn repl (defn repl
"Start a repl session for the current project." "Start a repl session for the current project."
[project] [project]
(let [port (dec (+ 1024 (rand-int 64512))) (let [host (or (System/getenv "LEIN_REPL_HOST") "localhost")
server-form (repl-server project port) 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) server-thread (Thread. #(try (eval-in-project project server-form)
(catch Exception _)))] (catch Exception _)))]
(.start server-thread) (.start server-thread)