From a08a9a9aead5c03a9e0eba3b2e6f5117283cde96 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Fri, 5 Nov 2021 20:46:35 +0100 Subject: [PATCH] Improve `file-has-changed-p' * 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 | 16 ++++++++-------- lisp/files.el | 14 +++++++++----- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi index 24f059ea4c6..ddc1d05c1ca 100644 --- a/doc/lispref/files.texi +++ b/doc/lispref/files.texi @@ -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 diff --git a/lisp/files.el b/lisp/files.el index 173198a4246..3af97303268 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -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)) -- 2.39.2