]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve `file-has-changed-p'
authorMichael Albinus <michael.albinus@gmx.de>
Fri, 5 Nov 2021 19:46:35 +0000 (20:46 +0100)
committerMichael Albinus <michael.albinus@gmx.de>
Fri, 5 Nov 2021 19:46:35 +0000 (20:46 +0100)
* doc/lispref/files.texi (File Attributes): Be precise when
filename does not exist in `file-has-changed-p'.

* lisp/files.el (file-has-changed-p): Suppress remote file caches.
Handle the case FILE does not exists.

doc/lispref/files.texi
lisp/files.el

index 24f059ea4c6f264d727d394ba361ce46afb4e1e8..ddc1d05c1cadf6431573165268bc35b28ea03f46 100644 (file)
@@ -1318,14 +1318,14 @@ on the 19th, @file{aug-20} was written on the 20th, and the file
 This function returns non-@code{nil} if the time stamp of
 @var{filename} has changed since the last call.  When called for the
 first time for some @var{filename}, it records the last modification
-time and size of the file, and returns non-@code{nil}.  Thereafter,
-when called for the same @var{filename}, it compares the current time
-stamp and size with the recorded ones, and returns non-@code{nil} only
-if either the time stamp or the size (or both) are different.  This is
-useful when a Lisp program wants to re-read a file whenever it
-changes.  With an optional argument @var{tag}, which must be a symbol,
-the size and modification time comparisons are limited to calls with
-the same tag.
+time and size of the file, and returns non-@code{nil} when
+@var{filename} exists.  Thereafter, when called for the same
+@var{filename}, it compares the current time stamp and size with the
+recorded ones, and returns non-@code{nil} only if either the time
+stamp or the size (or both) are different.  This is useful when a Lisp
+program wants to re-read a file whenever it changes.  With an optional
+argument @var{tag}, which must be a symbol, the size and modification
+time comparisons are limited to calls with the same tag.
 @end defun
 
 @defun file-attributes filename &optional id-format
index 173198a42461a6d0a717bda0e44bec6fee1dce4f..3af97303268e5dca5615edf83e377d1ad415b037 100644 (file)
@@ -6187,15 +6187,19 @@ Return nil if DIR is not an existing directory."
 (defun file-has-changed-p (file &optional tag)
   "Return non-nil if FILE has changed.
 The size and modification time of FILE are compared to the size
-and modification time of tghe same FILE during a previous
+and modification time of the same FILE during a previous
 invocation of `file-has-changed-p'.  Thus, the first invocation
-of `file-has-changed-p' always returns non-nil.
+of `file-has-changed-p' always returns non-nil when FILE exists.
 The optional argument TAG, which must be a symbol, can be used to
 limit the comparison to invocations with identical tags; it can be
 the symbol of the calling function, for example."
-  (let* ((fileattr (file-attributes file 'integer))
-        (attr (cons (file-attribute-size fileattr)
-                    (file-attribute-modification-time fileattr)))
+  (let* (;; FIXME: Shall we use `file-truename'?
+         (file (directory-file-name file))
+         (remote-file-name-inhibit-cache t)
+         (fileattr (file-attributes file 'integer))
+        (attr (and fileattr
+                    (cons (file-attribute-size fileattr)
+                         (file-attribute-modification-time fileattr))))
         (sym (concat (symbol-name tag) "@" file))
         (cachedattr (gethash sym file-has-changed-p--hash-table)))
      (when (not (equal attr cachedattr))