aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Zaretskii2004-02-16 13:59:46 +0000
committerEli Zaretskii2004-02-16 13:59:46 +0000
commit4e664f62f0123ccdb64584cb8e741e9631209245 (patch)
tree59f46394b3f9bdd328585246ca40680f547ac937
parent0f98bc23509b4e909cc92237e4b082c6866da258 (diff)
downloademacs-4e664f62f0123ccdb64584cb8e741e9631209245.tar.gz
emacs-4e664f62f0123ccdb64584cb8e741e9631209245.zip
Autorevert: Add support for VC controlled files.
(eval-when-compile): Defvar dired-directory and vc-mode. (auto-revert-vc-cvs-file-version, auto-revert-vc-buffer-p) (auto-revert-handler-vc): New functions.
-rw-r--r--lisp/ChangeLog7
-rw-r--r--lisp/autorevert.el82
2 files changed, 78 insertions, 11 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index c13e5dff431..88fa9377f46 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -5,13 +5,16 @@
5 5
62004-02-16 Jari Aalto <jari.aalto@poboxes.com> 62004-02-16 Jari Aalto <jari.aalto@poboxes.com>
7 7
8 Autorevert: Add support to detect changed dired buffers. 8 Autorevert: Add support to detect changed dired buffers and for
9 VC controlled files.
9 * autorevert.el (auto-revert-active-p, auto-revert-list-diff) 10 * autorevert.el (auto-revert-active-p, auto-revert-list-diff)
10 (auto-revert-dired-file-list, auto-revert-dired-changed-p) 11 (auto-revert-dired-file-list, auto-revert-dired-changed-p)
11 (auto-revert-handler, auto-revert-active-p): New functions. 12 (auto-revert-handler, auto-revert-active-p): New functions.
12 (auto-revert-buffers): Moved revert logic to `auto-revert-handler' 13 (auto-revert-buffers): Moved revert logic to `auto-revert-handler'
13 and `auto-revert-active-p'. 14 and `auto-revert-active-p'.
14 (eval-when-compile): Defvar dired-directory. 15 (eval-when-compile): Defvar dired-directory and vc-mode.
16 (auto-revert-vc-cvs-file-version, auto-revert-vc-buffer-p)
17 (auto-revert-handler-vc): New functions.
15 18
162004-02-16 Alfred M. Szmidt <ams@kemisten.nu> (tiny change) 192004-02-16 Alfred M. Szmidt <ams@kemisten.nu> (tiny change)
17 20
diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index 309517476e1..a720e547b20 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -71,9 +71,12 @@
71 71
72(require 'timer) 72(require 'timer)
73(autoload 'dired-get-filename "dired") 73(autoload 'dired-get-filename "dired")
74(autoload 'vc-workfile-version "vc-hooks")
75(autoload 'vc-mode-line "vc-hooks")
74 76
75(eval-when-compile 77(eval-when-compile
76 (defvar dired-directory) 78 (defvar dired-directory)
79 (defvar vc-mode)
77 (require 'cl)) 80 (require 'cl))
78 81
79 82
@@ -294,10 +297,13 @@ Use `auto-revert-mode' to revert a particular buffer."
294 297
295(defun auto-revert-buffer-p () 298(defun auto-revert-buffer-p ()
296 "Check if current buffer should be reverted." 299 "Check if current buffer should be reverted."
297 ;; Always include dired buffers to list. It would be too expensive 300 ;; - Always include dired buffers to list. It would be too expensive
298 ;; to test the "revert" status here each time timer launches. 301 ;; to test the "revert" status here each time timer launches.
302 ;; - Same for VC buffers.
299 (or (eq major-mode 'dired-mode) 303 (or (eq major-mode 'dired-mode)
300 (and (not (buffer-modified-p)) 304 (and (not (buffer-modified-p))
305 (auto-revert-vc-buffer-p))
306 (and (not (buffer-modified-p))
301 (if (buffer-file-name) 307 (if (buffer-file-name)
302 (and (file-readable-p (buffer-file-name)) 308 (and (file-readable-p (buffer-file-name))
303 (not (verify-visited-file-modtime (current-buffer)))) 309 (not (verify-visited-file-modtime (current-buffer))))
@@ -306,23 +312,81 @@ Use `auto-revert-mode' to revert a particular buffer."
306 global-auto-revert-non-file-buffers) 312 global-auto-revert-non-file-buffers)
307 auto-revert-mode)))))) 313 auto-revert-mode))))))
308 314
315(defun auto-revert-vc-cvs-file-version (file)
316 "Get version of FILE by reading control file on disk."
317 (let* ((control "CVS/Entries")
318 (name (file-name-nondirectory file))
319 (path (format "%s/%s"
320 (file-name-directory file)
321 control)))
322 (when (file-exists-p path)
323 (with-temp-buffer
324 (insert-file-contents-literally path)
325 (goto-char (point-min))
326 (when (re-search-forward
327 ;; /file.txt/1.3/Mon Sep 15 18:43:20 2003//
328 (format "%s/\\([.0-9]+\\)" (regexp-quote name))
329 nil t)
330 (match-string 1))))))
331
332(defun auto-revert-vc-buffer-p ()
333 "Check if buffer is version controlled."
334 (and (boundp 'vc-mode)
335 (string-match "[0-9]" (or vc-mode ""))))
336
337(defun auto-revert-handler-vc ()
338 "Check if version controlled buffer needs revert."
339 ;; [Emacs 1]
340 ;; 1. File is saved (*)
341 ;; 2. checkin is done 1.1 -> 1.2
342 ;; 3. VC reverts, so that updated version number is shown in mode line
343 ;;
344 ;; Suppose the same file has been opened in another Emacs and
345 ;; autorevert.el is on.
346 ;;
347 ;; [Emacs 2]
348 ;; 1. Step (1) is detected and buffer is reverted.
349 ;; 2. But check in does not always change the file in dis, but possibly only
350 ;; control files like CVS/Entries
351 ;; 3. The buffer is not reverted to update VC version line.
352 ;; Incorrect version number 1.1 is shown in this Emacs
353 ;;
354 (when (featurep 'vc)
355 (let* ((file (buffer-file-name))
356 (backend (vc-backend (buffer-file-name)))
357 (version-buffer (vc-workfile-version file)))
358 (when (stringp version-buffer)
359 (cond
360 ((eq backend 'CVS)
361 (let ((version-file
362 (auto-revert-vc-cvs-file-version (buffer-file-name))))
363 (and (stringp version-file)
364 (not (string-match version-file version-buffer)))))
365 ((eq backend 'RCS)
366 ;; TODO:
367 ))))))
368
309(defun auto-revert-handler () 369(defun auto-revert-handler ()
310 "Revert current buffer." 370 "Revert current buffer."
311 (let (done) 371 (let (revert)
312 (cond 372 (cond
313 ((eq major-mode 'dired-mode) 373 ((eq major-mode 'dired-mode)
314 ;; Dired includes revert-buffer-function 374 ;; Dired includes revert-buffer-function
315 (when (and revert-buffer-function 375 (when (and revert-buffer-function
316 (auto-revert-dired-changed-p)) 376 (auto-revert-dired-changed-p))
317 (setq done t) 377 (setq revert t)))
318 (revert-buffer t t t))) 378 ((auto-revert-vc-buffer-p)
379 (when (auto-revert-handler-vc)
380 (setq revert 'vc)))
319 ((or (buffer-file-name) 381 ((or (buffer-file-name)
320 revert-buffer-function) 382 revert-buffer-function)
321 (setq done t) 383 (setq revert t)))
322 (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes))) 384 (when revert
323 (if (and done 385 (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes)
324 auto-revert-verbose) 386 (if (eq revert 'vc)
325 (message "Reverting buffer `%s'." (buffer-name))))) 387 (vc-mode-line buffer-file-name))
388 (if auto-revert-verbose
389 (message "Reverting buffer `%s'." (buffer-name))))))
326 390
327(defun auto-revert-buffers () 391(defun auto-revert-buffers ()
328 "Revert buffers as specified by Auto-Revert and Global Auto-Revert Mode. 392 "Revert buffers as specified by Auto-Revert and Global Auto-Revert Mode.