branch: elpa/cider
commit 87f8c4788eaaf84f8df5909867f059fbecdc1d85
Author: Bozhidar Batsov <[email protected]>
Commit: Bozhidar Batsov <[email protected]>

    Recreate the log appender whenever it's missing server-side
    
    `cider-log--ensure-initialized' gated appender creation on a global
    `cider-log--initialized-once-p' flag that was set once and never reset, so
    after the appender was killed or the REPL restarted the appender was never
    re-added and later consumer registration failed.  
`cider-log-appender-reload'
    already does the authoritative existence check, so drop the flag.
---
 lisp/cider-log.el       | 11 +++++------
 test/cider-log-tests.el | 37 +++++++++++++++++++++----------------
 2 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/lisp/cider-log.el b/lisp/cider-log.el
index 34f45a0115..139f3612e9 100644
--- a/lisp/cider-log.el
+++ b/lisp/cider-log.el
@@ -129,9 +129,6 @@ It will not be used if the package hasn't been installed."
 (declare-function logview-initialized-p "logview" () t)
 (declare-function logview-mode "logview" () t)
 
-(defvar cider-log--initialized-once-p nil
-  "Set to t if log framework and appender have been initialized once.")
-
 (defvar cider-log-framework nil
   "The current log framework to use.")
 
@@ -719,10 +716,12 @@ The KEYS are used to lookup the values and are joined by 
SEPARATOR."
   (when consumer
     (setq cider-log-consumer consumer)
     (cider-log--set-filters (cider-log-consumer-filters consumer)))
-  (when (and appender (not cider-log--initialized-once-p))
+  ;; Recreate the appender whenever it's missing server-side (after it was
+  ;; killed, or on a fresh REPL session).  `cider-log-appender-reload' is the
+  ;; authoritative existence check.
+  (when appender
     (unless (cider-log-appender-reload framework appender)
-      (setq cider-log-appender (cider-sync-request:log-add-appender framework 
appender))
-      (setq cider-log--initialized-once-p t))))
+      (setq cider-log-appender (cider-sync-request:log-add-appender framework 
appender)))))
 
 (defun cider-log-kill-buffer-hook-handler ()
   "Called from `kill-buffer-hook' to remove the consumer."
diff --git a/test/cider-log-tests.el b/test/cider-log-tests.el
index 837de401e5..137d9946e9 100644
--- a/test/cider-log-tests.el
+++ b/test/cider-log-tests.el
@@ -39,20 +39,25 @@
       (spy-on 'cider-connected-p :and-return-value nil)
       (expect (cider-log framework appender) :to-throw 'user-error))
 
-    (it "doesn't add an appender when initialized."
-      (let ((cider-log--initialized-once-p t))
-        (spy-on 'cider-sync-request:log-frameworks :and-return-value (list 
framework))
-        (spy-on 'transient-setup)
-        (cider-log framework appender)
-        (expect 'transient-setup :to-have-been-called-with 'cider-log)))
-
-    (it "does add an appender when not initialized."
-      (let ((cider-log--initialized-once-p nil))
-        (spy-on 'cider-sync-request:log-frameworks :and-return-value (list 
framework))
-        (spy-on 'cider-sync-request:log-add-appender :and-return-value 
appender)
-        (spy-on 'transient-setup)
-        (cider-log framework appender)
-        (expect 'transient-setup :to-have-been-called-with 'cider-log)))
+    (it "doesn't add an appender when it already exists server-side."
+      (spy-on 'cider-sync-request:log-frameworks :and-return-value (list 
framework))
+      (spy-on 'cider-log-appender-reload :and-return-value appender) ; exists
+      (spy-on 'cider-sync-request:log-add-appender)
+      (spy-on 'transient-setup)
+      (cider-log framework appender)
+      (expect 'cider-sync-request:log-add-appender :not :to-have-been-called)
+      (expect 'transient-setup :to-have-been-called-with 'cider-log))
+
+    (it "adds an appender when it is missing server-side."
+      ;; Regression: this must keep working across an appender kill or a REPL
+      ;; restart, which a stuck once-per-session flag used to prevent.
+      (spy-on 'cider-sync-request:log-frameworks :and-return-value (list 
framework))
+      (spy-on 'cider-log-appender-reload :and-return-value nil) ; missing
+      (spy-on 'cider-sync-request:log-add-appender :and-return-value appender)
+      (spy-on 'transient-setup)
+      (cider-log framework appender)
+      (expect 'cider-sync-request:log-add-appender :to-have-been-called)
+      (expect 'transient-setup :to-have-been-called-with 'cider-log))
 
     (it "applies the consumer's own filters when initializing, not the 
appender's."
       ;; Regression: the consumer branch of `cider-log--ensure-initialized'
@@ -60,8 +65,8 @@
       (let* ((appender-filters (nrepl-dict "pattern" "appender-pattern"))
              (consumer-filters (nrepl-dict "pattern" "consumer-pattern"))
              (appender (nrepl-dict "id" "cider-log" "filters" 
appender-filters))
-             (consumer (nrepl-dict "id" "consumer" "filters" consumer-filters))
-             (cider-log--initialized-once-p t)) ; skip the add-appender 
network path
+             (consumer (nrepl-dict "id" "consumer" "filters" 
consumer-filters)))
+        (spy-on 'cider-log-appender-reload :and-return-value appender) ; skip 
add path
         (spy-on 'cider-log--set-filters)
         (with-temp-buffer
           (cider-log--ensure-initialized framework appender consumer))

Reply via email to