Subject: bug#8095: closed (Re: bug#8095: dir-locals-directory-cache confusion)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 24 Feb 2011 08:59:02 +0000

Your bug report

#8095: dir-locals-directory-cache confusion

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
8095: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=8095
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#8095: dir-locals-directory-cache confusion
From: Glenn Morris <[email-masked]>
To: [email-masked]
Date: Thu, 24 Feb 2011 03:58:24 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

Version: 24.1

I believe I fixed this mess in the trunk.

Subject: dir-locals-directory-cache confusion
From: Glenn Morris <[email-masked]>
To: [email-masked]
Date: Tue, 22 Feb 2011 03:31:45 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

Package: emacs
Version: 23.2.94

There is some weirdness going on with caching of dir-locals files:

mkdir foo

cat <<EOF > foo/.dir-locals.el
((nil . ((sentence-end-double-space . t))))
EOF

emacs -q foo/.dir-locals.el

C-h v sentence-end-double-space

   This variable is a directory local variable
      from the file "/home/gm/tmp/foo/".
               ^^^^^^^^^^^^^^^^^^^^^^^

That's a directory, not a file. Then do:

M-: (setq dir-locals-directory-cache nil)

and repeat:

C-h v sentence-end-double-space

   This variable is a directory local variable
      from the file "/home/gm/tmp/foo/.dir-locals.el".
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

OK, now it's a directory.

Analysis: dir-locals-find-file is either going to return a file (if it
did not find a matching entry in the cache), or a directory (if it did
find an entry in the cache).

Further comment: This line in dir-locals-find-file

(equal (nth 2 dir-elt)
       (nth 5 (file-attributes (car dir-elt))))

compares the mtime element from the cache with the current mtime of the
*directory*. The mtime element in the cache is set by
dir-locals-read-from-file and is the mtime of the *file*.

So in summary there is some confusion between directory and files that
messes up the caching. The whole thing should be consistent about
whether it wants to refer to directories or files.