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))