# HG changeset patch # User Thien-Thi Nguyen # Date 1200924120 0 # Node ID 1f9fa02d0cf11bc56a44bde84429fefac89a0442 # Parent 3f6dc5290b260cb36354dbb56afd8c566deda190 (vc-process-sentinel): After calling the previous sentinel, do nothing if the process' buffer is not live. diff -r 3f6dc5290b26 -r 1f9fa02d0cf1 lisp/vc.el --- a/lisp/vc.el Mon Jan 21 12:45:58 2008 +0000 +++ b/lisp/vc.el Mon Jan 21 14:02:00 2008 +0000 @@ -958,36 +958,39 @@ (defvar vc-sentinel-movepoint) ;Dynamically scoped. (defun vc-process-sentinel (p s) - (with-current-buffer (process-buffer p) - (setq mode-line-process - (let ((status (process-status p))) - ;; Leave mode-line uncluttered, normally. - ;; (Let known any weirdness in-form-ally. ;-) --ttn - (unless (eq 'exit status) - (format " (%s)" status))))) - (let ((previous (process-get p 'vc-previous-sentinel))) + (let ((previous (process-get p 'vc-previous-sentinel)) + (buf (process-buffer p))) (if previous (funcall previous p s)) - (with-current-buffer (process-buffer p) - (let (vc-sentinel-movepoint) - ;; Normally, we want async code such as sentinels to not move point. - (save-excursion - (goto-char (process-mark p)) - (let ((cmds (process-get p 'vc-sentinel-commands))) - (process-put p 'vc-sentinel-commands nil) - (dolist (cmd cmds) - ;; Each sentinel may move point and the next one should be run - ;; at that new point. We could get the same result by having - ;; each sentinel read&set process-mark, but since `cmd' needs - ;; to work both for async and sync processes, this would be - ;; difficult to achieve. - (vc-exec-after cmd)))) - ;; But sometimes the sentinels really want to move point. - (if vc-sentinel-movepoint - (let ((win (get-buffer-window (current-buffer) 0))) - (if (not win) - (goto-char vc-sentinel-movepoint) - (with-selected-window win - (goto-char vc-sentinel-movepoint))))))))) + ;; Impatient users sometime kill "slow" buffers; check liveness + ;; to avoid "error in process sentinel: Selecting deleted buffer". + (when (buffer-live-p buf) + (with-current-buffer buf + (setq mode-line-process + (let ((status (process-status p))) + ;; Leave mode-line uncluttered, normally. + ;; (Let known any weirdness in-form-ally. ;-) --ttn + (unless (eq 'exit status) + (format " (%s)" status)))) + (let (vc-sentinel-movepoint) + ;; Normally, we want async code such as sentinels to not move point. + (save-excursion + (goto-char (process-mark p)) + (let ((cmds (process-get p 'vc-sentinel-commands))) + (process-put p 'vc-sentinel-commands nil) + (dolist (cmd cmds) + ;; Each sentinel may move point and the next one should be run + ;; at that new point. We could get the same result by having + ;; each sentinel read&set process-mark, but since `cmd' needs + ;; to work both for async and sync processes, this would be + ;; difficult to achieve. + (vc-exec-after cmd)))) + ;; But sometimes the sentinels really want to move point. + (if vc-sentinel-movepoint + (let ((win (get-buffer-window (current-buffer) 0))) + (if (not win) + (goto-char vc-sentinel-movepoint) + (with-selected-window win + (goto-char vc-sentinel-movepoint)))))))))) (defun vc-exec-after (code) "Eval CODE when the current buffer's process is done.