diff options
| author | Eli Zaretskii | 2004-02-16 13:59:46 +0000 |
|---|---|---|
| committer | Eli Zaretskii | 2004-02-16 13:59:46 +0000 |
| commit | 4e664f62f0123ccdb64584cb8e741e9631209245 (patch) | |
| tree | 59f46394b3f9bdd328585246ca40680f547ac937 | |
| parent | 0f98bc23509b4e909cc92237e4b082c6866da258 (diff) | |
| download | emacs-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/ChangeLog | 7 | ||||
| -rw-r--r-- | lisp/autorevert.el | 82 |
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 | ||
| 6 | 2004-02-16 Jari Aalto <jari.aalto@poboxes.com> | 6 | 2004-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 | ||
| 16 | 2004-02-16 Alfred M. Szmidt <ams@kemisten.nu> (tiny change) | 19 | 2004-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. |