comparison lisp/vc.el @ 87931:9f4909ced989

Handle dead buffers in async filters/sentinels. (vc-process-filter): Do nothing if buffer not live. (vc-diff-finish): Rename from vc-diff-sentinel. No longer take REV1-NAME and REV2-NAME. Instead, take BUFFER-NAME. Do nothing if buffer not live. Don't do window resize if no window displays buffer. (vc-diff-internal): Use vc-diff-finish.
author Thien-Thi Nguyen <ttn@gnuvola.org>
date Thu, 24 Jan 2008 08:52:38 +0000
parents 75f74d0f3c91
children bcbe422dacdd
comparison
equal deleted inserted replaced
87930:75f74d0f3c91 87931:9f4909ced989
950 950
951 (defun vc-process-filter (p s) 951 (defun vc-process-filter (p s)
952 "An alternative output filter for async process P. 952 "An alternative output filter for async process P.
953 One difference with the default filter is that this inserts S after markers. 953 One difference with the default filter is that this inserts S after markers.
954 Another is that undo information is not kept." 954 Another is that undo information is not kept."
955 (with-current-buffer (process-buffer p) 955 (let ((buffer (process-buffer p)))
956 (save-excursion 956 (when (buffer-live-p buffer)
957 (let ((buffer-undo-list t) 957 (with-current-buffer buffer
958 (inhibit-read-only t)) 958 (save-excursion
959 (goto-char (process-mark p)) 959 (let ((buffer-undo-list t)
960 (insert s) 960 (inhibit-read-only t))
961 (set-marker (process-mark p) (point)))))) 961 (goto-char (process-mark p))
962 (insert s)
963 (set-marker (process-mark p) (point))))))))
962 964
963 (defun vc-setup-buffer (&optional buf) 965 (defun vc-setup-buffer (&optional buf)
964 "Prepare BUF for executing a VC command and make it current. 966 "Prepare BUF for executing a VC command and make it current.
965 BUF defaults to \"*vc*\", can be a string and will be created if necessary." 967 BUF defaults to \"*vc*\", can be a string and will be created if necessary."
966 (unless buf (setq buf "*vc*")) 968 (unless buf (setq buf "*vc*"))
979 (defvar vc-sentinel-movepoint) ;Dynamically scoped. 981 (defvar vc-sentinel-movepoint) ;Dynamically scoped.
980 982
981 (defun vc-process-sentinel (p s) 983 (defun vc-process-sentinel (p s)
982 (let ((previous (process-get p 'vc-previous-sentinel)) 984 (let ((previous (process-get p 'vc-previous-sentinel))
983 (buf (process-buffer p))) 985 (buf (process-buffer p)))
984 (if previous (funcall previous p s))
985 ;; Impatient users sometime kill "slow" buffers; check liveness 986 ;; Impatient users sometime kill "slow" buffers; check liveness
986 ;; to avoid "error in process sentinel: Selecting deleted buffer". 987 ;; to avoid "error in process sentinel: Selecting deleted buffer".
987 (when (buffer-live-p buf) 988 (when (buffer-live-p buf)
989 (if previous (funcall previous p s))
988 (with-current-buffer buf 990 (with-current-buffer buf
989 (setq mode-line-process 991 (setq mode-line-process
990 (let ((status (process-status p))) 992 (let ((status (process-status p)))
991 ;; Leave mode-line uncluttered, normally. 993 ;; Leave mode-line uncluttered, normally.
992 ;; (Let known any weirdness in-form-ally. ;-) --ttn 994 ;; (Let known any weirdness in-form-ally. ;-) --ttn
1967 1969
1968 ;; Old def for compatibility with Emacs-21.[123]. 1970 ;; Old def for compatibility with Emacs-21.[123].
1969 (defmacro vc-diff-switches-list (backend) `(vc-switches ',backend 'diff)) 1971 (defmacro vc-diff-switches-list (backend) `(vc-switches ',backend 'diff))
1970 (make-obsolete 'vc-diff-switches-list 'vc-switches "22.1") 1972 (make-obsolete 'vc-diff-switches-list 'vc-switches "22.1")
1971 1973
1972 (defun vc-diff-sentinel (verbose rev1-name rev2-name) 1974 (defun vc-diff-finish (buffer-name verbose)
1973 ;; The empty sync output case has already been handled, so the only 1975 ;; The empty sync output case has already been handled, so the only
1974 ;; possibility of an empty output is for an async process, in which case 1976 ;; possibility of an empty output is for an async process.
1975 ;; it's important to insert the "diffs end here" message in the buffer 1977 (when (buffer-live-p buffer-name)
1976 ;; since the user may miss a message in the echo area. 1978 (with-current-buffer (get-buffer buffer-name)
1977 (and verbose 1979 (and verbose
1978 (zerop (buffer-size)) 1980 (zerop (buffer-size))
1979 (let ((inhibit-read-only t)) 1981 (let ((inhibit-read-only t))
1980 (insert "No differences found.\n"))) 1982 (insert "No differences found.\n")))
1981 (goto-char (point-min)) 1983 (goto-char (point-min))
1982 (shrink-window-if-larger-than-buffer)) 1984 (let ((window (get-buffer-window (current-buffer))))
1985 (when window
1986 (shrink-window-if-larger-than-buffer window))))))
1983 1987
1984 (defvar vc-diff-added-files nil 1988 (defvar vc-diff-added-files nil
1985 "If non-nil, diff added files by comparing them to /dev/null.") 1989 "If non-nil, diff added files by comparing them to /dev/null.")
1986 1990
1987 (defun vc-diff-internal (async files rev1 rev2 &optional verbose) 1991 (defun vc-diff-internal (async files rev1 rev2 &optional verbose)
2036 (diff-mode) 2040 (diff-mode)
2037 ;; Make the *vc-diff* buffer read only, the diff-mode key 2041 ;; Make the *vc-diff* buffer read only, the diff-mode key
2038 ;; bindings are nicer for read only buffers. pcl-cvs does the 2042 ;; bindings are nicer for read only buffers. pcl-cvs does the
2039 ;; same thing. 2043 ;; same thing.
2040 (setq buffer-read-only t) 2044 (setq buffer-read-only t)
2041 (vc-exec-after `(vc-diff-sentinel ,verbose ,rev1-name ,rev2-name)) 2045 (vc-exec-after `(vc-diff-finish ,(buffer-name) ,verbose))
2042 ;; Display the buffer, but at the end because it can change point. 2046 ;; Display the buffer, but at the end because it can change point.
2043 (pop-to-buffer (current-buffer)) 2047 (pop-to-buffer (current-buffer))
2044 ;; In the async case, we return t even if there are no differences 2048 ;; In the async case, we return t even if there are no differences
2045 ;; because we don't know that yet. 2049 ;; because we don't know that yet.
2046 t))) 2050 t)))