diff --git a/src/leiningen/repl.clj b/src/leiningen/repl.clj index cffc4dbe..651bb5d1 100644 --- a/src/leiningen/repl.clj +++ b/src/leiningen/repl.clj @@ -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))))