unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
@ 2012-09-05 13:38 Johan Claesson
  2012-09-05 16:23 ` Johan Claesson
  2012-09-08  1:13 ` Glenn Morris
  0 siblings, 2 replies; 14+ messages in thread
From: Johan Claesson @ 2012-09-05 13:38 UTC (permalink / raw)
  To: 12357


Hi,

A minor suggestion for shadow.el.  list-load-path-shadows will detect
if there are two lisp files with the same name in the load-path.  Such
a clash could cause problems for normal lisp files.  But i think it is
normal to have multiple .dir-locals.el files spread across the
load-path.  In order to avoid false warnings list-load-path-shadows
could ignore the special file name .dir-locals.el.

If you agree with this change it may be implemented by adding
".dir-locals" to the ignore list at line 118 of shadow.el:

		      ;; Ignore these files.
		      (member file '("subdirs" "leim-list" ".dir-locals")))

The following test case creates two temporary directories and puts
empty .dir-locals.el files in them.  It currently returns
"/tmp/dir1-28571pXx/.dir-locals hides /tmp/dir2-28571bhA/.dir-locals".

(let* ((dir1 (make-temp-file "/tmp/dir1-" t))
       (dir2 (make-temp-file "/tmp/dir2-" t)))
  (require 'shadow)
  (write-region "" nil (concat dir1 "/.dir-locals.el"))
  (write-region "" nil (concat dir2 "/.dir-locals.el"))
  (let* ((load-path (list dir1 dir2))
	 (shadows (list-load-path-shadows t)))
    (delete-directory dir1 t)
    (delete-directory dir2 t)
    shadows))

Regards,

/Johan



In GNU Emacs 24.2.1 (i686-pc-linux-gnu, GTK+ Version 2.24.10)
 of 2012-09-03 on goblin
Windowing system distributor `The X.Org Foundation', version 11.0.11203000
Configured using:
 `configure '--prefix=/home/jcl/usr' '--without-toolkit-scroll-bars'
 '-C' '--disable-maintainer-mode' '--without-compress-info''

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: en_US.UTF-8
  value of $XMODIFIERS: nil
  locale-coding-system: utf-8-unix
  default enable-multibyte-characters: t

Major mode: Summary

Minor modes in effect:
  erc-list-mode: t
  erc-menu-mode: t
  erc-autojoin-mode: t
  erc-ring-mode: t
  erc-networks-mode: t
  erc-pcomplete-mode: t
  erc-track-mode: t
  erc-track-minor-mode: t
  erc-match-mode: t
  erc-button-mode: t
  erc-fill-mode: t
  erc-stamp-mode: t
  erc-netsplit-mode: t
  erc-irccontrols-mode: t
  erc-noncommands-mode: t
  erc-move-to-prompt-mode: t
  erc-readonly-mode: t
  display-time-mode: t
  global-cwarn-mode: t
  which-function-mode: t
  icomplete-mode: t
  minibuffer-depth-indicate-mode: t
  diff-auto-refine-mode: t
  shell-dirtrack-mode: t
  ido-everywhere: t
  electric-layout-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC 
SPC SPC SPC SPC [ [ [ [ [ [ C-1 C-1 p s SPC - e f SPC 
| S-SPC g r e p SPC s e n d m a i l <return> M-x p 
r o c e d <return> M-1 T C-s e m a c s C-s C-a C-s 
C-s C-s C-s <C-home> C-s s e n d <home> F C-g f a l 
<tab> <return> C-s C-s m a i l C-s C-a q <C-tab> <M-next> 
<return> <return> <return> <return> C-q i q p p p C-q 
i M-g n C-v M-v ! q g p p p p <return> q C-q i M-g 
C-1 C-1 <return> <return> C-x C-f i n s t a l l e m 
<return> C-s b z e C-s <backspace> <backspace> r C-s 
C-s C-s C-s C-s C-a C-l C-1 C-1 c d <return> c d SPC 
b u i <tab> t r <tab> <return> b z r SPC p u l l <return> 
C-1 C-2 <return> <return> f i n d SPC . SPC - n a m 
e SPC s h a d o w . e l <return> C-s <up> <left> <left> 
C-x C-f C-f C-g C-x C-S-f <return> C-s i g n o r e 
C-a C-1 C-1 C-q C-q <return> C-1 C-r <up> <up> C-1 
C-r <home> C-s d i r - <home> C-x s M-x e m a c s - 
<backspace> <backspace> <backspace> <backspace> <backspace> 
<backspace> r e p o r C-g C-q i M-g n n C-p C-p C-p 
B B u l f <return> C-n E M-x r e p o r t = e m <backspace> 
<backspace> <backspace> - e m <tab> b <tab> <retur
n>

Recent messages:
Expiring articles...done
Reading incoming mail from file... [2 times]
Wrote /home/jcl/mail/erlang-questions/13282
Wrote /home/jcl/mail/emacs-devel/14561
Wrote /home/jcl/mail/inbox/7063
Wrote /home/jcl/mail/inbox/7064
nnml: Reading incoming mail (4 new)...done
Copying to ulfc: (7051)...
Wrote /home/jcl/mail/ulfc/60
Quit

Load-path shadows:
None found.

Features:
(vc-bzr emacsbug shadow w3m-lnum w3m-bookmark w3m-tabmenu w3m-session
w3m-cookie w3m-form chistory rx desktop etags jcl-wesnoth-init
wesnoth-mode wesnoth-wml-data wesnoth-update tabify hippie-exp dabbrev
url-handlers gnus-draft gnus-fun flow-fill python-21 python cl-specs
edebug mailalias cal-iso cal-move sort gnus-cite mail-extr gnus-bcklg
gnus-async vc-git nnrss xml mm-url misearch multi-isearch add-log
gnus-dired url-cache url-http url-gw url-auth erc-menu erc-join erc-ring
erc-networks erc-pcomplete erc-track erc-match erc-button erc-fill
erc-stamp erc-netsplit erc-goodies erc erc-backend erc-compat
jcl-replace jcl-ruby jcl-sl w3m-load jcl-w3m w3m-search jcl-work-buffer
w3m-type-ahead jcl-games jcl-text-translator-init text-translator
text-translator-window text-translator-vars text-translator-sites
jcl-muse htmlize-hack htmlize muse-latex muse-html muse-xml-common
muse-colors cus-edit cus-start cus-load muse-publish muse-project
muse-protocols muse-regexps derived muse muse-nested-tags muse-mode
jcl-dictem-init dictem jcl-yaoddmuse yaoddmuse-extension w3m doc-view
jka-compr image-mode timezone w3m-hist w3m-fb bookmark-w3m w3m-ems
w3m-ccl ccl w3m-favicon w3m-image w3m-proc w3m-util yaoddmuse url
url-proxy url-privacy url-expand url-methods url-history url-cookie
url-util url-parse url-vars skeleton sgml-mode smiley network-stream tls
jcl-stumpwm autorevert jcl-slime slime-fancy slime-fontifying-fu
slime-package-fu slime-references slime-scratch slime-presentations
slime-fuzzy slime-fancy-inspector slime-c-p-c slime-editing-commands
slime-autodoc slime-parse slime-repl slime apropos hyperspec browse-url
find-lisp eldoc time eldoc-eval-autoloads muse-autoloads
svg-clock-autoloads package tabulated-list jcl-renegade-goblin
jcl-home-boot mule-util flyspell qp parse-time gnus-ml nndraft nnmh
nnfolder nnml gnus-agent gnus-srvr gnus-score score-mode nnvirtual
gnus-msg gnus-art mm-uu mml2015 epg-config mm-view mml-smime smime dig
nntp gnus-cache jcl-gnus-init jcl-gnus gnus-sum nnoo gnus-group
gnus-undo nnmail mail-source gnus-start gnus-spec gnus-int gnus-range
gnus-win mailcap starttls smtpmail sendmail message rfc822 mml mml-sec
mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045
ietf-drums mailabbrev gmm-utils mailheader gnus gnus-ems nnheader
mail-utils wid-edit jcl-goblin fuzzy-match jcl-load-beta jcl-torrent
text-translator-load jcl-calendar-init appt jcl-calendar holidays
hol-loaddefs diary-lib diary-loaddefs cal-menu calendar cal-loaddefs
jcl-emms-init emms-playing-time emms-mode-line emms-cache
emms-info-ogginfo emms-info-mp3info emms-info later-do
emms-playlist-mode emms-player-vlc emms-player-mplayer
emms-player-simple emms-source-playlist emms-source-file emms-setup emms
emms-compat jcl-erc-init jcl-file-cache-init jcl-grep-sbg sbg
jcl-ido-init jcl-eel bindat jcl-dired dired-x dired-details wdired
dired-aux jcl-register-init jcl-command-subset-init jcl-generic
generic-x jcl-erlang-init jcl-erlang distel-ie edb patmatch erl-service
derl erlext epmd net-fsm erl distel erlang man erlang-eunit jcl-safe
jcl-abbrev-init jcl-swedish-postfix quail help-mode jcl-term time-stamp
ange-ftp jcl-face hl-line jcl-modes-init jcl-rfc rfcview view goto-addr
proced table picture inf-ruby ruby-mode sh-script noutline outline
hideshow cwarn jcl-imenu jcl-global-init which-func imenu winner
thingatpt paren mic-paren printing ps-print ps-def lpr icomplete ispell
uniquify mb-depth midnight whitespace ffap saveplace jcl-keys-init
diff-mode easy-mmode term disp-table ehelp kmacro tramp tramp-compat
auth-source eieio assoc gnus-util mm-util mail-prsvr password-cache
shell pcomplete format-spec tramp-loaddefs windmove jcl-keys
jcl-load-functions jcl-file-cache ert find-func ewoc debug filecache
jcl-elisp hi-lock jcl-register jcl-grep grep compile jcl-command-subset
ido jcl-emacsclient jcl-duff jcl-template-init jcl-template jcl-motion
jcl-windows jcl-recommended jcl-site-start jcl-erlang-log bookmark pp
jcl-ediff byte-opt warnings bytecomp byte-compile cconv macroexp
jcl-misc newcomment jcl-compile ediff-merg ediff-diff ediff-wind
ediff-help ediff-util ediff-mult ediff-init ediff fpl electric cc-mode
cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars
cc-defs erlang-start clearcase tq reporter executable dired comint
regexp-opt ansi-color ring info easymenu jcl-times-init advice help-fns
advice-preload jcl-times jcl-util server cl jcl-load-path time-date
tooltip ediff-hook vc-hooks lisp-float-type mwheel x-win x-dnd tool-bar
dnd fontset image fringe lisp-mode register page menu-bar rfn-eshadow
timer select scroll-bar mouse jit-lock font-lock syntax facemenu
font-core frame cham georgian utf-8-lang misc-lang vietnamese tibetan
thai tai-viet lao korean japanese hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese case-table epa-hook
jka-cmpr-hook help simple abbrev minibuffer loaddefs button faces
cus-face files text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget hashtable-print-readable backquote
make-network-process dbusbind dynamic-setting system-font-setting
font-render-setting move-toolbar gtk x-toolkit x multi-tty emacs)





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2012-09-05 13:38 bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el Johan Claesson
@ 2012-09-05 16:23 ` Johan Claesson
  2012-09-08  1:13 ` Glenn Morris
  1 sibling, 0 replies; 14+ messages in thread
From: Johan Claesson @ 2012-09-05 16:23 UTC (permalink / raw)
  To: 12357



Maybe the following is cleaner.

		      ;; Ignore these files.
		      (member file '("subdirs" "leim-list"))
                      (string= file (file-name-sans-extension dir-locals-file)))

Regards,

/Johan


Johan Claesson <johanclaesson@bredband.net> writes:

> Hi,
>
> A minor suggestion for shadow.el.  list-load-path-shadows will detect
> if there are two lisp files with the same name in the load-path.  Such
> a clash could cause problems for normal lisp files.  But i think it is
> normal to have multiple .dir-locals.el files spread across the
> load-path.  In order to avoid false warnings list-load-path-shadows
> could ignore the special file name .dir-locals.el.
>
> If you agree with this change it may be implemented by adding
> ".dir-locals" to the ignore list at line 118 of shadow.el:
>
> 		      ;; Ignore these files.
> 		      (member file '("subdirs" "leim-list" ".dir-locals")))
>
> The following test case creates two temporary directories and puts
> empty .dir-locals.el files in them.  It currently returns
> "/tmp/dir1-28571pXx/.dir-locals hides /tmp/dir2-28571bhA/.dir-locals".
>
> (let* ((dir1 (make-temp-file "/tmp/dir1-" t))
>        (dir2 (make-temp-file "/tmp/dir2-" t)))
>   (require 'shadow)
>   (write-region "" nil (concat dir1 "/.dir-locals.el"))
>   (write-region "" nil (concat dir2 "/.dir-locals.el"))
>   (let* ((load-path (list dir1 dir2))
> 	 (shadows (list-load-path-shadows t)))
>     (delete-directory dir1 t)
>     (delete-directory dir2 t)
>     shadows))
>
> Regards,
>
> /Johan
>
>
>
> In GNU Emacs 24.2.1 (i686-pc-linux-gnu, GTK+ Version 2.24.10)
>  of 2012-09-03 on goblin
> Windowing system distributor `The X.Org Foundation', version 11.0.11203000
> Configured using:
>  `configure '--prefix=/home/jcl/usr' '--without-toolkit-scroll-bars'
>  '-C' '--disable-maintainer-mode' '--without-compress-info''
>
> 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: en_US.UTF-8
>   value of $XMODIFIERS: nil
>   locale-coding-system: utf-8-unix
>   default enable-multibyte-characters: t
>
> Major mode: Summary
>
> Minor modes in effect:
>   erc-list-mode: t
>   erc-menu-mode: t
>   erc-autojoin-mode: t
>   erc-ring-mode: t
>   erc-networks-mode: t
>   erc-pcomplete-mode: t
>   erc-track-mode: t
>   erc-track-minor-mode: t
>   erc-match-mode: t
>   erc-button-mode: t
>   erc-fill-mode: t
>   erc-stamp-mode: t
>   erc-netsplit-mode: t
>   erc-irccontrols-mode: t
>   erc-noncommands-mode: t
>   erc-move-to-prompt-mode: t
>   erc-readonly-mode: t
>   display-time-mode: t
>   global-cwarn-mode: t
>   which-function-mode: t
>   icomplete-mode: t
>   minibuffer-depth-indicate-mode: t
>   diff-auto-refine-mode: t
>   shell-dirtrack-mode: t
>   ido-everywhere: t
>   electric-layout-mode: t
>   electric-indent-mode: t
>   mouse-wheel-mode: t
>   file-name-shadow-mode: t
>   global-font-lock-mode: t
>   font-lock-mode: t
>   auto-composition-mode: t
>   auto-encryption-mode: t
>   auto-compression-mode: t
>   line-number-mode: t
>   transient-mark-mode: t
>
> Recent input:
> SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC SPC 
> SPC SPC SPC SPC [ [ [ [ [ [ C-1 C-1 p s SPC - e f SPC 
> | S-SPC g r e p SPC s e n d m a i l <return> M-x p 
> r o c e d <return> M-1 T C-s e m a c s C-s C-a C-s 
> C-s C-s C-s <C-home> C-s s e n d <home> F C-g f a l 
> <tab> <return> C-s C-s m a i l C-s C-a q <C-tab> <M-next> 
> <return> <return> <return> <return> C-q i q p p p C-q 
> i M-g n C-v M-v ! q g p p p p <return> q C-q i M-g 
> C-1 C-1 <return> <return> C-x C-f i n s t a l l e m 
> <return> C-s b z e C-s <backspace> <backspace> r C-s 
> C-s C-s C-s C-s C-a C-l C-1 C-1 c d <return> c d SPC 
> b u i <tab> t r <tab> <return> b z r SPC p u l l <return> 
> C-1 C-2 <return> <return> f i n d SPC . SPC - n a m 
> e SPC s h a d o w . e l <return> C-s <up> <left> <left> 
> C-x C-f C-f C-g C-x C-S-f <return> C-s i g n o r e 
> C-a C-1 C-1 C-q C-q <return> C-1 C-r <up> <up> C-1 
> C-r <home> C-s d i r - <home> C-x s M-x e m a c s - 
> <backspace> <backspace> <backspace> <backspace> <backspace> 
> <backspace> r e p o r C-g C-q i M-g n n C-p C-p C-p 
> B B u l f <return> C-n E M-x r e p o r t = e m <backspace> 
> <backspace> <backspace> - e m <tab> b <tab> <retur
> n>
>
> Recent messages:
> Expiring articles...done
> Reading incoming mail from file... [2 times]
> Wrote /home/jcl/mail/erlang-questions/13282
> Wrote /home/jcl/mail/emacs-devel/14561
> Wrote /home/jcl/mail/inbox/7063
> Wrote /home/jcl/mail/inbox/7064
> nnml: Reading incoming mail (4 new)...done
> Copying to ulfc: (7051)...
> Wrote /home/jcl/mail/ulfc/60
> Quit
>
> Load-path shadows:
> None found.
>
> Features:
> (vc-bzr emacsbug shadow w3m-lnum w3m-bookmark w3m-tabmenu w3m-session
> w3m-cookie w3m-form chistory rx desktop etags jcl-wesnoth-init
> wesnoth-mode wesnoth-wml-data wesnoth-update tabify hippie-exp dabbrev
> url-handlers gnus-draft gnus-fun flow-fill python-21 python cl-specs
> edebug mailalias cal-iso cal-move sort gnus-cite mail-extr gnus-bcklg
> gnus-async vc-git nnrss xml mm-url misearch multi-isearch add-log
> gnus-dired url-cache url-http url-gw url-auth erc-menu erc-join erc-ring
> erc-networks erc-pcomplete erc-track erc-match erc-button erc-fill
> erc-stamp erc-netsplit erc-goodies erc erc-backend erc-compat
> jcl-replace jcl-ruby jcl-sl w3m-load jcl-w3m w3m-search jcl-work-buffer
> w3m-type-ahead jcl-games jcl-text-translator-init text-translator
> text-translator-window text-translator-vars text-translator-sites
> jcl-muse htmlize-hack htmlize muse-latex muse-html muse-xml-common
> muse-colors cus-edit cus-start cus-load muse-publish muse-project
> muse-protocols muse-regexps derived muse muse-nested-tags muse-mode
> jcl-dictem-init dictem jcl-yaoddmuse yaoddmuse-extension w3m doc-view
> jka-compr image-mode timezone w3m-hist w3m-fb bookmark-w3m w3m-ems
> w3m-ccl ccl w3m-favicon w3m-image w3m-proc w3m-util yaoddmuse url
> url-proxy url-privacy url-expand url-methods url-history url-cookie
> url-util url-parse url-vars skeleton sgml-mode smiley network-stream tls
> jcl-stumpwm autorevert jcl-slime slime-fancy slime-fontifying-fu
> slime-package-fu slime-references slime-scratch slime-presentations
> slime-fuzzy slime-fancy-inspector slime-c-p-c slime-editing-commands
> slime-autodoc slime-parse slime-repl slime apropos hyperspec browse-url
> find-lisp eldoc time eldoc-eval-autoloads muse-autoloads
> svg-clock-autoloads package tabulated-list jcl-renegade-goblin
> jcl-home-boot mule-util flyspell qp parse-time gnus-ml nndraft nnmh
> nnfolder nnml gnus-agent gnus-srvr gnus-score score-mode nnvirtual
> gnus-msg gnus-art mm-uu mml2015 epg-config mm-view mml-smime smime dig
> nntp gnus-cache jcl-gnus-init jcl-gnus gnus-sum nnoo gnus-group
> gnus-undo nnmail mail-source gnus-start gnus-spec gnus-int gnus-range
> gnus-win mailcap starttls smtpmail sendmail message rfc822 mml mml-sec
> mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045
> ietf-drums mailabbrev gmm-utils mailheader gnus gnus-ems nnheader
> mail-utils wid-edit jcl-goblin fuzzy-match jcl-load-beta jcl-torrent
> text-translator-load jcl-calendar-init appt jcl-calendar holidays
> hol-loaddefs diary-lib diary-loaddefs cal-menu calendar cal-loaddefs
> jcl-emms-init emms-playing-time emms-mode-line emms-cache
> emms-info-ogginfo emms-info-mp3info emms-info later-do
> emms-playlist-mode emms-player-vlc emms-player-mplayer
> emms-player-simple emms-source-playlist emms-source-file emms-setup emms
> emms-compat jcl-erc-init jcl-file-cache-init jcl-grep-sbg sbg
> jcl-ido-init jcl-eel bindat jcl-dired dired-x dired-details wdired
> dired-aux jcl-register-init jcl-command-subset-init jcl-generic
> generic-x jcl-erlang-init jcl-erlang distel-ie edb patmatch erl-service
> derl erlext epmd net-fsm erl distel erlang man erlang-eunit jcl-safe
> jcl-abbrev-init jcl-swedish-postfix quail help-mode jcl-term time-stamp
> ange-ftp jcl-face hl-line jcl-modes-init jcl-rfc rfcview view goto-addr
> proced table picture inf-ruby ruby-mode sh-script noutline outline
> hideshow cwarn jcl-imenu jcl-global-init which-func imenu winner
> thingatpt paren mic-paren printing ps-print ps-def lpr icomplete ispell
> uniquify mb-depth midnight whitespace ffap saveplace jcl-keys-init
> diff-mode easy-mmode term disp-table ehelp kmacro tramp tramp-compat
> auth-source eieio assoc gnus-util mm-util mail-prsvr password-cache
> shell pcomplete format-spec tramp-loaddefs windmove jcl-keys
> jcl-load-functions jcl-file-cache ert find-func ewoc debug filecache
> jcl-elisp hi-lock jcl-register jcl-grep grep compile jcl-command-subset
> ido jcl-emacsclient jcl-duff jcl-template-init jcl-template jcl-motion
> jcl-windows jcl-recommended jcl-site-start jcl-erlang-log bookmark pp
> jcl-ediff byte-opt warnings bytecomp byte-compile cconv macroexp
> jcl-misc newcomment jcl-compile ediff-merg ediff-diff ediff-wind
> ediff-help ediff-util ediff-mult ediff-init ediff fpl electric cc-mode
> cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars
> cc-defs erlang-start clearcase tq reporter executable dired comint
> regexp-opt ansi-color ring info easymenu jcl-times-init advice help-fns
> advice-preload jcl-times jcl-util server cl jcl-load-path time-date
> tooltip ediff-hook vc-hooks lisp-float-type mwheel x-win x-dnd tool-bar
> dnd fontset image fringe lisp-mode register page menu-bar rfn-eshadow
> timer select scroll-bar mouse jit-lock font-lock syntax facemenu
> font-core frame cham georgian utf-8-lang misc-lang vietnamese tibetan
> thai tai-viet lao korean japanese hebrew greek romanian slovak czech
> european ethiopic indian cyrillic chinese case-table epa-hook
> jka-cmpr-hook help simple abbrev minibuffer loaddefs button faces
> cus-face files text-properties overlay sha1 md5 base64 format env
> code-pages mule custom widget hashtable-print-readable backquote
> make-network-process dbusbind dynamic-setting system-font-setting
> font-render-setting move-toolbar gtk x-toolkit x multi-tty emacs)





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2012-09-05 13:38 bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el Johan Claesson
  2012-09-05 16:23 ` Johan Claesson
@ 2012-09-08  1:13 ` Glenn Morris
  2012-09-08 14:08   ` Johan Claesson
  1 sibling, 1 reply; 14+ messages in thread
From: Glenn Morris @ 2012-09-08  1:13 UTC (permalink / raw)
  To: Johan Claesson; +Cc: 12357

Johan Claesson wrote:

> A minor suggestion for shadow.el.  list-load-path-shadows will detect
> if there are two lisp files with the same name in the load-path.  Such
> a clash could cause problems for normal lisp files.  But i think it is
> normal to have multiple .dir-locals.el files spread across the
> load-path.  In order to avoid false warnings list-load-path-shadows
> could ignore the special file name .dir-locals.el.

I think you are right, but if any one given directory has more than one
dir-locals file above it in the directory tree, then the "lowest" one
does indeed shadow all the "higher" ones. So it might be good to still
report such cases?





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2012-09-08  1:13 ` Glenn Morris
@ 2012-09-08 14:08   ` Johan Claesson
  2012-09-16 18:56     ` Johan Claesson
  0 siblings, 1 reply; 14+ messages in thread
From: Johan Claesson @ 2012-09-08 14:08 UTC (permalink / raw)
  To: Glenn Morris; +Cc: 12357



I did not think about that kind of shadowing.  I agree that would also
be nice to have reported.  But i think it is a different thing.  Also
it could be that the user wants the lower dir-locals file to shadow the
higher one.  But i guess no user wants one lisp file to shadow another
in the load-path.  

Maybe a separate command could search for dir-local files shadowing
other dir-local files for a given directory or list of directories.
(I could submit such a function.)

I usually run list-load-path-shadows in the same go as compiling my
elisp directory and just like it is nice to have no compiler warnings it
is nice to have no shadow warnings.

Regards,

/Johan


Glenn Morris <rgm@gnu.org> writes:

> Johan Claesson wrote:
>
>> A minor suggestion for shadow.el.  list-load-path-shadows will detect
>> if there are two lisp files with the same name in the load-path.  Such
>> a clash could cause problems for normal lisp files.  But i think it is
>> normal to have multiple .dir-locals.el files spread across the
>> load-path.  In order to avoid false warnings list-load-path-shadows
>> could ignore the special file name .dir-locals.el.
>
> I think you are right, but if any one given directory has more than one
> dir-locals file above it in the directory tree, then the "lowest" one
> does indeed shadow all the "higher" ones. So it might be good to still
> report such cases?





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2012-09-08 14:08   ` Johan Claesson
@ 2012-09-16 18:56     ` Johan Claesson
  2014-02-26  8:49       ` Xue Fuqiao
  0 siblings, 1 reply; 14+ messages in thread
From: Johan Claesson @ 2012-09-16 18:56 UTC (permalink / raw)
  To: Glenn Morris; +Cc: 12357


A command to search for .dir-local.el shadows could look something like
below.  Let me know if a polished version of the code below would be
useful.

I should probably clarify that this was not at all what i had in mind
when writing this bug report/suggestion in the first place :).  I would
be happy if just the list-load-path-shadows command would ignore
.dir-locals.el files.

(defun list-load-path-dir-locals-shadows ()
  (interactive)
  (dir-locals-shadows load-path))

(defun dir-locals-shadows (path)
  (when (stringp path)
    (setq path (list path)))
  (with-current-buffer (get-buffer-create "*Dir-Locals-Shadows*")
    (erase-buffer)
    (dolist (dir path)
      (dir-locals-shadows-aux dir (dir-locals-find-file (file-name-as-directory dir))))
    (if (> (point-max) (point-min))
        (display-buffer (current-buffer))
      (kill-buffer (current-buffer))
      (message "No dir-local shadows found."))))

(defun dir-locals-class-name (class)
  (if (stringp class)
      class
    (if (file-name-directory (symbol-name (cadr class)))
        (concat (car class) dir-locals-file)
      (format "%s%s (class %s)" (car class) dir-locals-file (cadr class)))))

(defun dir-locals-shadows-aux (dir locals)
  (dolist (file (directory-files dir nil nil t))
    (let ((subdir (expand-file-name file dir)))
      (when (and (file-directory-p subdir)
                 (not (or (string-equal file ".")
                          (string-equal file "..")
                          (file-symlink-p subdir))))
        (let ((subdir-locals (dir-locals-find-file (file-name-as-directory subdir))))
          (and locals
               (not (equal locals subdir-locals))
               (insert (format "%s shadows %s\n"
                               (dir-locals-class-name subdir-locals)
                               (dir-locals-class-name locals))))
          (dir-locals-shadows-aux subdir subdir-locals))))))

Regards,

/Johan




Johan Claesson <johanclaesson@bredband.net> writes:

> I did not think about that kind of shadowing.  I agree that would also
> be nice to have reported.  But i think it is a different thing.  Also
> it could be that the user wants the lower dir-locals file to shadow the
> higher one.  But i guess no user wants one lisp file to shadow another
> in the load-path.  
>
> Maybe a separate command could search for dir-local files shadowing
> other dir-local files for a given directory or list of directories.
> (I could submit such a function.)
>
> I usually run list-load-path-shadows in the same go as compiling my
> elisp directory and just like it is nice to have no compiler warnings it
> is nice to have no shadow warnings.
>
> Regards,
>
> /Johan
>
>
> Glenn Morris <rgm@gnu.org> writes:
>
>> Johan Claesson wrote:
>>
>>> A minor suggestion for shadow.el.  list-load-path-shadows will detect
>>> if there are two lisp files with the same name in the load-path.  Such
>>> a clash could cause problems for normal lisp files.  But i think it is
>>> normal to have multiple .dir-locals.el files spread across the
>>> load-path.  In order to avoid false warnings list-load-path-shadows
>>> could ignore the special file name .dir-locals.el.
>>
>> I think you are right, but if any one given directory has more than one
>> dir-locals file above it in the directory tree, then the "lowest" one
>> does indeed shadow all the "higher" ones. So it might be good to still
>> report such cases?





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2012-09-16 18:56     ` Johan Claesson
@ 2014-02-26  8:49       ` Xue Fuqiao
  2014-03-02 22:14         ` Johan Claesson
  0 siblings, 1 reply; 14+ messages in thread
From: Xue Fuqiao @ 2014-02-26  8:49 UTC (permalink / raw)
  To: 12357

Johan Claesson <johanclaesson@bredband.net> writes:

> A command to search for .dir-local.el shadows could look something like
> below.

Looks fine to me.  I made a patch (and tested it).  Any comments?

(I haven't written the documentation/ChangeLog/NEWS yet.)

=== modified file 'lisp/emacs-lisp/shadow.el'
--- lisp/emacs-lisp/shadow.el	2014-01-01 07:43:34 +0000
+++ lisp/emacs-lisp/shadow.el	2014-02-26 08:38:54 +0000
@@ -115,7 +115,8 @@
 	  ;; FILE now contains the current file name, with no suffix.
 	  (unless (or (member file files-seen-this-dir)
 		      ;; Ignore these files.
-		      (member file '("subdirs" "leim-list")))
+		      (member file '("subdirs" "leim-list"))
+		      (string= file (file-name-sans-extension dir-locals-file)))
 	    ;; File has not been seen yet in this directory.
 	    ;; This test prevents us declaring that XXX.el shadows
 	    ;; XXX.elc (or vice-versa) when they are in the same directory.
@@ -281,6 +282,49 @@
 	      (forward-line 1))
 	    (message "%s" msg)))))))
 
+\f
+
+(defun list-load-path-dir-locals-shadows ()
+  "Display a list of dir-local files that shadow other files."
+  (interactive)
+  (dir-locals-shadows load-path))
+
+(defun dir-locals-shadows (path)
+  "Display a list of dir-local files that shadow other files under PATH."
+  (when (stringp path)
+    (setq path (list path)))
+  (with-current-buffer (get-buffer-create "*Dir-Locals-Shadows*")
+    (erase-buffer)
+    (dolist (dir path)
+      (dir-locals-shadows-1 dir (dir-locals-find-file (file-name-as-directory dir))))
+    (if (> (point-max) (point-min))
+        (display-buffer (current-buffer))
+      (kill-buffer (current-buffer))
+      (message "No dir-local shadows found."))))
+
+(defun dir-locals-class-name (class)
+  (if (stringp class)
+      class
+    (if (file-name-directory (symbol-name (cadr class)))
+        (concat (car class) dir-locals-file)
+      (format "%s%s (class %s)" (car class) dir-locals-file (cadr class)))))
+
+(defun dir-locals-shadows-1 (dir locals)
+  "Auxiliary function for `dir-locals-shadows'."
+  (dolist (file (directory-files dir nil nil 'no-sort))
+    (let ((subdir (expand-file-name file dir)))
+      (when (and (file-directory-p subdir)
+                 (not (or (string-equal file ".")
+                          (string-equal file "..")
+                          (file-symlink-p subdir))))
+        (let ((subdir-locals (dir-locals-find-file (file-name-as-directory subdir))))
+          (and locals
+               (not (equal locals subdir-locals))
+               (insert (format "%s shadows %s\n"
+                               (dir-locals-class-name subdir-locals)
+                               (dir-locals-class-name locals))))
+          (dir-locals-shadows-1 subdir subdir-locals))))))
+
 (provide 'shadow)
 
 ;;; shadow.el ends here

-- 
http://www.gnu.org/software/emacs/





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2014-02-26  8:49       ` Xue Fuqiao
@ 2014-03-02 22:14         ` Johan Claesson
  2014-03-02 22:36           ` Xue Fuqiao
  0 siblings, 1 reply; 14+ messages in thread
From: Johan Claesson @ 2014-03-02 22:14 UTC (permalink / raw)
  To: Xue Fuqiao; +Cc: 12357

[-- Attachment #1: Type: text/plain, Size: 788 bytes --]



Great.  Attached is a loading.texi patch that just add to the
description of list-load-path-shadows that it will not report
.dir-locals.el files.  Do you think there should be a @deffn entry for 
list-load-path-dir-locals-shadows as well?

Also attached is a shadow.el patch with the following changes: 

1. Some more doc string text. 
2. list-load-path-dir-locals-shadows uses the same button making code as
list-load-path-shadows. 
3. Inherit the major mode from special-mode instead of fundamental-mode
to get quit on ?q etc. 
4. Also bind forward-button to tab in this mode.  And backward-button to
backtab. 
5. It will not bail out on an invalid directory in load-path any more (i
happened to have some invalid directories in load-path while testing
this :) ). 

Regards,

/Johan


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: loading.texi.diff --]
[-- Type: text/x-diff, Size: 825 bytes --]

=== modified file 'doc/lispref/loading.texi'
--- old/doc/lispref/loading.texi	2014-01-01 07:43:34 +0000
+++ new/doc/lispref/loading.texi	2014-03-02 21:39:14 +0000
@@ -411,12 +411,19 @@
 directory.  Such a situation might indicate a problem in the way Emacs
 was installed.
 
+Files named @file{.dir-locals.el} are not reported by this command.
+These files specify directory local variables, see @ref{Directory
+Local Variables}.  It is normal that it exists multiple files with
+this name.
+
 When called from Lisp, this function prints a message listing the
 shadowed files, instead of displaying them in a buffer.  If the
 optional argument @code{stringp} is non-@code{nil}, it instead returns
 the shadowed files as a string.
 @end deffn
 
+
+
 @node Loading Non-ASCII
 @section Loading Non-@acronym{ASCII} Characters
 


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: shadow.el.diff --]
[-- Type: text/x-diff, Size: 6049 bytes --]

=== modified file 'lisp/emacs-lisp/shadow.el'
--- old/lisp/emacs-lisp/shadow.el	2014-01-01 07:43:34 +0000
+++ new/lisp/emacs-lisp/shadow.el	2014-03-02 22:06:37 +0000
@@ -115,7 +115,8 @@
 	  ;; FILE now contains the current file name, with no suffix.
 	  (unless (or (member file files-seen-this-dir)
 		      ;; Ignore these files.
-		      (member file '("subdirs" "leim-list")))
+		      (member file '("subdirs" "leim-list"))
+                      (string= file (file-name-sans-extension dir-locals-file)))
 	    ;; File has not been seen yet in this directory.
 	    ;; This test prevents us declaring that XXX.el shadows
 	    ;; XXX.elc (or vice-versa) when they are in the same directory.
@@ -169,20 +170,27 @@
      . (1 font-lock-warning-face)))
   "Keywords to highlight in `load-path-shadows-mode'.")
 
-(define-derived-mode load-path-shadows-mode fundamental-mode "LP-Shadows"
+(define-derived-mode load-path-shadows-mode special-mode "LP-Shadows"
   "Major mode for load-path shadows buffer."
   (set (make-local-variable 'font-lock-defaults)
        '((load-path-shadows-font-lock-keywords)))
   (setq buffer-undo-list t
 	buffer-read-only t))
 
+(let ((map (make-sparse-keymap)))
+  (define-key map [tab] 'forward-button)
+  (define-key map [backtab] 'backward-button)
+  (setq load-path-shadows-mode-map map))
+
 ;; TODO use text-properties instead, a la dired.
 (require 'button)
 (define-button-type 'load-path-shadows-find-file
   'follow-link t
-;;  'face 'default
   'action (lambda (button)
-	    (let ((file (concat (button-get button 'shadow-file) ".el")))
+	    (let* ((shadow-file (button-get button 'shadow-file))
+                   (file (if (equal (file-name-extension shadow-file) "el")
+                             shadow-file
+                           (concat shadow-file ".el"))))
 	      (or (file-exists-p file)
 		  (setq file (concat file ".gz")))
 	      (if (file-readable-p file)
@@ -190,6 +198,20 @@
 		(error "Cannot read file"))))
   'help-echo "mouse-2, RET: find this file")
 
+(defun load-path-shadows-make-buttons ()
+  "Create buttons for `load-path-shadows-mode'."
+  (let ((inhibit-read-only t))
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward "\\(^.*\\) hides \\(.*$\\)"
+                                nil t)
+        (dotimes (i 2)
+          (make-button (match-beginning (1+ i))
+                       (match-end (1+ i))
+                       'type 'load-path-shadows-find-file
+                       'shadow-file
+                       (match-string (1+ i))))))))
+
 \f
 ;;;###autoload
 (defun list-load-path-shadows (&optional stringp)
@@ -231,6 +253,11 @@
 XXX.elc in an early directory (that does not contain XXX.el) is
 considered to shadow a later file XXX.el, and vice-versa.
 
+Files named .dir-locals.el are not reported by this command.
+These files specify directory local variables.  It is normal that
+it exists multiple files with this name.  But see the command
+`list-load-path-dir-locals-shadows'.
+
 Shadowings are located by calling the (non-interactive) companion
 function, `load-path-shadows-find'."
   (interactive)
@@ -257,14 +284,7 @@
 		  (erase-buffer)
 		  (insert string)
 		  (insert msg "\n")
-		  (while (re-search-backward "\\(^.*\\) hides \\(.*$\\)"
-					     nil t)
-		    (dotimes (i 2)
-		      (make-button (match-beginning (1+ i))
-				   (match-end (1+ i))
-				   'type 'load-path-shadows-find-file
-				   'shadow-file
-				   (match-string (1+ i)))))
+                  (load-path-shadows-make-buttons)
 		  (goto-char (point-max)))))
 	  ;; We are non-interactive, print shadows via message.
 	  (unless (zerop n)
@@ -281,6 +301,64 @@
 	      (forward-line 1))
 	    (message "%s" msg)))))))
 
+
+
+\f
+
+(defun list-load-path-dir-locals-shadows ()
+  "Display a list of dir-local files that shadow other such files.
+
+A .dir-locals.el file will shadow any other such file higher up
+in the directory tree.  Sometimes this is what you want,
+sometimes it is not.  This command will show all such shadowing
+in the current `load-path'.
+
+This command complements the command `list-load-path-shadows'.
+"
+  (interactive)
+  (dir-locals-shadows load-path))
+
+(defun dir-locals-shadows (path)
+  "Display a list of dir-local files that shadow other files under PATH."
+  (when (stringp path)
+    (setq path (list path)))
+  (with-current-buffer (get-buffer-create "*Dir-Locals-Shadows*")
+    (let ((inhibit-read-only t))
+      (erase-buffer)
+      (dolist (dir path)
+        (if (file-directory-p dir)
+            (dir-locals-shadows-1 dir (dir-locals-find-file (file-name-as-directory dir)))
+          (insert (format "invalid dir %s\n" dir)))))
+    (load-path-shadows-mode)
+    (load-path-shadows-make-buttons)
+    (if (> (point-max) (point-min))
+        (display-buffer (current-buffer))
+      (kill-buffer (current-buffer))
+      (message "No dir-local shadows found."))))
+
+(defun dir-locals-class-name (class)
+  (if (stringp class)
+      class
+    (if (file-name-directory (symbol-name (cadr class)))
+        (concat (car class) dir-locals-file)
+      (format "%s%s (class %s)" (car class) dir-locals-file (cadr class)))))
+
+(defun dir-locals-shadows-1 (dir locals)
+  "Auxiliary function for `dir-locals-shadows'."
+  (dolist (file (directory-files dir nil nil 'no-sort))
+    (let ((subdir (expand-file-name file dir)))
+      (when (and (file-directory-p subdir)
+                 (not (or (string-equal file ".")
+                          (string-equal file "..")
+                          (file-symlink-p subdir))))
+        (let ((subdir-locals (dir-locals-find-file (file-name-as-directory subdir))))
+          (and locals
+               (not (equal locals subdir-locals))
+               (insert (format "%s hides %s\n"
+                               (dir-locals-class-name subdir-locals)
+                               (dir-locals-class-name locals))))
+          (dir-locals-shadows-1 subdir subdir-locals))))))
+
 (provide 'shadow)
 
 ;;; shadow.el ends here


[-- Attachment #4: Type: text/plain, Size: 3006 bytes --]






Xue Fuqiao <xfq@gnu.org> writes:

> Johan Claesson <johanclaesson@bredband.net> writes:
>
>> A command to search for .dir-local.el shadows could look something like
>> below.
>
> Looks fine to me.  I made a patch (and tested it).  Any comments?
>
> (I haven't written the documentation/ChangeLog/NEWS yet.)
>
> === modified file 'lisp/emacs-lisp/shadow.el'
> --- lisp/emacs-lisp/shadow.el	2014-01-01 07:43:34 +0000
> +++ lisp/emacs-lisp/shadow.el	2014-02-26 08:38:54 +0000
> @@ -115,7 +115,8 @@
>  	  ;; FILE now contains the current file name, with no suffix.
>  	  (unless (or (member file files-seen-this-dir)
>  		      ;; Ignore these files.
> -		      (member file '("subdirs" "leim-list")))
> +		      (member file '("subdirs" "leim-list"))
> +		      (string= file (file-name-sans-extension dir-locals-file)))
>  	    ;; File has not been seen yet in this directory.
>  	    ;; This test prevents us declaring that XXX.el shadows
>  	    ;; XXX.elc (or vice-versa) when they are in the same directory.
> @@ -281,6 +282,49 @@
>  	      (forward-line 1))
>  	    (message "%s" msg)))))))
>  
> +\f
> +
> +(defun list-load-path-dir-locals-shadows ()
> +  "Display a list of dir-local files that shadow other files."
> +  (interactive)
> +  (dir-locals-shadows load-path))
> +
> +(defun dir-locals-shadows (path)
> +  "Display a list of dir-local files that shadow other files under PATH."
> +  (when (stringp path)
> +    (setq path (list path)))
> +  (with-current-buffer (get-buffer-create "*Dir-Locals-Shadows*")
> +    (erase-buffer)
> +    (dolist (dir path)
> +      (dir-locals-shadows-1 dir (dir-locals-find-file (file-name-as-directory dir))))
> +    (if (> (point-max) (point-min))
> +        (display-buffer (current-buffer))
> +      (kill-buffer (current-buffer))
> +      (message "No dir-local shadows found."))))
> +
> +(defun dir-locals-class-name (class)
> +  (if (stringp class)
> +      class
> +    (if (file-name-directory (symbol-name (cadr class)))
> +        (concat (car class) dir-locals-file)
> +      (format "%s%s (class %s)" (car class) dir-locals-file (cadr class)))))
> +
> +(defun dir-locals-shadows-1 (dir locals)
> +  "Auxiliary function for `dir-locals-shadows'."
> +  (dolist (file (directory-files dir nil nil 'no-sort))
> +    (let ((subdir (expand-file-name file dir)))
> +      (when (and (file-directory-p subdir)
> +                 (not (or (string-equal file ".")
> +                          (string-equal file "..")
> +                          (file-symlink-p subdir))))
> +        (let ((subdir-locals (dir-locals-find-file (file-name-as-directory subdir))))
> +          (and locals
> +               (not (equal locals subdir-locals))
> +               (insert (format "%s shadows %s\n"
> +                               (dir-locals-class-name subdir-locals)
> +                               (dir-locals-class-name locals))))
> +          (dir-locals-shadows-1 subdir subdir-locals))))))
> +
>  (provide 'shadow)
>  
>  ;;; shadow.el ends here

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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2014-03-02 22:14         ` Johan Claesson
@ 2014-03-02 22:36           ` Xue Fuqiao
  2014-03-04 22:29             ` Johan Claesson
  0 siblings, 1 reply; 14+ messages in thread
From: Xue Fuqiao @ 2014-03-02 22:36 UTC (permalink / raw)
  To: Johan Claesson; +Cc: Xue Fuqiao, 12357

Johan Claesson <johanclaesson@bredband.net> writes:

> Do you think there should be a @deffn entry for
> list-load-path-dir-locals-shadows as well?

I think so.

-- 
http://www.gnu.org/software/emacs/





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2014-03-02 22:36           ` Xue Fuqiao
@ 2014-03-04 22:29             ` Johan Claesson
  2014-03-05  0:54               ` Leo Liu
  0 siblings, 1 reply; 14+ messages in thread
From: Johan Claesson @ 2014-03-04 22:29 UTC (permalink / raw)
  To: Xue Fuqiao; +Cc: 12357

[-- Attachment #1: Type: text/plain, Size: 1074 bytes --]



Ok, that is added to the loading.texi patch. 

Also list-load-path-dir-locals-shadows was renamed to
list-dir-locals-shadows.  An argument PATH was added since it makes
sense to run this on other directories than load-path.  And the argument
STRINGP was added to align with list-load-path-shadows.

NEWS suggestion:

** `list-load-path-shadows' no longer reports .dir-locals.el files.  A
.dir-locals.el file may shadow another .dir-locals.el file but not in
the same sense as in `list-load-path-shadows'.  A new command
`list-dir-locals-shadows' is introduced.  It detect shadows of
.dir-locals.el files in a way that make sense for this type of files.

ChangeLog suggestion:

	* emacs-lisp/shadows.el (load-path-shadows-find): Do not report
	.dir-locals.el files. 
	(list-dir-locals-shadows): New command that reports shadows of
	.dir-locals.el in a way that make sense for that type of file. 
	(dir-locals-shadows-find, dir-locals-shadows-find-1)
	(dir-locals-class-name, dir-locals-shadows-display): Auxiliary
	functions for list-dir-locals-shadows.

Regards,

/Johan


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: shadow.el.diff --]
[-- Type: text/x-diff, Size: 7188 bytes --]

=== modified file 'lisp/emacs-lisp/shadow.el'
--- old/lisp/emacs-lisp/shadow.el	2014-01-01 07:43:34 +0000
+++ new/lisp/emacs-lisp/shadow.el	2014-03-04 22:26:00 +0000
@@ -115,7 +115,8 @@
 	  ;; FILE now contains the current file name, with no suffix.
 	  (unless (or (member file files-seen-this-dir)
 		      ;; Ignore these files.
-		      (member file '("subdirs" "leim-list")))
+		      (member file '("subdirs" "leim-list"))
+                      (string= file (file-name-sans-extension dir-locals-file)))
 	    ;; File has not been seen yet in this directory.
 	    ;; This test prevents us declaring that XXX.el shadows
 	    ;; XXX.elc (or vice-versa) when they are in the same directory.
@@ -169,20 +170,27 @@
      . (1 font-lock-warning-face)))
   "Keywords to highlight in `load-path-shadows-mode'.")
 
-(define-derived-mode load-path-shadows-mode fundamental-mode "LP-Shadows"
+(define-derived-mode load-path-shadows-mode special-mode "LP-Shadows"
   "Major mode for load-path shadows buffer."
   (set (make-local-variable 'font-lock-defaults)
        '((load-path-shadows-font-lock-keywords)))
   (setq buffer-undo-list t
 	buffer-read-only t))
 
+(let ((map (make-sparse-keymap)))
+  (define-key map [tab] 'forward-button)
+  (define-key map [backtab] 'backward-button)
+  (setq load-path-shadows-mode-map map))
+
 ;; TODO use text-properties instead, a la dired.
 (require 'button)
 (define-button-type 'load-path-shadows-find-file
   'follow-link t
-;;  'face 'default
   'action (lambda (button)
-	    (let ((file (concat (button-get button 'shadow-file) ".el")))
+	    (let* ((shadow-file (button-get button 'shadow-file))
+                   (file (if (equal (file-name-extension shadow-file) "el")
+                             shadow-file
+                           (concat shadow-file ".el"))))
 	      (or (file-exists-p file)
 		  (setq file (concat file ".gz")))
 	      (if (file-readable-p file)
@@ -190,6 +198,21 @@
 		(error "Cannot read file"))))
   'help-echo "mouse-2, RET: find this file")
 
+(defun load-path-shadows-make-buttons ()
+  "Create buttons for `load-path-shadows-mode'."
+  (let ((inhibit-read-only t))
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward "\\(^.*\\) hides \\(.*$\\)"
+                                nil t)
+        (dotimes (i 2)
+          (let ((file (match-string (1+ i))))
+            (when (file-exists-p file)
+              (make-button (match-beginning (1+ i))
+                           (match-end (1+ i))
+                           'type 'load-path-shadows-find-file
+                           'shadow-file file))))))))
+
 \f
 ;;;###autoload
 (defun list-load-path-shadows (&optional stringp)
@@ -231,6 +254,11 @@
 XXX.elc in an early directory (that does not contain XXX.el) is
 considered to shadow a later file XXX.el, and vice-versa.
 
+Files named .dir-locals.el are not reported by this command.
+These files specify directory local variables.  It is normal that
+it exists multiple files with this name.  But see the command
+`list-dir-locals-shadows'.
+
 Shadowings are located by calling the (non-interactive) companion
 function, `load-path-shadows-find'."
   (interactive)
@@ -257,14 +285,7 @@
 		  (erase-buffer)
 		  (insert string)
 		  (insert msg "\n")
-		  (while (re-search-backward "\\(^.*\\) hides \\(.*$\\)"
-					     nil t)
-		    (dotimes (i 2)
-		      (make-button (match-beginning (1+ i))
-				   (match-end (1+ i))
-				   'type 'load-path-shadows-find-file
-				   'shadow-file
-				   (match-string (1+ i)))))
+                  (load-path-shadows-make-buttons)
 		  (goto-char (point-max)))))
 	  ;; We are non-interactive, print shadows via message.
 	  (unless (zerop n)
@@ -281,6 +302,93 @@
 	      (forward-line 1))
 	    (message "%s" msg)))))))
 
+
+
+\f
+;;;###autoload
+(defun list-dir-locals-shadows (&optional stringp path)
+  "Display a list of .dir-locals.el files that shadow other such files.
+
+A .dir-locals.el file will shadow any other such file higher up
+in the directory tree.  Sometimes this is what you want,
+sometimes it is not.
+
+If the optional argument STRINGP is non-nil, returns any shadows
+as a string.  Otherwise, if interactive shows any shadows in a
+`*Dir-Locals-Shadows*' buffer; else print a message listing any
+shadows.
+
+The optional argument PATH is the directory or list of
+directories to examine.  It defaults to the value of `load-path'.
+
+This command complements the command `list-load-path-shadows'."
+  (interactive)
+  (unless path
+    (setq path load-path))
+  (let ((string (dir-locals-shadows-find path)))
+    (if stringp
+        string
+      (if (zerop (length string))
+          (message "No dir-local shadows found.")
+        (if (called-interactively-p 'interactive)
+            (dir-locals-shadows-display string)
+          (message "Dir-locals shadows:\n%s" string))))))
+
+(defun dir-locals-shadows-find (path)
+  "Return a string of .dir-locals.el files that shadows other such files.
+
+The argument PATH is the directory or list of directories to
+examine.
+
+A .dir-locals.el file will shadow any other such file higher up
+in the directory tree.  Sometimes this is what you want,
+sometimes it is not." 
+  (when (stringp path)
+    (setq path (list path)))
+  (with-temp-buffer
+    (dolist (dir path)
+      (if (file-directory-p dir)
+          (dir-locals-shadows-find-1 dir (dir-locals-find-file (file-name-as-directory dir)))
+        (insert (format "Invalid dir %s\n" dir))))
+    (buffer-string)))
+
+(defun dir-locals-shadows-find-1 (dir locals)
+  "Auxiliary function for `dir-locals-shadows-find'."
+  (dolist (file (directory-files dir nil nil 'no-sort))
+    (let ((subdir (expand-file-name file dir)))
+      (when (and (file-directory-p subdir)
+                 (not (or (string-equal file ".")
+                          (string-equal file "..")
+                          (file-symlink-p subdir))))
+        (let ((subdir-locals (dir-locals-find-file (file-name-as-directory subdir))))
+          (and locals
+               (not (equal locals subdir-locals))
+               (insert (format "%s hides %s\n"
+                               (dir-locals-class-name subdir-locals)
+                               (dir-locals-class-name locals))))
+          (dir-locals-shadows-find-1 subdir subdir-locals))))))
+
+(defun dir-locals-class-name (class)
+  "Returns a describing string for directory-local class CLASS.
+
+CLASS is a values returned from `dir-locals-find-file'.  It
+can be a string or a list.  See that function for details."
+  (if (stringp class)
+        class
+    (if (file-name-directory (symbol-name (cadr class)))
+        (concat (car class) dir-locals-file)
+      (format "%s (class %s)" (car class) (cadr class)))))
+
+(defun dir-locals-shadows-display (string)
+  "Display the dir-locals shadows STRING in a buffer."
+  (with-current-buffer (get-buffer-create "*Dir-Locals-Shadows*")
+    (load-path-shadows-mode)
+    (let ((inhibit-read-only t))
+      (erase-buffer)
+      (insert string)
+      (load-path-shadows-make-buttons)
+      (display-buffer (current-buffer)))))
+
 (provide 'shadow)
 
 ;;; shadow.el ends here


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: loading.texi.diff --]
[-- Type: text/x-diff, Size: 1612 bytes --]

=== modified file 'doc/lispref/loading.texi'
--- old/doc/lispref/loading.texi	2014-01-01 07:43:34 +0000
+++ new/doc/lispref/loading.texi	2014-03-04 22:12:52 +0000
@@ -411,12 +411,35 @@
 directory.  Such a situation might indicate a problem in the way Emacs
 was installed.
 
+Files named @file{.dir-locals.el} are not reported by this command.
+These files specify directory local variables, see @ref{Directory
+Local Variables}.  It is normal that it exists multiple files with
+this name.  But see the command @code{list-dir-locals-shadows}
+below.
+
 When called from Lisp, this function prints a message listing the
 shadowed files, instead of displaying them in a buffer.  If the
-optional argument @code{stringp} is non-@code{nil}, it instead returns
+optional argument @var{stringp} is non-@code{nil}, it instead returns
 the shadowed files as a string.
 @end deffn
 
+@deffn Command list-dir-locals-shadows &optional stringp path
+This command displays a list of @file{.dir-locals.el} files that shadow other
+such files.
+
+A @file{.dir-locals.el} file will shadow any other such file higher up
+in the directory tree.  Sometimes this is what you want,
+sometimes it is not.  
+
+If the optional argument @var{stringp} is non-@code{nil}, returns any
+shadows as a string.  Otherwise, if interactive shows any shadows in a
+buffer; else prints a message listing any shadows.
+
+The optional argument @var{path} is the directory or list of directories
+to examine.  It defaults to the value of @code{load-path}.
+@end deffn
+
+
 @node Loading Non-ASCII
 @section Loading Non-@acronym{ASCII} Characters
 


[-- Attachment #4: Type: text/plain, Size: 210 bytes --]



	



Xue Fuqiao <xfq@gnu.org> writes:

> Johan Claesson <johanclaesson@bredband.net> writes:
>
>> Do you think there should be a @deffn entry for
>> list-load-path-dir-locals-shadows as well?
>
> I think so.

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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2014-03-04 22:29             ` Johan Claesson
@ 2014-03-05  0:54               ` Leo Liu
  2014-03-05  7:09                 ` Johan Claesson
  2014-03-05  7:25                 ` Johan Claesson
  0 siblings, 2 replies; 14+ messages in thread
From: Leo Liu @ 2014-03-05  0:54 UTC (permalink / raw)
  To: Johan Claesson; +Cc: 12357

On 2014-03-05 06:29 +0800, Johan Claesson wrote:
> 	* emacs-lisp/shadows.el (load-path-shadows-find): Do not report
> 	.dir-locals.el files. 
> 	(list-dir-locals-shadows): New command that reports shadows of
> 	.dir-locals.el in a way that make sense for that type of file. 
> 	(dir-locals-shadows-find, dir-locals-shadows-find-1)
> 	(dir-locals-class-name, dir-locals-shadows-display): Auxiliary
> 	functions for list-dir-locals-shadows.

I am not too sure what problems are solved by the change.

In the case of list-load-path-shadows, it should print anything when in
doubt since false positives can be helpful. So it is not entirely wrong
to report .dir-locals.el.

Use .dir-locals.el in a child directory to shadow parent directory isn't
uncommon practice. In future we might even make it capable of inheriting
settings in parent directory. So I am not even sure the use case of
listing .dir-locals files (defaulting to the load-path)??

Leo





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2014-03-05  0:54               ` Leo Liu
@ 2014-03-05  7:09                 ` Johan Claesson
  2014-03-06  2:07                   ` Glenn Morris
  2014-03-05  7:25                 ` Johan Claesson
  1 sibling, 1 reply; 14+ messages in thread
From: Johan Claesson @ 2014-03-05  7:09 UTC (permalink / raw)
  To: 12357



Well i would like the false positives to go away.  That is the problem
this attempts to fix.  

How about a defvar load-path-shadows-report-dir-locals instead?
It would of course be true by default to preserve legacy behaviour. 

Regards,

/Johan




Leo Liu <sdl.web@gmail.com> writes:

> On 2014-03-05 06:29 +0800, Johan Claesson wrote:
>> 	* emacs-lisp/shadows.el (load-path-shadows-find): Do not report
>> 	.dir-locals.el files. 
>> 	(list-dir-locals-shadows): New command that reports shadows of
>> 	.dir-locals.el in a way that make sense for that type of file. 
>> 	(dir-locals-shadows-find, dir-locals-shadows-find-1)
>> 	(dir-locals-class-name, dir-locals-shadows-display): Auxiliary
>> 	functions for list-dir-locals-shadows.
>
> I am not too sure what problems are solved by the change.
>
> In the case of list-load-path-shadows, it should print anything when in
> doubt since false positives can be helpful. So it is not entirely wrong
> to report .dir-locals.el.
>
> Use .dir-locals.el in a child directory to shadow parent directory isn't
> uncommon practice. In future we might even make it capable of inheriting
> settings in parent directory. So I am not even sure the use case of
> listing .dir-locals files (defaulting to the load-path)??
>
> Leo





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2014-03-05  0:54               ` Leo Liu
  2014-03-05  7:09                 ` Johan Claesson
@ 2014-03-05  7:25                 ` Johan Claesson
  1 sibling, 0 replies; 14+ messages in thread
From: Johan Claesson @ 2014-03-05  7:25 UTC (permalink / raw)
  To: Leo Liu; +Cc: Xue Fuqiao, 12357





Well i would like the false positives to go away.  That is the problem
this attempts to fix.  

How about a defvar load-path-shadows-report-dir-locals instead?
It would of course be true by default to preserve legacy behaviour. 

I agree that list-dir-locals-shadows is not very useful.  It was written
only to motivate that list-load-path-shadows should not report
.dir-locals.el. 

Regards,

/Johan



Leo Liu <sdl.web@gmail.com> writes:

> On 2014-03-05 06:29 +0800, Johan Claesson wrote:
>> 	* emacs-lisp/shadows.el (load-path-shadows-find): Do not report
>> 	.dir-locals.el files. 
>> 	(list-dir-locals-shadows): New command that reports shadows of
>> 	.dir-locals.el in a way that make sense for that type of file. 
>> 	(dir-locals-shadows-find, dir-locals-shadows-find-1)
>> 	(dir-locals-class-name, dir-locals-shadows-display): Auxiliary
>> 	functions for list-dir-locals-shadows.
>
> I am not too sure what problems are solved by the change.
>
> In the case of list-load-path-shadows, it should print anything when in
> doubt since false positives can be helpful. So it is not entirely wrong
> to report .dir-locals.el.
>
> Use .dir-locals.el in a child directory to shadow parent directory isn't
> uncommon practice. In future we might even make it capable of inheriting
> settings in parent directory. So I am not even sure the use case of
> listing .dir-locals files (defaulting to the load-path)??
>
> Leo





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2014-03-05  7:09                 ` Johan Claesson
@ 2014-03-06  2:07                   ` Glenn Morris
  2014-03-06 21:58                     ` Johan Claesson
  0 siblings, 1 reply; 14+ messages in thread
From: Glenn Morris @ 2014-03-06  2:07 UTC (permalink / raw)
  To: 12357-done

Version: 24.4

On reflection, I think you were right from the start, and that this
command should simply ignore dir-locals, since they are not looked up
via load-path anyway. So I made that change. Sorry for the delay.
I do not think that a specialized command for dealing with dir-locals
is required. (We should add inheritance so it's not an issue.)





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

* bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el
  2014-03-06  2:07                   ` Glenn Morris
@ 2014-03-06 21:58                     ` Johan Claesson
  0 siblings, 0 replies; 14+ messages in thread
From: Johan Claesson @ 2014-03-06 21:58 UTC (permalink / raw)
  To: 12357



Good, thanks.  I totally agree that is all that is needed for this
minor issue. 

Regards,

/Johan



Glenn Morris <rgm@gnu.org> writes:

> Version: 24.4
>
> On reflection, I think you were right from the start, and that this
> command should simply ignore dir-locals, since they are not looked up
> via load-path anyway. So I made that change. Sorry for the delay.
> I do not think that a specialized command for dealing with dir-locals
> is required. (We should add inheritance so it's not an issue.)





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

end of thread, other threads:[~2014-03-06 21:58 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-05 13:38 bug#12357: 24.2; list-load-path-shadow should ignore .dir-locals.el Johan Claesson
2012-09-05 16:23 ` Johan Claesson
2012-09-08  1:13 ` Glenn Morris
2012-09-08 14:08   ` Johan Claesson
2012-09-16 18:56     ` Johan Claesson
2014-02-26  8:49       ` Xue Fuqiao
2014-03-02 22:14         ` Johan Claesson
2014-03-02 22:36           ` Xue Fuqiao
2014-03-04 22:29             ` Johan Claesson
2014-03-05  0:54               ` Leo Liu
2014-03-05  7:09                 ` Johan Claesson
2014-03-06  2:07                   ` Glenn Morris
2014-03-06 21:58                     ` Johan Claesson
2014-03-05  7:25                 ` Johan Claesson

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).