Allow trampolining the repl task

refs #528
This commit is contained in:
Colin Jones 2012-04-18 21:07:52 -05:00
parent d038306c97
commit fdae11f7d1

View file

@ -6,6 +6,7 @@
[clojure.java.io :as io]
[leiningen.core.eval :as eval]
[leiningen.core.project :as project]
[leiningen.trampoline :as trampoline]
[clojure.tools.nrepl.ack :as nrepl.ack]
[clojure.tools.nrepl.server :as nrepl.server]
[leiningen.core.user :as user]
@ -19,12 +20,16 @@
[org.thnetos/cd-client "0.3.4"
:exclusions [org.clojure/clojure]]]})
(def trampoline-profile {:dependencies '[[reply "0.1.0-beta4"
:exclusions [org.clojure/clojure]]]})
(defn- start-server [project port ack-port]
(let [server-starting-form
`(let [server# (clojure.tools.nrepl.server/start-server
:port ~port :ack-port ~ack-port)]
(println "nREPL server started on port"
(-> server# deref :ss .getLocalPort)))]
(-> server# deref :ss .getLocalPort))
(while true (Thread/sleep Long/MAX_VALUE)))]
(if project
(eval/eval-in-project
(project/merge-profile project profile)
@ -51,17 +56,24 @@
(-> project :repl-options :ack-port))]
(Integer. p)))
(defn options-for-reply [repl-port project]
(defn options-for-reply [project & {:keys [attach port]}]
(let [repl-options (:repl-options project)]
(clojure.set/rename-keys
(assoc repl-options
:attach (if-let [host (repl-host project)]
(str host ":" repl-port)
(str repl-port))
:init (if-let [init-ns (or (:init-ns repl-options) (:main project))]
`(do (require '~init-ns) (in-ns '~init-ns)
~(:init repl-options))
(:init repl-options)))
(merge
repl-options
{:init (if-let [init-ns (or (:init-ns repl-options) (:main project))]
`(do (require '~init-ns) (in-ns '~init-ns)
~(:init repl-options))
(:init repl-options))}
(cond
attach
{:attach (if-let [host (repl-host project)]
(str host ":" attach)
(str attach))}
port
{:port (str port)}
:else
{}))
{:prompt :custom-prompt
:init :custom-init})))
@ -84,6 +96,17 @@ Connects to the nREPL server running at the given host (defaults to localhost)
and port."
([] (repl nil))
([project]
(if trampoline/*trampoline?*
(let [options (options-for-reply project :port (repl-port project))]
(eval/eval-in-project
(-> project
(project/merge-profile profile)
(project/merge-profile trampoline-profile))
`(reply.main/launch-nrepl ~options)
'(do (require 'reply.main)
(require 'clojure.tools.nrepl.server)
(require 'complete.core))))
(do
(nrepl.ack/reset-ack-port!)
(let [prepped (promise)]
(.start
@ -98,14 +121,12 @@ and port."
:repl-options
:timeout)
30000))]
(reply/launch-nrepl (options-for-reply repl-port project))
(println "REPL server launch timed out."))))
(reply/launch-nrepl (options-for-reply project :attach repl-port))
(println "REPL server launch timed out."))))))
([project flag & opts]
(case flag
":headless" (do (start-server project
(repl-port project)
(ack-port project))
(while true
(Thread/sleep Long/MAX_VALUE)))
(ack-port project)))
":connect" (reply/launch-nrepl {:attach (first opts)})
(main/abort "Unrecognized flag:" flag))))