Subject: bug#44698: 27.1; dir-locals.el stay on file-local-variables-alist when using vc-mode

From: Stefan Kangas <[email-masked]>
Date: Sat, 8 Mar 2025 08:07:57 +0000

Sean Whitton <[email-masked]> writes:

> Hello,
>
> On Mon 16 Nov 2020 at 09:30pm +01, Miguel Ángel Arruga Vivas wrote:
>
>> While using vc-mode, the dir-locals.el variables under 'nil' mode are
>> accumulated on file-local-variables-alist and they still apply after
>> exiting the scope of the file.  The attached script can be used to
>> reproduce it (Emacs 27.1, on GNU Guix
>> f6e031ab36fd99ad3536caabfdaefcc2b5f606a1).
>>
>> It generates a temporary folder with two example git repositories, an
>> offending dir-locals.el[1], launches an emacs with -Q and the shows
>> the steps to follow:
>>
>> 1. Open p1/file and accept the .dir-locals.el variables.
>> 2. Call vc-print-log
>> 3. Check the file-local-variables-alist
>> 4. Open p2/file (this one doesn't have .dir-locals.el).
>> 5. Call vc-print-log again, the message is shown again.
>
> The problem here is that file-local-variables-alist is marked
> permanent-local, and vc-log-internal-common re-uses the *vc-change-log*
> buffer, so the variable sticks around.  Clearly that is wrong.
>
> What's the idiomatic thing to do in this sort of situation?
>
> Should vc-log-internal-common kill the buffer and re-create it?
>
> That's the change I'll make if no-one has a better idea.

I think you can use `kill-all-local-variables` for this:

    (kill-all-local-variables 'kill-permanent)