summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorLars Ingebrigtsen <larsi@gnus.org>2020-10-20 13:07:25 +0200
committerLars Ingebrigtsen <larsi@gnus.org>2020-10-20 13:07:25 +0200
commit117d58ace75fc210c15e6815d965b080466edc55 (patch)
treef101061d5f5653858ef820479a3420ec197407ad /lisp
parente7b8c93f94a2f7ccab5a872d6454f312a2a37a70 (diff)
downloademacs-117d58ace75fc210c15e6815d965b080466edc55.tar.gz
emacs-117d58ace75fc210c15e6815d965b080466edc55.tar.bz2
emacs-117d58ace75fc210c15e6815d965b080466edc55.zip
Preserve all `eval' elements from both .dir-locals files
* lisp/files.el (dir-locals-read-from-dir): Preserve all `eval' elements from both .dir-locals files (bug#44066).
Diffstat (limited to 'lisp')
-rw-r--r--lisp/emacs-lisp/seq.el1
-rw-r--r--lisp/files.el24
2 files changed, 22 insertions, 3 deletions
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 9073f9c7a51..4656277ea16 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -474,6 +474,7 @@ Equality is defined by TESTFN if non-nil or by `equal' if nil."
(seq-reverse sequence1)
'()))
+;;;###autoload
(cl-defgeneric seq-group-by (function sequence)
"Apply FUNCTION to each element of SEQUENCE.
Separate the elements of SEQUENCE into an alist using the results as
diff --git a/lisp/files.el b/lisp/files.el
index c2c58dae934..bbc8f881590 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -4301,9 +4301,27 @@ Return the new class name, which is a symbol named DIR."
(if (not (and newvars variables))
(or newvars variables)
(require 'map)
- (map-merge-with 'list (lambda (a b) (map-merge 'list a b))
- variables
- newvars))))))
+ ;; We want to make the variable setting from
+ ;; newvars (the second .dir-locals file) take
+ ;; presedence over the old variables, but we also
+ ;; want to preserve all `eval' elements as is from
+ ;; both lists.
+ (map-merge-with
+ 'list
+ (lambda (a b)
+ (let ((ag
+ (seq-group-by
+ (lambda (e) (eq (car e) 'eval)) a))
+ (bg
+ (seq-group-by
+ (lambda (e) (eq (car e) 'eval)) b)))
+ (append (map-merge 'list
+ (assoc-default nil ag)
+ (assoc-default nil bg))
+ (assoc-default t ag)
+ (assoc-default t bg))))
+ variables
+ newvars))))))
(setq success latest))
(setq variables (dir-locals--sort-variables variables))
(dir-locals-set-class-variables class-name variables)