Make repl task listen on a repl socket.
This commit is contained in:
parent
0773058473
commit
4f64c64afb
1 changed files with 29 additions and 13 deletions
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue