From 6a88f031c8a895c87143da01201502e966aa7641 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Thu, 24 Feb 2011 00:45:25 -0800 Subject: [PATCH] Yet more directory-local variables fixes. * lisp/files-x.el (modify-dir-local-variable): Handle dir-locals from the cache, and from non-file sources. --- lisp/ChangeLog | 3 +++ lisp/files-x.el | 22 ++++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 05bddd0a7d9..c44c491cad0 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,8 @@ 2011-02-24 Glenn Morris + * files-x.el (modify-dir-local-variable): Handle dir-locals from + the cache, and from non-file sources. + * help-fns.el (describe-variable): Return consistent results when a dir-local from a file came from the cache or did not. (Bug#8095) If a dir-local has no associated file, say it came from a "directory". diff --git a/lisp/files-x.el b/lisp/files-x.el index a3cb5331e67..a9c32477155 100644 --- a/lisp/files-x.el +++ b/lisp/files-x.el @@ -360,18 +360,28 @@ from the MODE alist ignoring the input argument VALUE." (catch 'exit (unless enable-local-variables (throw 'exit (message "Directory-local variables are disabled"))) - (let ((variables-file (or (and (buffer-file-name) (not (file-remote-p (buffer-file-name))) (dir-locals-find-file (buffer-file-name))) dir-locals-file)) variables) - + (if (consp variables-file) ; result from cache + ;; If cache element has an mtime, assume it came from a file. + ;; Otherwise, assume it was set directly. + (setq variables-file (if (nth 2 variables-file) + (expand-file-name dir-locals-file + (car variables-file)) + (cadr variables-file)))) + ;; I can't be bothered to handle this case right now. + ;; Dir locals were set directly from a class. You need to + ;; directly modify the class in dir-locals-class-alist. + (and variables-file (not (stringp variables-file)) + (throw 'exit (message "Directory locals were not set from a file"))) ;; Don't create ".dir-locals.el" for the deletion operation. - (when (and (eq op 'delete) - (not (file-exists-p variables-file))) - (throw 'exit (message "File .dir-locals.el not found"))) - + (and (eq op 'delete) + (or (not variables-file) + (not (file-exists-p variables-file))) + (throw 'exit (message "No .dir-locals.el file was found"))) (let ((auto-insert nil)) (find-file variables-file)) (widen) -- 2.39.2