]> git.eshelyaron.com Git - emacs.git/commitdiff
auto-revert-mode can now revert immediately in response to a change event
authorDima Kogan <dima@secretsauce.net>
Thu, 19 Feb 2015 20:36:03 +0000 (21:36 +0100)
committerMichael Albinus <michael.albinus@gmx.de>
Thu, 19 Feb 2015 20:36:03 +0000 (21:36 +0100)
Fixes: debbugs:18958
* autorevert.el (auto-revert-buffers-counter)
(auto-revert-buffers-counter-lockedout): New variables.
(auto-revert-buffers): Increase `auto-revert-buffers-counter'.
(auto-revert-notify-handler): Apply `auto-revert-handler' if not
suppressed by lockout.

lisp/ChangeLog
lisp/autorevert.el

index cdcb340614a777a18bfdd8efc2c02c28095b8af2..3d15b4095bf82280a900143a26fc4779bc4edb1d 100644 (file)
@@ -1,3 +1,11 @@
+2015-02-19  Dima Kogan  <dima@secretsauce.net>
+
+       * autorevert.el (auto-revert-buffers-counter)
+       (auto-revert-buffers-counter-lockedout): New variables.
+       (auto-revert-buffers): Increase `auto-revert-buffers-counter'.
+       (auto-revert-notify-handler): Apply `auto-revert-handler' if not
+       suppressed by lockout.  (Bug#18958)
+
 2015-02-19  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * emacs-lisp/eieio-opt.el (eieio-help-class): `eieio-class-parents'
@@ -29,7 +37,7 @@
        * files.el (find-alternate-file, abort-if-file-too-large, write-file)
        (set-visited-file-name):
        * emacs-lisp/lisp.el (kill-backward-up-list):
-       Use user-error instead of error. (Bug#14480)
+       Use user-error instead of error.  (Bug#14480)
 
 2015-02-18  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * emacs-lisp/easy-mmode.el (define-minor-mode): Process macro
        arguments correctly. (Bug#19685)
        (define-minor-mode): Clarify docstring.
-       Clarify mode switch messages for minor modes. (Bug#19690)
+       Clarify mode switch messages for minor modes.  (Bug#19690)
 
 2015-02-16  Kelly Dean  <kelly@prtime.org>
 
        * emacs-lisp/package-x.el (package-upload-buffer-internal):
-       Create valid tar files. (Bug#19536)
+       Create valid tar files.  (Bug#19536)
 
 2015-02-16  Kelly Dean  <kelly@prtime.org>
 
@@ -60,7 +68,7 @@
 2015-02-16  Kelly Dean  <kelly@prtime.org>
 
        * help-mode.el (help-do-xref): Prevent duplicated display of Info
-       buffer, and prevent interference with existing buffer. (Bug#13190)
+       buffer, and prevent interference with existing buffer.  (Bug#13190)
 
 2015-02-16  Fabián Ezequiel Gallina  <fgallina@gnu.org>
 
index 8c8c6174c473a50849cec0d8601ab169ffa43d15..02cef24f2aaace914034650cdaaa990a4e7ca005 100644 (file)
@@ -531,6 +531,30 @@ will use an up-to-date value of `auto-revert-interval'"
       ;; Fallback to file checks.
       (set (make-local-variable 'auto-revert-use-notify) nil))))
 
+;; If we have file notifications, we want to update the auto-revert buffers
+;; immediately when a notification occurs. Since file updates can happen very
+;; often, we want to skip some revert operations so that we don't spend all our
+;; time reverting the buffer.
+;;
+;; We do this by reverting immediately in response to the first in a flurry of
+;; notifications. We suppress subsequent notifications until the next time
+;; `auto-revert-buffers' is called (this happens on a timer with a period set by
+;; `auto-revert-interval').
+(defvar auto-revert-buffers-counter 1
+  "Incremented each time `auto-revert-buffers' is called")
+(defvar-local auto-revert-buffers-counter-lockedout 0
+  "Buffer-local value to indicate whether we should immediately
+update the buffer on a notification event or not. If
+
+  (= auto-revert-buffers-counter-lockedout
+     auto-revert-buffers-counter)
+
+then the updates are locked out, and we wait until the next call
+of `auto-revert-buffers' to revert the buffer. If no lockout is
+present, then we revert immediately and set the lockout, so that
+no more reverts are possible until the next call of
+`auto-revert-buffers'")
+
 (defun auto-revert-notify-handler (event)
   "Handle an EVENT returned from file notification."
   (with-demoted-errors
@@ -566,6 +590,14 @@ will use an up-to-date value of `auto-revert-interval'"
                                 (file-name-nondirectory buffer-file-name)))))
                 ;; Mark buffer modified.
                 (setq auto-revert-notify-modified-p t)
+
+                ;; Revert the buffer now if we're not locked out
+                (when (/= auto-revert-buffers-counter-lockedout
+                          auto-revert-buffers-counter)
+                  (auto-revert-handler)
+                  (setq auto-revert-buffers-counter-lockedout
+                        auto-revert-buffers-counter))
+
                 ;; No need to check other buffers.
                 (cl-return)))))))))
 
@@ -686,6 +718,10 @@ are checked first the next time this function is called.
 This function is also responsible for removing buffers no longer in
 Auto-Revert mode from `auto-revert-buffer-list', and for canceling
 the timer when no buffers need to be checked."
+
+  (setq auto-revert-buffers-counter
+        (1+ auto-revert-buffers-counter))
+
   (save-match-data
     (let ((bufs (if global-auto-revert-mode
                    (buffer-list)