unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#2833: 23.0.92; Bug in Directory Variables
@ 2009-04-11 15:31 Chong Yidong
  2009-04-12 13:22 ` Leo
  0 siblings, 1 reply; 11+ messages in thread
From: Chong Yidong @ 2009-04-11 15:31 UTC (permalink / raw)
  To: Leo; +Cc: 2833

I've checked the patch into CVS, with the change suggested by Stefan
(comparing the file mtime directly instead of comparing it to the system
time).

Does it solve the problem for you?






^ permalink raw reply	[flat|nested] 11+ messages in thread
* bug#2833: 23.0.92; Bug in Directory Variables
@ 2009-04-09  2:59 Chong Yidong
  2009-04-09 11:31 ` Leo
  0 siblings, 1 reply; 11+ messages in thread
From: Chong Yidong @ 2009-04-09  2:59 UTC (permalink / raw)
  To: emacs-devel; +Cc: 2833

The following patch changes the directory local variables code so that
the cache stores the file atime.  Before using each cache entry, we
check that against the file modtime.

This is not an ideal time to make changes of this sort, but I think this
problem (i.e., inability to detect changes in .dir-locals.el files) is
quite a serious one.  So please help me review this patch.

*** trunk/lisp/files.el.~1.1044.~	2009-04-08 10:42:40.000000000 -0400
--- trunk/lisp/files.el	2009-04-08 22:50:03.000000000 -0400
***************
*** 3187,3194 ****
  (defvar dir-locals-class-alist '()
    "Alist mapping class names (symbols) to variable lists.")
  
! (defvar dir-locals-directory-alist '()
!   "Alist mapping directory roots to variable classes.")
  
  (defsubst dir-locals-get-class-variables (class)
    "Return the variable list for CLASS."
--- 3187,3199 ----
  (defvar dir-locals-class-alist '()
    "Alist mapping class names (symbols) to variable lists.")
  
! (defvar dir-locals-directory-cache '()
!   "List of cached directory roots for directory-local variable files.
! Each element in this list has the form (DIR ATIME CLASS), where
! DIR is the name of the directory, ATIME is the time when this
! cache entry was created (as a floating point number, per
! `float-time'), and CLASS is the name of a project class (a
! symbol).")
  
  (defsubst dir-locals-get-class-variables (class)
    "Return the variable list for CLASS."
***************
*** 3241,3247 ****
    (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))
  
  (defun dir-locals-set-class-variables (class variables)
    "Map the type CLASS to a list of variable settings.
--- 3246,3252 ----
    (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 (list directory (float-time) class) dir-locals-directory-cache))
  
  (defun dir-locals-set-class-variables (class variables)
    "Map the type CLASS to a list of variable settings.
***************
*** 3284,3295 ****
  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."
    (setq file (expand-file-name file))
    (let* ((dir-locals-file-name
  	  (if (eq system-type 'ms-dos)
--- 3289,3304 ----
  across different environments and users.")
  
  (defun dir-locals-find-file (file)
!   "Find the directory-local variables for FILE.
! This searches upward in the directory tree from FILE.
! 
! If the file is already registered and has not been modified since
!  we added it to `dir-locals-directory-cache', this returns a cons
!  cell of the form (DIRECTORY . CLASS), using the entry in
!  `dir-locals-directory-cache'.
! Otherwise, if a local variables file is found, the file name is
!  returned.
! Otherwise, this returns nil."
    (setq file (expand-file-name file))
    (let* ((dir-locals-file-name
  	  (if (eq system-type 'ms-dos)
***************
*** 3300,3318 ****
      ;; `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)
        (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))))
  
  (defun dir-locals-read-from-file (file)
    "Load a variables FILE and register a new class and instance.
--- 3309,3338 ----
      ;; `locate-dominating-file' may have abbreviated the name.
      (when locals-file
        (setq locals-file (expand-file-name dir-locals-file-name locals-file)))
!     ;; 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)))
!     (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))
! 		   (< (float-time (nth 5 (file-attributes (car dir-elt))))
! 		      (nth 1 dir-elt)))
! 	      ;; This cache entry is OK.
! 	      (cons (nth 0 dir-elt) (nth 2 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.






^ permalink raw reply	[flat|nested] 11+ messages in thread
* bug#2833: 23.0.92; Bug in Directory Variables
@ 2009-04-02 18:50 Chong Yidong
  0 siblings, 0 replies; 11+ messages in thread
From: Chong Yidong @ 2009-04-02 18:50 UTC (permalink / raw)
  To: Tom Tromey; +Cc: 2833

> I think there's a bug in directory variables code, that is, changing
> the directory variables would require a restart of Emacs for them to
> take effect.

Tom, could you please take a shot at implementing this?  It may be too
late in the release to put this in 23.1 (depending on how complicated
the change turns out to be), but this problem definitely needs fixing at
some point.

I guess this is what the following comment in files.el is referring to:

(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
    ;; We should probably store the modtime of FILE and then
    ;; reload it whenever it changes.
    (insert-file-contents file)






^ permalink raw reply	[flat|nested] 11+ messages in thread
* bug#2833: 23.0.92; Bug in Directory Variables
@ 2009-03-31 14:32 Leo
  2009-04-01  1:14 ` Stefan Monnier
  0 siblings, 1 reply; 11+ messages in thread
From: Leo @ 2009-03-31 14:32 UTC (permalink / raw)
  To: emacs-pretest-bug


I think there's a bug in direcotry variables code, that is, changing the
directory variables would require a restart of Emacs for them to take
effect.

A recipe to reproduce:

  1. Create a dir and write the following to file .dir-locals in the dir
     created:

((latex-mode . ((fill-column . 78)
                (coding . "latin-1"))))

  2. Open or create a .tex file in that dir

  3. C-h v fill-column RET to check the value 

  4. Change 78 to another value say 75

  5. Re-open the .tex file and you will see fill-column has a value 78
     NOT 75

In my view, this makes the `Directory Variables' feature much less
useful. Any fix?


In GNU Emacs 23.0.92.1 (i386-mingw-nt5.1.2600) of 2009-03-31 on BREPNB
Windowing system distributor `Microsoft Corp.', version 5.1.2600
configured using `configure --with-gcc (3.4)'

Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: ENG
  value of $XMODIFIERS: nil
  locale-coding-system: cp1252
  default-enable-multibyte-characters: t

Major mode: LaTeX/P

Minor modes in effect:
  reftex-mode: t
  TeX-PDF-mode: t
  dired-omit-mode: t
  recentf-mode: t
  icomplete-mode: t
  savehist-mode: t
  display-time-mode: t
  xterm-mouse-mode: t
  delete-selection-mode: t
  global-auto-revert-mode: t
  minibuffer-depth-indicate-mode: t
  which-function-mode: t
  show-paren-mode: t
  rcirc-track-minor-mode: t
  shell-dirtrack-mode: t
  tooltip-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  global-auto-composition-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
<left> <left> <left> C-x C-f . d i <return> <backspace> 
8 C-x C-s C-h i m e m a <tab> <return> m f i l e SPC 
v a r <tab> <tab> <return> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <up> 
<return> SPC SPC SPC l <down> <return> SPC l ^ <down> 
<return> <down> <down> <down> <down> <down> <down> 
q <right> <backspace> 8 C-x C-s C-x k <return> <down> 
<down> <down> <down> <down> <down> <down> M-x r e p 
o r <tab> <return>

Recent messages:
Applying style hooks... done
Type "q" to delete this window.
Applying style hooks... done
Type "q" to delete this window.
Composing main Info directory...done
Reverting buffer `.dir-locals.el'.






^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2009-04-12 13:22 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <87fxgicz1b.fsf@cyd.mit.edu>
2009-04-09 11:03 ` bug#2833: 23.0.92; Bug in Directory Variables David De La Harpe Golden
2009-04-09 14:27 ` Stefan Monnier
2009-04-09 15:20   ` Chong Yidong
2009-04-11 15:31 Chong Yidong
2009-04-12 13:22 ` Leo
  -- strict thread matches above, loose matches on Subject: below --
2009-04-09  2:59 Chong Yidong
2009-04-09 11:31 ` Leo
2009-04-02 18:50 Chong Yidong
2009-03-31 14:32 Leo
2009-04-01  1:14 ` Stefan Monnier
2009-04-01 10:01   ` Leo

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).