From: Thien-Thi Nguyen Date: Mon, 21 Jan 2008 14:03:09 +0000 (+0000) Subject: (vc-process-sentinel): After calling the X-Git-Tag: emacs-pretest-23.0.90~8477 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b49fd377e88c4e6517342e2b61a6f0db2a0eab83;p=emacs.git (vc-process-sentinel): After calling the previous sentinel, do nothing if the process' buffer is not live. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 7b05fb9c568..b3e010f9b93 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2008-01-21 Thien-Thi Nguyen + + * vc.el (vc-process-sentinel): After calling the previous + sentinel, do nothing if the process' buffer is not live. + 2008-01-21 Vinicius Jose Latorre * blank-mode.el: Fix a problem of cleaning blank faces when turning off diff --git a/lisp/vc.el b/lisp/vc.el index 497ba1e0df4..ffe38a68521 100644 --- a/lisp/vc.el +++ b/lisp/vc.el @@ -958,36 +958,39 @@ BUF defaults to \"*vc*\", can be a string and will be created if necessary." (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.