Mercurial > emacs
comparison lisp/autorevert.el @ 83038:30ccd595ccb0
Merged in changes from CVS HEAD
Patches applied:
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-98
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-99
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-100
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-101
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-102
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-78
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Wed, 18 Feb 2004 17:10:32 +0000 |
parents | d2d55f9f67e7 |
children | b0a078151291 |
comparison
equal
deleted
inserted
replaced
83037:03a73693678e | 83038:30ccd595ccb0 |
---|---|
69 | 69 |
70 ;; Dependencies: | 70 ;; Dependencies: |
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 |
80 ;; Custom Group: | 83 ;; Custom Group: |
81 ;; | 84 ;; |
292 (or (not (eq (length files) (length dired))) | 295 (or (not (eq (length files) (length dired))) |
293 (auto-revert-list-diff files dired))))) | 296 (auto-revert-list-diff files dired))))) |
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. |
299 (or (eq major-mode 'dired-mode) | 302 ;; - Same for VC buffers. |
303 (or (and (eq major-mode 'dired-mode) | |
304 (or (and global-auto-revert-mode | |
305 global-auto-revert-non-file-buffers) | |
306 auto-revert-mode)) | |
307 (and (not (buffer-modified-p)) | |
308 (auto-revert-vc-buffer-p)) | |
300 (and (not (buffer-modified-p)) | 309 (and (not (buffer-modified-p)) |
301 (if (buffer-file-name) | 310 (if (buffer-file-name) |
302 (and (file-readable-p (buffer-file-name)) | 311 (and (file-readable-p (buffer-file-name)) |
303 (not (verify-visited-file-modtime (current-buffer)))) | 312 (not (verify-visited-file-modtime (current-buffer)))) |
304 (and revert-buffer-function | 313 (and revert-buffer-function |
305 (or (and global-auto-revert-mode | 314 (or (and global-auto-revert-mode |
306 global-auto-revert-non-file-buffers) | 315 global-auto-revert-non-file-buffers) |
307 auto-revert-mode)))))) | 316 auto-revert-mode)))))) |
308 | 317 |
318 (defun auto-revert-vc-cvs-file-version (file) | |
319 "Get version of FILE by reading control file on disk." | |
320 (let* ((control "CVS/Entries") | |
321 (name (file-name-nondirectory file)) | |
322 (path (format "%s/%s" | |
323 (file-name-directory file) | |
324 control))) | |
325 (when (file-exists-p path) | |
326 (with-temp-buffer | |
327 (insert-file-contents-literally path) | |
328 (goto-char (point-min)) | |
329 (when (re-search-forward | |
330 ;; /file.txt/1.3/Mon Sep 15 18:43:20 2003// | |
331 (format "%s/\\([.0-9]+\\)" (regexp-quote name)) | |
332 nil t) | |
333 (match-string 1)))))) | |
334 | |
335 (defun auto-revert-vc-buffer-p () | |
336 "Check if buffer is version controlled." | |
337 (and (boundp 'vc-mode) | |
338 (string-match "[0-9]" (or vc-mode "")))) | |
339 | |
340 (defun auto-revert-handler-vc () | |
341 "Check if version controlled buffer needs revert." | |
342 ;; [Emacs 1] | |
343 ;; 1. File is saved (*) | |
344 ;; 2. checkin is done 1.1 -> 1.2 | |
345 ;; 3. VC reverts, so that updated version number is shown in mode line | |
346 ;; | |
347 ;; Suppose the same file has been opened in another Emacs and | |
348 ;; autorevert.el is on. | |
349 ;; | |
350 ;; [Emacs 2] | |
351 ;; 1. Step (1) is detected and buffer is reverted. | |
352 ;; 2. But check in does not always change the file in dis, but possibly only | |
353 ;; control files like CVS/Entries | |
354 ;; 3. The buffer is not reverted to update VC version line. | |
355 ;; Incorrect version number 1.1 is shown in this Emacs | |
356 ;; | |
357 (when (featurep 'vc) | |
358 (let* ((file (buffer-file-name)) | |
359 (backend (vc-backend (buffer-file-name))) | |
360 (version-buffer (vc-workfile-version file))) | |
361 (when (stringp version-buffer) | |
362 (cond | |
363 ((eq backend 'CVS) | |
364 (let ((version-file | |
365 (auto-revert-vc-cvs-file-version (buffer-file-name)))) | |
366 (and (stringp version-file) | |
367 (not (string-match version-file version-buffer))))) | |
368 ((eq backend 'RCS) | |
369 ;; TODO: | |
370 )))))) | |
371 | |
309 (defun auto-revert-handler () | 372 (defun auto-revert-handler () |
310 "Revert current buffer." | 373 "Revert current buffer." |
311 (let (done) | 374 (let (revert) |
312 (cond | 375 (cond |
313 ((eq major-mode 'dired-mode) | 376 ((eq major-mode 'dired-mode) |
314 ;; Dired includes revert-buffer-function | 377 ;; Dired includes revert-buffer-function |
315 (when (and revert-buffer-function | 378 (when (and revert-buffer-function |
316 (auto-revert-dired-changed-p)) | 379 (auto-revert-dired-changed-p)) |
317 (setq done t) | 380 (setq revert t))) |
318 (revert-buffer t t t))) | 381 ((auto-revert-vc-buffer-p) |
382 (when (auto-revert-handler-vc) | |
383 (setq revert 'vc))) | |
319 ((or (buffer-file-name) | 384 ((or (buffer-file-name) |
320 revert-buffer-function) | 385 revert-buffer-function) |
321 (setq done t) | 386 (setq revert t))) |
322 (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes))) | 387 (when revert |
323 (if (and done | 388 (revert-buffer 'ignore-auto 'dont-ask 'preserve-modes) |
324 auto-revert-verbose) | 389 (if (eq revert 'vc) |
325 (message "Reverting buffer `%s'." (buffer-name))))) | 390 (vc-mode-line buffer-file-name)) |
391 (if auto-revert-verbose | |
392 (message "Reverting buffer `%s'." (buffer-name)))))) | |
326 | 393 |
327 (defun auto-revert-buffers () | 394 (defun auto-revert-buffers () |
328 "Revert buffers as specified by Auto-Revert and Global Auto-Revert Mode. | 395 "Revert buffers as specified by Auto-Revert and Global Auto-Revert Mode. |
329 | 396 |
330 Should `global-auto-revert-mode' be active all file buffers are checked. | 397 Should `global-auto-revert-mode' be active all file buffers are checked. |