>From 2a712dc6d22b81ac778063a6c2f6b217f13a5169 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Fri, 13 Jan 2023 06:03:15 -0800 Subject: [PATCH 2/2] Don't preserve non-module minor modes in erc-open * lisp/erc/erc.el (erc--merge-local-modes): Be more conservative when persisting local minor-mode state across ERC sessions. User and third-party modes that were not defined via `define-erc-modules' should be left alone. * test/lisp/erc/erc-tests.el (erc--merge-local-modes): Add mocks for "-enable" toggles and a test case covering some foreign ERC mode. --- lisp/erc/erc.el | 5 ++++- test/lisp/erc/erc-tests.el | 34 ++++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index ba7db15cf8..ab84849e20 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1950,7 +1950,10 @@ erc--merge-local-modes (let ((out (list (reverse new-modes)))) (pcase-dolist (`(,k . ,v) old-vars) (when (and (string-prefix-p "erc-" (symbol-name k)) - (string-suffix-p "-mode" (symbol-name k))) + (string-suffix-p "-mode" (symbol-name k)) + (fboundp (intern-soft + (concat (substring (symbol-name k) 0 -5) + "-enable")))) (if v (cl-pushnew k (car out)) (setf (car out) (delq k (car out))) diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 85506c3d27..4501db6102 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -1251,18 +1251,28 @@ erc--update-modules (setq calls nil))))) (ert-deftest erc--merge-local-modes () - - (ert-info ("No existing modes") - (let ((old '((a) (b . t))) - (new '(erc-c-mode erc-d-mode))) - (should (equal (erc--merge-local-modes new old) - '((erc-c-mode erc-d-mode)))))) - - (ert-info ("Active existing added, inactive existing removed, deduped") - (let ((old '((a) (erc-b-mode) (c . t) (erc-d-mode . t) (erc-e-mode . t))) - (new '(erc-b-mode erc-d-mode))) - (should (equal (erc--merge-local-modes new old) - '((erc-d-mode erc-e-mode) . (erc-b-mode))))))) + (cl-letf (((symbol-function 'erc-b-enable) #'ignore) + ((symbol-function 'erc-c-enable) #'ignore) + ((symbol-function 'erc-d-enable) #'ignore) + ((symbol-function 'erc-e-enable) #'ignore)) + + (ert-info ("No existing modes") + (let ((old '((a) (b . t))) + (new '(erc-c-mode erc-d-mode))) + (should (equal (erc--merge-local-modes new old) + '((erc-c-mode erc-d-mode)))))) + + (ert-info ("Active existing added, inactive existing removed, deduped") + (let ((old '((a) (erc-b-mode) (c . t) (erc-d-mode . t) (erc-e-mode . t))) + (new '(erc-b-mode erc-d-mode))) + (should (equal (erc--merge-local-modes new old) + '((erc-d-mode erc-e-mode) . (erc-b-mode)))))) + + (ert-info ("Non-module erc-prefixed mode ignored") + (let ((old '((erc-b-mode) (erc-f-mode . t) (erc-d-mode . t))) + (new '(erc-b-mode))) + (should (equal (erc--merge-local-modes new old) + '((erc-d-mode) . (erc-b-mode)))))))) (ert-deftest define-erc-module--global () (let ((global-module '(define-erc-module mname malias -- 2.38.1