emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] emacs/lisp ChangeLog files.el


From: Chong Yidong
Subject: [Emacs-diffs] emacs/lisp ChangeLog files.el
Date: Sat, 11 Apr 2009 15:26:31 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Chong Yidong <cyd>      09/04/11 15:26:30

Modified files:
        lisp           : ChangeLog files.el 

Log message:
        * files.el (dir-locals-directory-cache): Change format to include
        the mtime of the directory-local variables file (Bug#2833).
        (dir-locals-set-directory-class): New arg mtime.  Store it in
        dir-locals-directory-cache.
        (dir-locals-find-file): Check cache validity using the mtime.
        (dir-locals-read-from-file): Save the file mtime in the cache.
        (hack-dir-local-variables): Adapt to new
        dir-locals-directory-cache entry format.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/lisp/ChangeLog?cvsroot=emacs&r1=1.15579&r2=1.15580
http://cvs.savannah.gnu.org/viewcvs/emacs/lisp/files.el?cvsroot=emacs&r1=1.1044&r2=1.1045

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/lisp/ChangeLog,v
retrieving revision 1.15579
retrieving revision 1.15580
diff -u -b -r1.15579 -r1.15580
--- ChangeLog   11 Apr 2009 14:44:16 -0000      1.15579
+++ ChangeLog   11 Apr 2009 15:26:26 -0000      1.15580
@@ -1,5 +1,14 @@
 2009-04-11  Chong Yidong  <address@hidden>
 
+       * files.el (dir-locals-directory-cache): Change format to include
+       the mtime of the directory-local variables file (Bug#2833).
+       (dir-locals-set-directory-class): New arg mtime.  Store it in
+       dir-locals-directory-cache.
+       (dir-locals-find-file): Check cache validity using the mtime.
+       (dir-locals-read-from-file): Save the file mtime in the cache.
+       (hack-dir-local-variables): Adapt to new
+       dir-locals-directory-cache entry format.
+
        * international/mule-diag.el (describe-font-internal): Change
        ignored argument to IGNORED.
        (describe-font): Elide unnecessary argument to

Index: files.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/files.el,v
retrieving revision 1.1044
retrieving revision 1.1045
diff -u -b -r1.1044 -r1.1045
--- files.el    8 Apr 2009 14:05:38 -0000       1.1044
+++ files.el    11 Apr 2009 15:26:30 -0000      1.1045
@@ -3185,10 +3185,19 @@
 ;;; Handling directory-local variables, aka project settings.
 
 (defvar dir-locals-class-alist '()
-  "Alist mapping class names (symbols) to variable lists.")
+  "Alist mapping directory-local variable classes (symbols) to variable 
lists.")
 
-(defvar dir-locals-directory-alist '()
-  "Alist mapping directory roots to variable classes.")
+(defvar dir-locals-directory-cache '()
+  "List of cached directory roots for directory-local variable classes.
+Each element in this list has the form (DIR CLASS MTIME).
+DIR is the name of the directory.
+CLASS is the name of a variable class (a symbol).
+MTIME is the recorded modification time of the directory-local
+ variables file associated with this entry.  This time is a list
+ of two integers (the same format as `file-attributes'), and is
+ used to test whether the cache entry is still valid.
+ Alternatively, MTIME can be nil, which means the entry is always
+ considered valid.")
 
 (defsubst dir-locals-get-class-variables (class)
   "Return the variable list for CLASS."
@@ -3230,18 +3239,20 @@
          (setq variables (dir-locals-collect-mode-variables
                           (cdr entry) variables))))))))
 
-(defun dir-locals-set-directory-class (directory class)
+(defun dir-locals-set-directory-class (directory class mtime)
   "Declare that the DIRECTORY root is an instance of CLASS.
 DIRECTORY is the name of a directory, a string.
 CLASS is the name of a project class, a symbol.
+MTIME is either the modification time of the directory-local
+variables file that defined this this class, or nil.
 
 When a file beneath DIRECTORY is visited, the mode-specific
-variables from CLASS will be applied to the buffer.  The variables
+variables from CLASS are applied to the buffer.  The variables
 for a class are defined using `dir-locals-set-class-variables'."
   (setq directory (file-name-as-directory (expand-file-name directory)))
   (unless (assq class dir-locals-class-alist)
     (error "No such class `%s'" (symbol-name class)))
-  (push (cons directory class) dir-locals-directory-alist))
+  (push (list directory class mtime) dir-locals-directory-cache))
 
 (defun dir-locals-set-class-variables (class variables)
   "Map the type CLASS to a list of variable settings.
@@ -3284,12 +3295,15 @@
 across different environments and users.")
 
 (defun dir-locals-find-file (file)
-  "Find the directory-local variables FILE.
-This searches upward in the directory tree.
-If a local variables file is found, the file name is returned.
-If the file is already registered, a cons from
-`dir-locals-directory-alist' is returned.
-Otherwise this returns nil."
+  "Find the directory-local variables for FILE.
+This searches upward in the directory tree from FILE.
+If the directory root of FILE has been registered in
+ `dir-locals-directory-cache' and the directory-local variables
+ file has not been modified, return the matching entry in
+ `dir-locals-directory-cache'.
+Otherwise, if a directory-local variables file is found, return
+ the file name.
+Otherwise, return nil."
   (setq file (expand-file-name file))
   (let* ((dir-locals-file-name
          (if (eq system-type 'ms-dos)
@@ -3300,19 +3314,31 @@
     ;; `locate-dominating-file' may have abbreviated the name.
     (when locals-file
       (setq locals-file (expand-file-name dir-locals-file-name locals-file)))
-    (dolist (elt dir-locals-directory-alist)
+    ;; Find the best cached value in `dir-locals-directory-cache'.
+    (dolist (elt dir-locals-directory-cache)
       (when (and (eq t (compare-strings file nil (length (car elt))
                                        (car elt) nil nil
                                        (memq system-type
                                              '(windows-nt cygwin ms-dos))))
                 (> (length (car elt)) (length (car dir-elt))))
        (setq dir-elt elt)))
-    (if (and locals-file dir-elt)
-       (if (> (length (file-name-directory locals-file))
-              (length (car dir-elt)))
-           locals-file
-         dir-elt)
-      (or locals-file dir-elt))))
+    (let ((use-cache (and dir-elt
+                         (or (null locals-file)
+                             (<= (length (file-name-directory locals-file))
+                                 (length (car dir-elt)))))))
+      (if use-cache
+         ;; Check the validity of the cache.
+         (if (and (file-readable-p (car dir-elt))
+                  (or (null  (nth 2 dir-elt))
+                      (equal (nth 2 dir-elt)
+                             (nth 5 (file-attributes (car dir-elt))))))
+             ;; 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))
+           locals-file)
+       locals-file))))
 
 (defun dir-locals-read-from-file (file)
   "Load a variables FILE and register a new class and instance.
@@ -3320,14 +3346,13 @@
 The new class name is the same as the directory in which FILE
 is found.  Returns the new class name."
   (with-temp-buffer
-    ;; We should probably store the modtime of FILE and then
-    ;; reload it whenever it changes.
     (insert-file-contents file)
     (let* ((dir-name (file-name-directory file))
           (class-name (intern dir-name))
           (variables (read (current-buffer))))
       (dir-locals-set-class-variables class-name variables)
-      (dir-locals-set-directory-class dir-name class-name)
+      (dir-locals-set-directory-class dir-name class-name
+                                     (nth 5 (file-attributes file)))
       class-name)))
 
 (declare-function c-postprocess-file-styles "cc-mode" ())
@@ -3348,8 +3373,8 @@
        (setq dir-name (file-name-directory (buffer-file-name)))
        (setq class (dir-locals-read-from-file variables-file)))
        ((consp variables-file)
-       (setq dir-name (car variables-file))
-       (setq class (cdr variables-file))))
+       (setq dir-name (nth 0 variables-file))
+       (setq class (nth 1 variables-file))))
       (when class
        (let ((variables
               (dir-locals-collect-variables




reply via email to

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