emacs: Kill the stderr buffer when an async process completes

On some platforms (e.g. macOS), it is necessary to add a real sentinel
process for the error buffer used by `notmuch-start-notmuch' rather
than a no-op sentinel.
This commit is contained in:
David Edmondson 2018-08-26 22:16:12 +01:00 committed by David Bremner
parent fd3c93650d
commit cfd015bda4

View file

@ -909,7 +909,7 @@ invoke `set-process-sentinel' directly on the returned process,
as that will interfere with the handling of stderr and the exit as that will interfere with the handling of stderr and the exit
status." status."
(let (err-file err-buffer proc (let (err-file err-buffer proc err-proc
;; Find notmuch using Emacs' `exec-path' ;; Find notmuch using Emacs' `exec-path'
(command (or (executable-find notmuch-command) (command (or (executable-find notmuch-command)
(error "Command not found: %s" notmuch-command)))) (error "Command not found: %s" notmuch-command))))
@ -926,11 +926,13 @@ status."
:buffer buffer :buffer buffer
:command (cons command args) :command (cons command args)
:connection-type 'pipe :connection-type 'pipe
:stderr err-buffer)) :stderr err-buffer)
err-proc (get-buffer-process err-buffer))
(process-put proc 'err-buffer err-buffer) (process-put proc 'err-buffer err-buffer)
;; Silence "Process NAME stderr finished" in stderr by adding a
;; no-op sentinel to the fake stderr process object (process-put err-proc 'err-file err-file)
(set-process-sentinel (get-buffer-process err-buffer) #'ignore)) (process-put err-proc 'err-buffer err-buffer)
(set-process-sentinel err-proc #'notmuch-start-notmuch-error-sentinel))
;; On Emacs versions before 25, there is no way to capture ;; On Emacs versions before 25, there is no way to capture
;; stdout and stderr separately for asynchronous processes, or ;; stdout and stderr separately for asynchronous processes, or
@ -990,9 +992,16 @@ status."
;; Emacs behaves strangely if an error escapes from a sentinel, ;; Emacs behaves strangely if an error escapes from a sentinel,
;; so turn errors into messages. ;; so turn errors into messages.
(message "%s" (error-message-string err)))) (message "%s" (error-message-string err))))
(when err-buffer (kill-buffer err-buffer))
(when err-file (ignore-errors (delete-file err-file))))) (when err-file (ignore-errors (delete-file err-file)))))
(defun notmuch-start-notmuch-error-sentinel (proc event)
(let* ((err-file (process-get proc 'err-file))
;; When `make-process' is available, use the error buffer
;; associated with the process, otherwise the error file.
(err-buffer (or (process-get proc 'err-buffer)
(find-file-noselect err-file))))
(when err-buffer (kill-buffer err-buffer))))
;; This variable is used only buffer local, but it needs to be ;; This variable is used only buffer local, but it needs to be
;; declared globally first to avoid compiler warnings. ;; declared globally first to avoid compiler warnings.
(defvar notmuch-show-process-crypto nil) (defvar notmuch-show-process-crypto nil)