emacs-31 707b0ba0f4c 1/3: Fix project--clear-cache and project--value-in-dir in special case

Dmitry Gutov <[email protected]> Thu, 2 Jul 2026 02:01:32 -0400 (EDT)
Newsgroups gmane.emacs.diffs
Message-ID <[email protected]>
branch: emacs-31
commit 707b0ba0f4cc59b451ea039b01af5c977d96e46d
Author: Dmitry Gutov <[email protected]>
Commit: Dmitry Gutov <[email protected]>

    Fix project--clear-cache and project--value-in-dir in special case
    
    * lisp/progmodes/project.el (project--clear-cache): Make sure to
    clear the 'project-vc-dir-locals' keys too.
    (project--value-in-dir): Predicate the cache lookup (and most
    importantly, write) on whether enable-dir-local-variables is
    non-nil.  So its uses inside recursive 'project-try-vc--search'
    call do not not bust the value (bug#81317).
---
 lisp/progmodes/project.el | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
index ebbaa7609ea..557d4260b77 100644
--- a/lisp/progmodes/project.el
+++ b/lisp/progmodes/project.el
@@ -647,7 +647,9 @@ It is used when `non-essential' is non-nil.")
   (obarray-map
    (lambda (sym)
      (if (get sym 'project-vc)
-         (put sym 'project-vc nil)))
+         (put sym 'project-vc nil))
+     (if (get sym 'project-vc-dir-locals)
+         (put sym 'project-vc-dir-locals nil)))
    vc-file-prop-obarray))
 
 (defun project-try-vc (dir)
@@ -967,13 +969,15 @@ DIRS must contain directory names."
 (defun project--value-in-dir (var dir)
   (alist-get
    var
-   (let ((cached (project--get-cached dir 'project-vc-dir-locals)))
-     (if (eq cached 'none)
-         nil
-       (or cached
-           (let ((res (project--read-dir-locals dir)))
-             (project--set-cached dir 'project-vc-dir-locals (or res 'none))
-             res))))
+   (and
+    enable-dir-local-variables
+    (let ((cached (project--get-cached dir 'project-vc-dir-locals)))
+      (if (eq cached 'none)
+          nil
+        (or cached
+            (let ((res (project--read-dir-locals dir)))
+              (project--set-cached dir 'project-vc-dir-locals (or res 'none))
+              res)))))
    (default-value var)))
 
 (defun project--read-dir-locals (dir)