emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-25 71b20b3: Backport: * lisp/files.el: Remove suppor


From: Artur Malabarba
Subject: [Emacs-diffs] emacs-25 71b20b3: Backport: * lisp/files.el: Remove support for extra .dir-locals file
Date: Sat, 30 Jan 2016 21:55:26 +0000

branch: emacs-25
commit 71b20b31c8ee25bcd0de1a954c9ca7b49140b3b2
Author: Artur Malabarba <address@hidden>
Commit: Artur Malabarba <address@hidden>

    Backport: * lisp/files.el: Remove support for extra .dir-locals file
    
    (dir-locals-file-2, dir-locals--all-files): Remove.
    (dir-locals-collect-variables, dir-locals-file, dir-locals-find-file)
    (dir-locals-read-from-file, hack-dir-local-variables): Revert changes.
    
    * lisp/files-x.el (modify-dir-local-variable): Revert changes.
    
    * lisp/help-fns.el (describe-variable): Revert changes.
    
    * doc/emacs/custom.texi (Directory Variables): Revert changes.
    
    * etc/NEWS: Revert changes.
---
 doc/emacs/custom.texi |    6 +-
 etc/NEWS              |    4 -
 lisp/files-x.el       |   30 +++-----
 lisp/files.el         |  198 +++++++++++++++++++------------------------------
 lisp/help-fns.el      |   42 +++++------
 5 files changed, 106 insertions(+), 174 deletions(-)

diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index 7be660c..c109335 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -1298,11 +1298,7 @@ accomplished with @dfn{directory-local variables}.
 named @address@hidden On MS-DOS, the name of this file
 should be @file{_dir-locals.el}, due to limitations of the DOS
 filesystems.  If the filesystem is limited to 8+3 file names, the name
-of the file will be truncated by the OS to @file{_dir-loc.el}.
address@hidden You can also use @file{.dir-locals-2.el}, which
-is loaded in addition.  This is useful when @file{.dir-locals.el} is
-under version control in a shared repository and can't be used for
-personal customizations.  } in a
+of the file will be truncated by the OS to @file{_dir-loc.el}.  } in a
 directory.  Whenever Emacs visits any file in that directory or any of
 its subdirectories, it will apply the directory-local variables
 specified in @file{.dir-locals.el}, as though they had been defined as
diff --git a/etc/NEWS b/etc/NEWS
index d0415a2..a7348e4 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -181,10 +181,6 @@ by default, and must be enabled by using the 
`--with-modules' option
 at configure time.
 
 +++
-** A second dir-local file (.dir-locals-2.el) is now accepted.
-See the variable `dir-locals-file-2' for more information.
-
-+++
 ** Network security (TLS/SSL certificate validity and the like) is
 added via the new Network Security Manager (NSM) and controlled via
 the `network-security-level' variable.
diff --git a/lisp/files-x.el b/lisp/files-x.el
index 05ad7f5..f0102fd 100644
--- a/lisp/files-x.el
+++ b/lisp/files-x.el
@@ -429,24 +429,18 @@ from the MODE alist ignoring the input argument VALUE."
   (catch 'exit
     (unless enable-local-variables
       (throw 'exit (message "Directory-local variables are disabled")))
-    (let* ((dir-or-cache (and (buffer-file-name)
-                              (not (file-remote-p (buffer-file-name)))
-                              (dir-locals-find-file (buffer-file-name))))
-           (variables-file
-            ;; If there are several .dir-locals, the user probably
-            ;; wants to edit the last one (the highest priority).
-            (cond ((stringp dir-or-cache)
-                   (car (last (dir-locals--all-files dir-or-cache))))
-                  ((consp dir-or-cache)        ; result from cache
-                   ;; If cache element has an mtime, assume it came
-                   ;; from a file.  Otherwise, assume it was set
-                   ;; directly.
-                   (if (nth 2 dir-or-cache)
-                       (car (last (dir-locals--all-files (car dir-or-cache))))
-                     (cadr dir-or-cache)))
-                  ;; Try to make a proper file-name.
-                  (t (expand-file-name dir-locals-file))))
-           variables)
+    (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.
diff --git a/lisp/files.el b/lisp/files.el
index 92ae434..3898dff 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -3663,7 +3663,7 @@ Return the new variables list."
       (error
        ;; The file's content might be invalid (e.g. have a merge conflict), but
        ;; that shouldn't prevent the user from opening the file.
-       (message "%s error: %s" dir-locals-file (error-message-string err))
+       (message ".dir-locals error: %s" (error-message-string err))
        nil))))
 
 (defun dir-locals-set-directory-class (directory class &optional mtime)
@@ -3715,41 +3715,8 @@ VARIABLES list of the class.  The list is processed in 
order.
 
 (defconst dir-locals-file ".dir-locals.el"
   "File that contains directory-local variables.
-It has to be constant to enforce uniform values across different
-environments and users.
-See also `dir-locals-file-2', whose values override this one's.
-See Info node `(elisp)Directory Local Variables' for details.")
-
-(defconst dir-locals-file-2 ".dir-locals-2.el"
-  "File that contains directory-local variables.
-This essentially a second file that can be used like
-`dir-locals-file', so that users can have specify their personal
-dir-local variables even if the current directory already has a
-`dir-locals-file' that is shared with other users (such as in a
-git repository).
-See Info node `(elisp)Directory Local Variables' for details.")
-
-(defun dir-locals--all-files (directory)
-  "Return a list of all readable dir-locals files in DIRECTORY.
-The returned list is sorted by increasing priority.  That is,
-values specified in the last file should take precedence over
-those in the first."
-  (when (file-readable-p directory)
-    (let* ((file-1 (expand-file-name (if (eq system-type 'ms-dos)
-                                        (dosified-file-name dir-locals-file)
-                                      dir-locals-file)
-                                    directory))
-           (file-2 (when (string-match "\\.el\\'" file-1)
-                     (replace-match "-2.el" t nil file-1)))
-          (out nil))
-      ;; The order here is important.
-      (dolist (f (list file-2 file-1))
-        (when (and f
-                   (file-readable-p f)
-                   (file-regular-p f)
-                   (not (file-directory-p f)))
-          (push f out)))
-      out)))
+It has to be constant to enforce uniform values
+across different environments and users.")
 
 (defun dir-locals-find-file (file)
   "Find the directory-local variables for FILE.
@@ -3764,93 +3731,78 @@ A cache entry based on a `dir-locals-file' is valid if 
the modification
 time stored in the cache matches the current file modification time.
 If not, the cache entry is cleared so that the file will be re-read.
 
-This function returns either:
-  - nil (no directory local variables found),
-  - the matching entry from `dir-locals-directory-cache' (a list),
-  - or the full path to the directory (a string) containing at
-    least one `dir-locals-file' in the case of no valid cache
-    entry."
+This function returns either nil (no directory local variables found),
+or the matching entry from `dir-locals-directory-cache' (a list),
+or the full path to the `dir-locals-file' (a string) in the case
+of no valid cache entry."
   (setq file (expand-file-name file))
-  (let* ((locals-dir (locate-dominating-file (file-name-directory file)
-                                             #'dir-locals--all-files))
-         dir-elt)
+  (let* ((dir-locals-file-name
+         (if (eq system-type 'ms-dos)
+             (dosified-file-name dir-locals-file)
+           dir-locals-file))
+        (locals-file (locate-dominating-file file dir-locals-file-name))
+        (dir-elt nil))
     ;; `locate-dominating-file' may have abbreviated the name.
-    (when locals-dir
-      (setq locals-dir (expand-file-name locals-dir)))
+    (and locals-file
+        (setq locals-file (expand-file-name dir-locals-file-name locals-file)))
+        ;; Let dir-locals-read-from-file inform us via demoted-errors
+        ;; about unreadable files, etc.
+        ;; Maybe we'd want to keep searching though - that is
+        ;; a locate-dominating-file issue.
+;;;     (or (not (file-readable-p locals-file))
+;;;         (not (file-regular-p locals-file)))
+;;;     (setq locals-file nil))
     ;; Find the best cached value in `dir-locals-directory-cache'.
     (dolist (elt dir-locals-directory-cache)
       (when (and (string-prefix-p (car elt) file
-                                  (memq system-type
-                                        '(windows-nt cygwin ms-dos)))
-                 (> (length (car elt)) (length (car dir-elt))))
-        (setq dir-elt elt)))
+                                 (memq system-type
+                                       '(windows-nt cygwin ms-dos)))
+                (> (length (car elt)) (length (car dir-elt))))
+       (setq dir-elt elt)))
     (if (and dir-elt
-             (or (null locals-dir)
-                 (<= (length locals-dir)
-                     (length (car dir-elt)))))
-        ;; Found a potential cache entry.  Check validity.
-        ;; A cache entry with no MTIME is assumed to always be valid
-        ;; (ie, set directly, not from a dir-locals file).
-        ;; Note, we don't bother to check that there is a matching class
-        ;; element in dir-locals-class-alist, since that's done by
-        ;; dir-locals-set-directory-class.
-        (if (or (null (nth 2 dir-elt))
-                (let ((cached-files (dir-locals--all-files (car dir-elt))))
-                  ;; The entry MTIME should match the most recent
-                  ;; MTIME among matching files.
-                  (and cached-files
-                       (= (time-to-seconds (nth 2 dir-elt))
-                          (apply #'max (mapcar (lambda (f) (time-to-seconds 
(nth 5 (file-attributes f))))
-                                               cached-files))))))
-            ;; This cache entry is OK.
-            dir-elt
-          ;; This cache entry is invalid; clear it.
-          (setq dir-locals-directory-cache
-                (delq dir-elt dir-locals-directory-cache))
-          ;; Return the first existing dir-locals file.  Might be the same
-          ;; as dir-elt's, might not (eg latter might have been deleted).
-          locals-dir)
+            (or (null locals-file)
+                (<= (length (file-name-directory locals-file))
+                    (length (car dir-elt)))))
+       ;; Found a potential cache entry.  Check validity.
+       ;; A cache entry with no MTIME is assumed to always be valid
+       ;; (ie, set directly, not from a dir-locals file).
+       ;; Note, we don't bother to check that there is a matching class
+       ;; element in dir-locals-class-alist, since that's done by
+       ;; dir-locals-set-directory-class.
+       (if (or (null (nth 2 dir-elt))
+               (let ((cached-file (expand-file-name dir-locals-file-name
+                                                    (car dir-elt))))
+                 (and (file-readable-p cached-file)
+                      (equal (nth 2 dir-elt)
+                             (nth 5 (file-attributes cached-file))))))
+           ;; This cache entry is OK.
+           dir-elt
+         ;; This cache entry is invalid; clear it.
+         (setq dir-locals-directory-cache
+               (delq dir-elt dir-locals-directory-cache))
+         ;; Return the first existing dir-locals file.  Might be the same
+         ;; as dir-elt's, might not (eg latter might have been deleted).
+         locals-file)
       ;; No cache entry.
-      locals-dir)))
-
-(defun dir-locals-read-from-dir (dir)
-  "Load all variables files in DIR and register a new class and instance.
-DIR is the absolute name of a directory which must contain at
-least one dir-local file (which is a file holding variables to
-apply).
-Return the new class name, which is a symbol named DIR."
-  (require 'map)
-  (let* ((class-name (intern dir))
-         (files (dir-locals--all-files dir))
-         (read-circle nil)
-         (success nil)
-         (variables))
+      locals-file)))
+
+(defun dir-locals-read-from-file (file)
+  "Load a variables FILE and register a new class and instance.
+FILE is the name of the file holding the variables to apply.
+The new class name is the same as the directory in which FILE
+is found.  Returns the new class name."
+  (with-temp-buffer
     (with-demoted-errors "Error reading dir-locals: %S"
-      (dolist (file files)
-        (with-temp-buffer
-          (insert-file-contents file)
-          (condition-case-unless-debug nil
-              (setq variables
-                    (map-merge-with 'list (lambda (a b) (map-merge 'list a b))
-                                    variables
-                                    (read (current-buffer))))
-            (end-of-file nil))))
-      (setq success t))
-    (dir-locals-set-class-variables class-name variables)
-    (dir-locals-set-directory-class
-     dir class-name
-     (seconds-to-time
-      (if success
-          (apply #'max (mapcar (lambda (file)
-                                 (time-to-seconds (nth 5 (file-attributes 
file))))
-                               files))
-        ;; If there was a problem, use the values we could get but
-        ;; don't let the cache prevent future reads.
-        0)))
-    class-name))
-
-(define-obsolete-function-alias 'dir-locals-read-from-file
-  'dir-locals-read-from-dir "25.1")
+      (insert-file-contents file)
+      (unless (zerop (buffer-size))
+        (let* ((dir-name (file-name-directory file))
+               (class-name (intern dir-name))
+               (variables (let ((read-circle nil))
+                            (read (current-buffer)))))
+          (dir-locals-set-class-variables class-name variables)
+          (dir-locals-set-directory-class dir-name class-name
+                                          (nth 5 (file-attributes file)))
+          class-name)))))
 
 (defcustom enable-remote-dir-locals nil
   "Non-nil means dir-local variables will be applied to remote files."
@@ -3873,17 +3825,17 @@ This does nothing if either `enable-local-variables' or
                 (not (file-remote-p (or (buffer-file-name)
                                         default-directory)))))
     ;; Find the variables file.
-    (let ((dir-or-cache (dir-locals-find-file
-                         (or (buffer-file-name) default-directory)))
+    (let ((variables-file (dir-locals-find-file
+                           (or (buffer-file-name) default-directory)))
          (class nil)
          (dir-name nil))
       (cond
-       ((stringp dir-or-cache)
-       (setq dir-name dir-or-cache
-             class (dir-locals-read-from-dir dir-or-cache)))
-       ((consp dir-or-cache)
-       (setq dir-name (nth 0 dir-or-cache))
-       (setq class (nth 1 dir-or-cache))))
+       ((stringp variables-file)
+       (setq dir-name (file-name-directory variables-file)
+             class (dir-locals-read-from-file variables-file)))
+       ((consp variables-file)
+       (setq dir-name (nth 0 variables-file))
+       (setq class (nth 1 variables-file))))
       (when class
        (let ((variables
               (dir-locals-collect-variables
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index 2021885..547bc7e 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -911,35 +911,29 @@ if it is given a local binding.\n"))))
                                             (buffer-file-name buffer)))
                                       (dir-locals-find-file
                                        (buffer-file-name buffer))))
-                          (is-directory nil))
+                          (dir-file t))
                      (princ (substitute-command-keys
                              "  This variable's value is directory-local"))
-                      (when (consp file) ; result from cache
-                        ;; If the cache element has an mtime, we
-                        ;; assume it came from a file.
-                        (if (nth 2 file)
-                            ;; (car file) is a directory.
-                            (setq file (dir-locals--all-files (car file)))
-                          ;; Otherwise, assume it was set directly.
-                          (setq file (car file)
-                                is-directory t)))
-                      (if (null file)
-                          (princ ".\n")
-                        (princ ", set ")
-                        (princ (substitute-command-keys
-                                (cond
-                                 (is-directory "for the directory\n  `")
-                                 ;; Many files matched.
-                                 ((and (consp file) (cdr file))
-                                  (setq file (file-name-directory (car file)))
-                                  (format "by one of the\n  %s files in the 
directory\n  `"
-                                          dir-locals-file))
-                                 (t (setq file (car file))
-                                    "by the file\n  `"))))
+                     (if (null file)
+                         (princ ".\n")
+                       (princ ", set ")
+                        (if (consp file) ; result from cache
+                            ;; If the cache element has an mtime, we
+                            ;; assume it came from a file.
+                            (if (nth 2 file)
+                                (setq file (expand-file-name
+                                            dir-locals-file (car file)))
+                              ;; Otherwise, assume it was set directly.
+                              (setq file (car file)
+                                    dir-file nil)))
+                       (princ (substitute-command-keys
+                                (if dir-file
+                                    "by the file\n  `"
+                                  "for the directory\n  `")))
                        (with-current-buffer standard-output
                          (insert-text-button
                           file 'type 'help-dir-local-var-def
-                             'help-args (list variable file)))
+                          'help-args (list variable file)))
                        (princ (substitute-command-keys "'.\n"))))
                  (princ (substitute-command-keys
                          "  This variable's value is file-local.\n"))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]