Subject: Re: bug#61901: 30.0.50; [PATCH v3] Add safe-local-variable-directories variable.

From: Antero Mejr <[email-masked]>
Date: Thu, 11 May 2023 21:38:33 +0000

Antero Mejr <[email-masked]> writes:

> Eli Zaretskii <[email-masked]> writes:
>
>>> > This actually means that I misunderstood the code.  Now that I see the
>>> > truth, why is it a good idea to compare directories case-sensitively
>>> > when the filesystem is not?  That's not something users will expect.
>>> 
>>> To accurately assess if a directory name matches with possible
>>> case-sensitivity, the process would be:
>>> 1. check the case-sensitivity of the filesystem
>>> 2. If case insensitive, check the case-sensitivity of each subdirectory
>>> (using Windows queryCaseSensitiveInfo if applicable)
>>> 3. map over the components of the directory name, checking each subdirectory
>>> with the correct case-sensitivity setting
>>
>> We already have all that in file-equal-p.  We should just use is
>> there.
>
> Ok, patch is attached (tested on FAT32 disk).

Please ignore that last patch, here is a corrected version with updated
docs. Since file-equal-p handles the trailing slash, now it doesn't
matter if there is/isn't one.

>From 175280bff2574cc7b826025903d4ca1802b7c5e6 Mon Sep 17 00:00:00 2001
From: Antero Mejr <[email-masked]>
Date: Thu, 11 May 2023 19:22:49 +0000
Subject: [PATCH] Handle case-insensitivity for
 safe-local-variable-directories.

* lisp/emacs-lisp/files.el (hack-local-variables-filter): Use
file-equal-p when checking safe-local-variable-directories.
* doc/lispref/variables.texi (File Local Variables): Remove sentences
in safe-local-variable-directories description about case-sensitivity
and trailing slash behaviors.
* doc/emacs/custom.texi (Safe File Variables): Remove sentence about
safe-local-variable-directories trailing slash behavior.  (Bug#61901)
---
 doc/emacs/custom.texi      | 7 +++----
 doc/lispref/variables.texi | 8 +++-----
 lisp/files.el              | 5 ++++-
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index d8abf81c75f..d8221f51425 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -1359,10 +1359,9 @@ certain directories, and skip the confirmation prompt when local
 variables are loaded from those directories, even if the variables are
 risky.  The variable @code{safe-local-variable-directories} holds the
 list of such directories.  The names of the directories in this list
-must be full absolute file names, and should end in a slash.  If the
-variable @code{enable-remote-dir-locals} has a non-@code{nil} value,
-the list can include remote directories as well (@pxref{Remote
-Files}).
+must be full absolute file names.  If the variable
+@code{enable-remote-dir-locals} has a non-@code{nil} value, the list
+can include remote directories as well (@pxref{Remote Files}).
 
 @vindex enable-local-variables
   The variable @code{enable-local-variables} allows you to change the
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index b3a8cd8110c..4eda035473e 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -1982,11 +1982,9 @@ This is a list of directories where local variables are always
 enabled.  Directory-local variables loaded from these directories,
 such as the variables in @file{.dir-locals.el}, will be enabled even
 if they are risky.  The directories in this list must be
-fully-expanded absolute file names that end in a directory separator
-character.  They may also be remote directories if the variable
-@code{enable-remote-dir-locals} is set non-@code{nil}.  Directories in
-this list are matched case-sensitively, even if the filesystem is
-case-sensitive.
+fully-expanded absolute file names.  They may also be remote
+directories if the variable @code{enable-remote-dir-locals} is set
+non-@code{nil}.
 @end defvar
 
 @defun hack-local-variables &optional handle-mode
diff --git a/lisp/files.el b/lisp/files.el
index 35d794f6dcf..148f47cbc97 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -3934,7 +3934,10 @@ DIR-NAME is the name of the associated directory.  Otherwise it is nil."
 		  (null unsafe-vars)
 		  (null risky-vars))
 	     (memq enable-local-variables '(:all :safe))
-             (member dir-name safe-local-variable-directories)
+             (delq nil (mapcar (lambda (dir)
+                                 (and dir-name dir
+                                      (file-equal-p dir dir-name)))
+                               safe-local-variable-directories))
 	     (hack-local-variables-confirm all-vars unsafe-vars
 					   risky-vars dir-name))
 	 (dolist (elt all-vars)
-- 
2.39.2