changeset 84987:9f33047587c7

(auto-revert-handler): In `auto-revert-tail-mode', check only for changed size. (auto-revert-tail-handler): Get size from caller. If the file has shrunk, tail the whole file again (the file presumably has been rewritten).
author David Kastrup <dak@gnu.org>
date Sun, 30 Sep 2007 20:26:55 +0000
parents 4d9afe4d96b4
children 2e9aec8f7126
files lisp/ChangeLog lisp/autorevert.el
diffstat 2 files changed, 20 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sun Sep 30 19:10:44 2007 +0000
+++ b/lisp/ChangeLog	Sun Sep 30 20:26:55 2007 +0000
@@ -1,5 +1,11 @@
 2007-09-30  David Kastrup  <dak@gnu.org>
 
+	* autorevert.el (auto-revert-handler): In `auto-revert-tail-mode',
+	check only for changed size.
+	(auto-revert-tail-handler): Get size from caller.  If the file has
+	shrunk, tail the whole file again (the file presumably has been
+	rewritten).
+
 	* woman.el (woman-topic-all-completions, woman-mini-help): Fix
 	fallout from 2007-09-07 introduction of `dolist' when the list
 	actually was being manipulated in the loop.
--- a/lisp/autorevert.el	Sun Sep 30 19:10:44 2007 +0000
+++ b/lisp/autorevert.el	Sun Sep 30 20:26:55 2007 +0000
@@ -416,12 +416,16 @@
   "Revert current buffer, if appropriate.
 This is an internal function used by Auto-Revert Mode."
   (when (or auto-revert-tail-mode (not (buffer-modified-p)))
-    (let* ((buffer (current-buffer))
+    (let* ((buffer (current-buffer)) size
 	   (revert
 	    (or (and buffer-file-name
 		     (not (file-remote-p buffer-file-name))
 		     (file-readable-p buffer-file-name)
-		     (not (verify-visited-file-modtime buffer)))
+		     (if auto-revert-tail-mode
+			 (/= auto-revert-tail-pos
+			    (setq size
+				  (nth 7 (file-attributes buffer-file-name))))
+		       (not (verify-visited-file-modtime buffer))))
 		(and (or auto-revert-mode
 			 global-auto-revert-non-file-buffers)
 		     revert-buffer-function
@@ -445,7 +449,7 @@
 		    (push window eoblist)))
 	   'no-mini t))
 	(if auto-revert-tail-mode
-	    (auto-revert-tail-handler)
+	    (auto-revert-tail-handler size)
 	  ;; Bind buffer-read-only in case user has done C-x C-q,
 	  ;; so as not to forget that.  This gives undesirable results
 	  ;; when the file's mode changes, but that is less common.
@@ -460,20 +464,22 @@
       (when (or revert auto-revert-check-vc-info)
 	(vc-find-file-hook)))))
 
-(defun auto-revert-tail-handler ()
-  (let ((size (nth 7 (file-attributes buffer-file-name)))
-	(modified (buffer-modified-p))
+(defun auto-revert-tail-handler (size)  
+  (let ((modified (buffer-modified-p))
 	(inhibit-read-only t)		; Ignore.
 	(file buffer-file-name)
 	(buffer-file-name nil))		; Ignore that file has changed.
-    (when (> size auto-revert-tail-pos)
+    (when (/= auto-revert-tail-pos size)
       (run-hooks 'before-revert-hook)
       (undo-boundary)
       (save-restriction
 	(widen)
 	(save-excursion
 	  (goto-char (point-max))
-	  (insert-file-contents file nil auto-revert-tail-pos size)))
+	  (insert-file-contents file nil
+				(and (< auto-revert-tail-pos size)
+				     auto-revert-tail-pos)
+				size)))
       (run-hooks 'after-revert-hook)
       (undo-boundary)
       (setq auto-revert-tail-pos size)