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.