>From 7784c02425d9353294eccff75688326f251ef1dd Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sun, 15 Oct 2023 07:22:31 -0700 Subject: [PATCH 1/2] [5.6] Rename erc-server-buffer-p * lisp/erc/erc-log.el (erc-log-all-but-server-buffers): Use `erc--server-buffer-p' instead of `erc-server-buffer-p'. This replacement is presumed to be relatively "safe" because this function is unused in the code base and only appears in the doc string for the option `erc-enable-logging'. * lisp/erc/erc-match.el (erc-match-message): Leave comment proposing that `erc--server-buffer-p' should be preferred to `erc-server-buffer-p'. Use preferred alias for `erc-server-buffer-p'. * lisp/erc/erc-notify.el (erc-cmd-NOTIFY): Use preferred alias for `erc-server-buffer-p' and leave FIXME comment. * lisp/erc/erc-speedbar.el (erc-speedbar-buttons): Use `erc--server-buffer-p' instead of `erc-server-buffer-p'. The logic here seems simple enough to justify a change, however the absence of related bug reports is perhaps an argument against this. * lisp/erc/erc-track.el (erc-track-modified-channels): Use preferred alias for `erc-server-buffer-p'. * lisp/erc/erc.el (erc-once-with-server-event): Use `erc--server-buffer-p' instead of `erc-server-buffer-p'. This change seems justified because the function sets local hooks that would otherwise be ignored outside of a server buffer. (erc-server-buffer-p, erc-server-or-unjoined-channel-buffer-p): Make former obsolete alias for latter. (erc--server-buffer-p): New function to replace `erc-server-buffer-p' internally in new code. It returns nil in parted and kicked channels. (erc-open-server-buffer-p): Use `erc--server-buffer-p' instead of `erc-server-buffer-p'. (erc-get-buffer): Mention behavior in doc string regarding parted and kicked-from channels. (erc-cmd-GQUIT): Fix wrong-number-of-arguments bug in timer function. (erc-default-target): Mention behavior regarding unjoined channels. (erc-kill-query-buffers): Don't use `erc-server-buffer-p'. This replacement may break third-party code expecting to leave parted channels behind, but it seems sane when considering only the lone internal use in `erc-cmd-QUIT'. ; * test/lisp/erc/resources/join/network-id/foonet.eld: Timeouts. --- lisp/erc/erc-log.el | 4 +- lisp/erc/erc-match.el | 4 +- lisp/erc/erc-notify.el | 4 +- lisp/erc/erc-speedbar.el | 2 +- lisp/erc/erc-track.el | 4 +- lisp/erc/erc.el | 44 ++++++++++++------- .../erc/resources/join/network-id/foonet.eld | 4 +- 7 files changed, 42 insertions(+), 24 deletions(-) diff --git a/lisp/erc/erc-log.el b/lisp/erc/erc-log.el index 472cc1388a4..79fece5779e 100644 --- a/lisp/erc/erc-log.el +++ b/lisp/erc/erc-log.el @@ -276,11 +276,11 @@ erc-log-disable-logging (defun erc-log-all-but-server-buffers (buffer) "Return t if logging should be enabled in BUFFER. -Returns nil if `erc-server-buffer-p' returns t." +Return nil if BUFFER is a server buffer." (save-excursion (save-window-excursion (set-buffer buffer) - (not (erc-server-buffer-p))))) + (not (erc--server-buffer-p))))) (defun erc-save-query-buffers (process) "Save all buffers of the given PROCESS." diff --git a/lisp/erc/erc-match.el b/lisp/erc/erc-match.el index 186717579d7..8644e61106f 100644 --- a/lisp/erc/erc-match.el +++ b/lisp/erc/erc-match.el @@ -491,7 +491,9 @@ erc-match-message (message (buffer-substring message-beg (point-max)))) (when (and vector (not (and erc-match-exclude-server-buffer - (erc-server-buffer-p)))) + ;; FIXME replace with `erc--server-buffer-p' + ;; or explain why that's unwise. + (erc-server-or-unjoined-channel-buffer-p)))) (mapc (lambda (match-type) (goto-char (point-min)) diff --git a/lisp/erc/erc-notify.el b/lisp/erc/erc-notify.el index 55be8976ada..cf7ffbb40d7 100644 --- a/lisp/erc/erc-notify.el +++ b/lisp/erc/erc-notify.el @@ -218,7 +218,9 @@ erc-cmd-NOTIFY ;; from your notify list. (dolist (buf (erc-buffer-list)) (with-current-buffer buf - (if (erc-server-buffer-p) + ;; FIXME replace with `erc--server-buffer-p' or + ;; explain why that's unwise. + (if (erc-server-or-unjoined-channel-buffer-p) (setq erc-last-ison (delete (car args) erc-last-ison)))))) (setq erc-notify-list (cons (erc-string-no-properties (car args)) erc-notify-list))) diff --git a/lisp/erc/erc-speedbar.el b/lisp/erc/erc-speedbar.el index 625d59530b0..bb5fad6f52f 100644 --- a/lisp/erc/erc-speedbar.el +++ b/lisp/erc/erc-speedbar.el @@ -135,7 +135,7 @@ erc-speedbar-buttons (erase-buffer) (let (serverp chanp queryp) (with-current-buffer buffer - (setq serverp (erc-server-buffer-p)) + (setq serverp (erc--server-buffer-p)) (setq chanp (erc-channel-p (erc-default-target))) (setq queryp (erc-query-buffer-p))) (cond (serverp diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el index 64e59a90047..c8f2e04c3eb 100644 --- a/lisp/erc/erc-track.el +++ b/lisp/erc/erc-track.el @@ -795,7 +795,9 @@ erc-track-modified-channels (if (and (not (erc-buffer-visible (current-buffer))) (not (member this-channel erc-track-exclude)) (not (and erc-track-exclude-server-buffer - (erc-server-buffer-p))) + ;; FIXME either use `erc--server-buffer-p' or + ;; explain why that's unwise. + (erc-server-or-unjoined-channel-buffer-p))) (not (erc-message-type-member (or (erc-find-parsed-property) (point-min)) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 5bf6496e926..7144e81397a 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1417,7 +1417,7 @@ erc-once-with-server-event channel-buffers it may not work at all, as it uses the LOCAL argument of `add-hook' and `remove-hook' to ensure multiserver capabilities." - (unless (erc-server-buffer-p) + (unless (erc--server-buffer-p) (error "You should only run `erc-once-with-server-event' in a server buffer")) (let ((fun (make-symbol "fun")) @@ -1474,19 +1474,30 @@ erc-server-buffer-live-p (and (processp erc-server-process) (buffer-live-p (process-buffer erc-server-process)))) -(defun erc-server-buffer-p (&optional buffer) +(define-obsolete-function-alias + 'erc-server-buffer-p 'erc-server-or-unjoined-channel-buffer-p "30.1") +(defun erc-server-or-unjoined-channel-buffer-p (&optional buffer) "Return non-nil if argument BUFFER is an ERC server buffer. - -If BUFFER is nil, the current buffer is used." +If BUFFER is nil, use the current buffer. For historical +reasons, also return non-nil for channel buffers the client has +parted or from which it's been kicked." (with-current-buffer (or buffer (current-buffer)) (and (eq major-mode 'erc-mode) (null (erc-default-target))))) +(defun erc--server-buffer-p (&optional buffer) + "Return non-nil if BUFFER is an ERC server buffer. +Without BUFFER, use the current buffer." + (if buffer + (with-current-buffer buffer + (and (eq major-mode 'erc-mode) (null erc--target))) + (and (eq major-mode 'erc-mode) (null erc--target)))) + (defun erc-open-server-buffer-p (&optional buffer) "Return non-nil if BUFFER is an ERC server buffer with an open IRC process. If BUFFER is nil, the current buffer is used." - (and (erc-server-buffer-p buffer) + (and (erc--server-buffer-p buffer) (erc-server-process-alive buffer))) (defun erc-query-buffer-p (&optional buffer) @@ -1858,7 +1869,10 @@ erc-member-ignore-case (defun erc-get-buffer (target &optional proc) "Return the buffer matching TARGET in the process PROC. -If PROC is not supplied, all processes are searched." +Without PROC, search all ERC buffers. For historical reasons, +skip buffers for channels the client has \"PART\"ed or from which +it's been \"KICK\"ed. Expect users to use a different function +for finding targets independent of \"JOIN\"edness." (let ((downcased-target (erc-downcase target))) (catch 'buffer (erc-buffer-filter @@ -4584,10 +4598,7 @@ erc-cmd-GQUIT ;; kill them (run-at-time 4 nil - (lambda () - (dolist (buffer (erc-buffer-list (lambda (buf) - (not (erc-server-buffer-p buf))))) - (kill-buffer buffer))))) + #'erc-buffer-do (lambda () (when erc--target (kill-buffer))))) t) (defalias 'erc-cmd-GQ #'erc-cmd-GQUIT) @@ -7027,7 +7038,9 @@ erc--current-buffer-joined-p ;; continue to use `erc-default-target'. (defun erc-default-target () - "Return the current default target (as a character string) or nil if none." + "Return the current channel or query target, if any. +For historical reasons, return nil in channel buffers if not +currently joined." (let ((tgt (car erc-default-recipients))) (cond ((not tgt) nil) @@ -7589,15 +7602,14 @@ erc-directory-writable-p (unless (file-attributes dir) (make-directory dir)) (or (file-accessible-directory-p dir) (error "Cannot access %s" dir))) +;; FIXME make function obsolete or alias to something less confusing. (defun erc-kill-query-buffers (process) - "Kill all buffers of PROCESS. -Does nothing if PROCESS is not a process object." + "Kill all target buffers of PROCESS, including channel buffers. +Do nothing if PROCESS is not a process object." ;; here, we only want to match the channel buffers, to avoid ;; "selecting killed buffers" b0rkage. (when (processp process) - (erc-with-all-buffers-of-server process - (lambda () - (not (erc-server-buffer-p))) + (erc-with-all-buffers-of-server process (lambda () erc--target) (kill-buffer (current-buffer))))) (defun erc-nick-at-point () diff --git a/test/lisp/erc/resources/join/network-id/foonet.eld b/test/lisp/erc/resources/join/network-id/foonet.eld index 7d63f5f0c6c..74a107f8144 100644 --- a/test/lisp/erc/resources/join/network-id/foonet.eld +++ b/test/lisp/erc/resources/join/network-id/foonet.eld @@ -1,8 +1,8 @@ ;; -*- mode: lisp-data; -*- ((pass 10 "PASS :foonet:changeme")) -((nick 1 "NICK tester")) +((nick 10 "NICK tester")) -((user 1 "USER user 0 * :tester") +((user 10 "USER user 0 * :tester") (0 ":irc.foonet.org 001 tester :Welcome to the foonet IRC Network tester") (0 ":irc.foonet.org 002 tester :Your host is irc.foonet.org, running version oragono-2.6.0-7481bf0385b95b16") (0 ":irc.foonet.org 003 tester :This server was created Mon, 10 May 2021 00:58:22 UTC") -- 2.41.0