Skip to content

Commit 4dd1ff1

Browse files
vspinubbatsov
authored andcommitted
[Fix #2413] Prompt if a session with the same parameters already exists
1 parent 07dd778 commit 4dd1ff1

File tree

5 files changed

+71
-8
lines changed

5 files changed

+71
-8
lines changed

cider-connection.el

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,21 @@ PARAMS is a plist containing :host, :port, :server and other parameters for
9292
"Ensure there is a linked CIDER session."
9393
(sesman-ensure-session 'CIDER))
9494

95+
(defun cider--session-server (session)
96+
"Return server buffer for SESSION or nil if there is no server."
97+
(seq-some (lambda (r)
98+
(buffer-local-value 'nrepl-server-buffer r))
99+
(cdr session)))
100+
101+
(defun cider--gather-session-params (session)
102+
"Gather all params for a SESSION."
103+
(let (params)
104+
(dolist (repl (cdr session))
105+
(setq params (cider--gather-connect-params params repl)))
106+
(when-let* ((server (cider--session-server session)))
107+
(setq params (cider--gather-connect-params params server)))
108+
params))
109+
95110
(defun cider--gather-connect-params (&optional params proc-buffer)
96111
"Gather all relevant connection parameters into PARAMS plist.
97112
PROC-BUFFER is either server or client buffer, defaults to current buffer."
@@ -443,9 +458,7 @@ Fallback on `cider' command."
443458
(cl-defmethod sesman-restart-session ((_system (eql CIDER)) session)
444459
(let* ((ses-name (car session))
445460
(repls (cdr session))
446-
(srv-buf (seq-some (lambda (r)
447-
(buffer-local-value 'nrepl-server-buffer r))
448-
repls)))
461+
(srv-buf (cider--session-server session)))
449462
(if srv-buf
450463
;; session with a server
451464
(let ((s-params (cider--gather-connect-params nil srv-buf)))

cider.el

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,6 +923,7 @@ With the prefix argument, prompt for all these parameters."
923923
(interactive "P")
924924
(let ((params (thread-first params
925925
(cider--update-project-dir)
926+
(cider--check-existing-session)
926927
(cider--update-jack-in-cmd))))
927928
(nrepl-start-server-process
928929
(plist-get params :project-dir)
@@ -944,6 +945,7 @@ prompt for all these parameters."
944945
;; cider--update-jack-in-cmd relies indirectly on the above dynamic vars
945946
(let ((params (thread-first params
946947
(cider--update-project-dir)
948+
(cider--check-existing-session)
947949
(cider--update-jack-in-cmd))))
948950
(nrepl-start-server-process
949951
(plist-get params :project-dir)
@@ -967,8 +969,10 @@ cljs REPL only when the ClojureScript dependencies are met."
967969
;; cider--update-jack-in-cmd relies indirectly on the above dynamic vars
968970
(let ((params (thread-first params
969971
(cider--update-project-dir)
972+
(cider--check-existing-session)
970973
(cider--update-jack-in-cmd)
971974
(cider--update-cljs-type)
975+
;; already asked, don't ask on sibling connect
972976
(plist-put :do-prompt nil))))
973977
(nrepl-start-server-process
974978
(plist-get params :project-dir)
@@ -1032,6 +1036,7 @@ prefix argument, prompt for all the parameters."
10321036
(thread-first params
10331037
(cider--update-project-dir)
10341038
(cider--update-host-port)
1039+
(cider--check-existing-session)
10351040
(plist-put :repl-init-function nil)
10361041
(plist-put :session-name nil)
10371042
(plist-put :repl-type "clj"))))
@@ -1047,6 +1052,7 @@ parameters regardless of their supplied or default values."
10471052
(thread-first params
10481053
(cider--update-project-dir)
10491054
(cider--update-host-port)
1055+
(cider--check-existing-session)
10501056
(cider--update-cljs-type)
10511057
(cider--update-cljs-init-function)
10521058
(plist-put :session-name nil)
@@ -1062,6 +1068,7 @@ non-nil, don't start if ClojureScript requirements are not met."
10621068
(let* ((params (thread-first params
10631069
(cider--update-project-dir)
10641070
(cider--update-host-port)
1071+
(cider--check-existing-session)
10651072
(cider--update-cljs-type)))
10661073
(clj-repl (cider-connect-clj params)))
10671074
(if soft-cljs-start
@@ -1208,6 +1215,30 @@ non-nil, don't start if ClojureScript requirements are not met."
12081215
cider-offer-to-open-cljs-app-in-browser)
12091216
(cider--offer-to-open-app-in-browser nrepl-server-buffer)))))))
12101217

1218+
(defun cider--check-existing-session (params)
1219+
"Ask for confirmation if a session with similar PARAMS already exists.
1220+
If no session exists or user chose to proceed, return PARAMS. If the user
1221+
canceled the action, signal quit."
1222+
(let* ((proj-dir (plist-get params :project-dir))
1223+
(host (plist-get params :host))
1224+
(port (plist-get params :port))
1225+
(session (seq-find (lambda (ses)
1226+
(let ((ses-params (cider--gather-session-params ses)))
1227+
(and (equal proj-dir (plist-get ses-params :project-dir))
1228+
(or (null port)
1229+
(equal port (plist-get ses-params :port)))
1230+
(or (null host)
1231+
(equal host (plist-get ses-params :host))))))
1232+
(sesman-linked-sessions 'CIDER '(project)))))
1233+
(when session
1234+
(unless (y-or-n-p
1235+
(concat
1236+
"A session with the same parameters exists (" (car session) "). "
1237+
"You can connect a sibling instead. Proceed? "))
1238+
(let ((debug-on-quit nil))
1239+
(signal 'quit nil)))))
1240+
params)
1241+
12111242

12121243
;;; Aliases
12131244

nrepl-client.el

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ been determined."
10441044
(when (and (null nrepl-endpoint)
10451045
(string-match "nREPL server started on port \\([0-9]+\\)" output))
10461046
(let ((port (string-to-number (match-string 1 output))))
1047-
(setq nrepl-endpoint (list :host nil :port port))
1047+
(setq nrepl-endpoint (list :host "localhost" :port port))
10481048
(message "[nREPL] server started on %s" port)
10491049
(when nrepl-on-port-callback
10501050
(funcall nrepl-on-port-callback (process-buffer process)))))))))

test/cider-connection-tests.el

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,6 @@
221221
(setq major-mode 'clojurescript-mode)
222222
(expect (cider-current-repl) :to-equal b2))))))))))))
223223

224-
225-
226224
(describe "cider-repls"
227225

228226
:var (sesman-sessions-hashmap sesman-links-alist ses-name ses-name2)
@@ -342,3 +340,26 @@
342340
(expect (cider-format-connection-params "%J" '(:project-dir "/etc/"))
343341
:to-equal "/etc")))
344342

343+
(describe "cider-jack-in-clj&cljs"
344+
:var (sesman-sessions-hashmap sesman-links-alist cider-default-cljs-repl)
345+
(before-each
346+
(setq sesman-sessions-hashmap (make-hash-table :test #'equal)
347+
sesman-links-alist nil
348+
cider-default-cljs-repl 'node)
349+
(spy-on 'cider--gather-session-params
350+
:and-return-value '(:project-dir "some/project" :host "localhost" :port 1234))
351+
(spy-on 'nrepl-start-server-process
352+
:and-return-value nil)
353+
(spy-on 'sesman-linked-sessions
354+
:and-return-value '(("a-session")))
355+
(spy-on 'y-or-n-p
356+
:and-return-value t)
357+
(cider-jack-in-clj&cljs '(:project-dir "some/project" :host "localhost" :port 1234))
358+
(cider-jack-in-clj&cljs '(:project-dir "some/project" :host "localhost"))
359+
(cider-jack-in-clj&cljs '(:project-dir "some/project"))
360+
(cider-jack-in-clj&cljs '(:project-dir "some/project" :host "other-host"))
361+
(cider-jack-in-clj&cljs '(:project-dir "some/other/project")))
362+
(it "detects existing project"
363+
(expect 'y-or-n-p :to-have-been-called-times 3)))
364+
365+

test/cider-tests.el

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,6 @@
239239
(expect (cider-add-clojure-dependencies-maybe nil)
240240
:to-equal '(("Hello, I love you" "won't you tell me your name"))))))
241241

242-
243-
244242
(describe "cider-normalize-cljs-init-options"
245243
(describe "from options"
246244
(it "leaves keywords alone"

0 commit comments

Comments
 (0)