Mercurial > emacs
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))) |