summaryrefslogtreecommitdiff
path: root/lisp/vc-dir.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2009-09-29 13:07:50 +0000
committerStefan Monnier <monnier@iro.umontreal.ca>2009-09-29 13:07:50 +0000
commitdcbbecd42f2b2a393a90c1fe9ad2b85e55bc7daa (patch)
tree4ca464bb7fe27b4ac2de0269e7049fe547d97c56 /lisp/vc-dir.el
parent8beeeabbbb8dfce1745464363307bd87521cb5c6 (diff)
* vc-hooks.el (vc-dir-buffers): New var.
(vc-state-refresh): New function. (vc-state): Use it. (vc-after-save): Always ask the backend to recompute the new state. Always call vc-dir if necessary, using vc-dir-buffers. * vc-dir.el (vc-dir-prepare-status-buffer, vc-dir-resynch-file): Use vc-dir-buffers. (vc-dir-mode): Use vc-dir-buffers rather than after-save-hook. (vc-dir-prepare-status-buffer, vc-dir-update) (vc-dir-resync-directory-files, vc-dir-resynch-file, vc-dir-mode): Don't call expand-file-name on default-directory.
Diffstat (limited to 'lisp/vc-dir.el')
-rw-r--r--lisp/vc-dir.el66
1 files changed, 33 insertions, 33 deletions
diff --git a/lisp/vc-dir.el b/lisp/vc-dir.el
index b20e67b948..f78ca1806c 100644
--- a/lisp/vc-dir.el
+++ b/lisp/vc-dir.el
@@ -89,16 +89,16 @@ See `run-hooks'."
(defun vc-dir-prepare-status-buffer (bname dir backend &optional create-new)
"Find a buffer named BNAME showing DIR, or create a new one."
(setq dir (file-name-as-directory (expand-file-name dir)))
- (let*
- ;; Look for another buffer name BNAME visiting the same directory.
- ((buf (save-excursion
- (unless create-new
- (dolist (buffer (buffer-list))
- (set-buffer buffer)
- (when (and (derived-mode-p 'vc-dir-mode)
- (eq vc-dir-backend backend)
- (string= (expand-file-name default-directory) dir))
- (return buffer)))))))
+ (let* ;; Look for another buffer name BNAME visiting the same directory.
+ ((buf (save-excursion
+ (unless create-new
+ (dolist (buffer vc-dir-buffers)
+ (when (buffer-live-p buffer)
+ (set-buffer buffer)
+ (when (and (derived-mode-p 'vc-dir-mode)
+ (eq vc-dir-backend backend)
+ (string= default-directory dir))
+ (return buffer))))))))
(or buf
;; Create a new buffer named BNAME.
(with-current-buffer (create-file-buffer bname)
@@ -360,7 +360,7 @@ If NOINSERT, ignore elements on ENTRIES which are not in the ewoc."
(unless node
(ewoc-enter-last
vc-ewoc (vc-dir-create-fileinfo
- dotname nil nil nil (expand-file-name default-directory)))
+ dotname nil nil nil default-directory))
(setq node (ewoc-nth vc-ewoc 0)))
(while (and entry node)
@@ -849,7 +849,7 @@ If it is a file, return the corresponding cons for the file itself."
;; Update the entries for all the child files of DIRNAME shown in
;; the current *vc-dir* buffer.
(let ((files (vc-dir-find-child-files dirname))
- (ddir (expand-file-name default-directory))
+ (ddir default-directory)
fileentries)
(when files
(dolist (crt files)
@@ -860,25 +860,25 @@ If it is a file, return the corresponding cons for the file itself."
(defun vc-dir-resynch-file (&optional fname)
"Update the entries for FNAME in any directory buffers that list it."
(let ((file (or fname (expand-file-name buffer-file-name)))
- (found-vc-dir-buf nil))
- (save-excursion
- (dolist (status-buf (buffer-list))
- (set-buffer status-buf)
- ;; look for a vc-dir buffer that might show this file.
- (when (derived-mode-p 'vc-dir-mode)
- (setq found-vc-dir-buf t)
- (let ((ddir (expand-file-name default-directory)))
- (when (vc-string-prefix-p ddir file)
- (if (file-directory-p file)
- (vc-dir-resync-directory-files file)
- (let ((state (vc-dir-recompute-file-state file ddir)))
- (vc-dir-update
- (list state)
- status-buf (eq (cadr state) 'up-to-date)))))))))
- ;; We didn't find any vc-dir buffers, remove the hook, it is
- ;; not needed.
- (unless found-vc-dir-buf
- (remove-hook 'after-save-hook 'vc-dir-resynch-file))))
+ (drop '()))
+ (save-current-buffer
+ ;; look for a vc-dir buffer that might show this file.
+ (dolist (status-buf vc-dir-buffers)
+ (if (not (buffer-live-p status-buf))
+ (push status-buf drop)
+ (set-buffer status-buf)
+ (if (not (derived-mode-p 'vc-dir-mode))
+ (push status-buf drop)
+ (let ((ddir default-directory))
+ (when (vc-string-prefix-p ddir file)
+ (if (file-directory-p file)
+ (vc-dir-resync-directory-files file)
+ (let ((state (vc-dir-recompute-file-state file ddir)))
+ (vc-dir-update
+ (list state)
+ status-buf (eq (cadr state) 'up-to-date))))))))))
+ ;; Remove out-of-date entries from vc-dir-buffers.
+ (dolist (b drop) (setq vc-dir-buffers (delq b vc-dir-buffers)))))
(defvar use-vc-backend) ;; dynamically bound
@@ -928,8 +928,8 @@ the *vc-dir* buffer.
(set (make-local-variable 'vc-ewoc) (ewoc-create #'vc-dir-printer))
(set (make-local-variable 'revert-buffer-function)
'vc-dir-revert-buffer-function)
- (setq list-buffers-directory (expand-file-name default-directory))
- (add-hook 'after-save-hook 'vc-dir-resynch-file)
+ (setq list-buffers-directory default-directory)
+ (add-to-list 'vc-dir-buffers (current-buffer))
;; Make sure that if the directory buffer is killed, the update
;; process running in the background is also killed.
(add-hook 'kill-buffer-query-functions 'vc-dir-kill-query nil t)