summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorGlenn Morris <rgm@gnu.org>2012-03-06 00:22:42 -0800
committerGlenn Morris <rgm@gnu.org>2012-03-06 00:22:42 -0800
commit99a8306435502146d52cd97377d95c93963d8ae4 (patch)
treeaaa3e20217651b90bbb3bf059c23b17ffa7732e5 /lisp
parent2e86d8576c668e149cc100f3222bcf19b38019dc (diff)
downloademacs-99a8306435502146d52cd97377d95c93963d8ae4.tar.gz
emacs-99a8306435502146d52cd97377d95c93963d8ae4.tar.bz2
emacs-99a8306435502146d52cd97377d95c93963d8ae4.zip
Tweak previous dir-locals-find-file change
* lisp/files.el (locate-dominating-file): Add optional predicate argument. (dir-locals-find-file): Make use of above change.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog5
-rw-r--r--lisp/files.el32
2 files changed, 19 insertions, 18 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 6a9b1808cdf..e9dce6280a6 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,8 @@
+2012-03-06 Glenn Morris <rgm@gnu.org>
+
+ * files.el (locate-dominating-file): Add optional predicate argument.
+ (dir-locals-find-file): Make use of above change.
+
2012-03-06 Thien-Thi Nguyen <ttn@gnuvola.org>
* info.el (Info-insert-dir): Also try "dir.gz".
diff --git a/lisp/files.el b/lisp/files.el
index fae834daefe..1d54ef81869 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -877,13 +877,14 @@ or mount points potentially requiring authentication as a different user.")
;; (setq dir nil))))
;; nil)))
-(defun locate-dominating-file (file name)
+(defun locate-dominating-file (file name &optional predicate)
"Look up the directory hierarchy from FILE for a file named NAME.
Stop at the first parent directory containing a file NAME,
and return the directory. Return nil if not found.
-This function only tests if FILE exists. If you care about whether
-it is readable, regular, etc., you should test the result."
+Optional argument PREDICATE is a function of one argument, a file.
+It should return non-nil if the file is acceptable. The default is
+`file-exists-p'; you might, e.g., want to use `file-readable-p' instead."
;; We used to use the above locate-dominating-files code, but the
;; directory-files call is very costly, so we're much better off doing
;; multiple calls using the code in here.
@@ -910,11 +911,8 @@ it is readable, regular, etc., you should test the result."
;; (setq user (nth 2 (file-attributes file)))
;; (and prev-user (not (equal user prev-user))))
(string-match locate-dominating-stop-dir-regexp file)))
- ;; FIXME? maybe this function should (optionally?)
- ;; use file-readable-p instead. In many cases, an unreadable
- ;; FILE is no better than a non-existent one.
- ;; See eg dir-locals-find-file.
- (setq try (file-exists-p (expand-file-name name file)))
+ (setq try (funcall (or predicate 'file-exists-p)
+ (expand-file-name name file)))
(cond (try (setq root file))
((equal file (setq file (file-name-directory
(directory-file-name file))))
@@ -3552,7 +3550,7 @@ across different environments and users.")
"Find the directory-local variables for FILE.
This searches upward in the directory tree from FILE.
It stops at the first directory that has been registered in
-`dir-locals-directory-cache' or contains a `dir-locals-file'.
+`dir-locals-directory-cache' or contains a readable `dir-locals-file'.
If it finds an entry in the cache, it checks that it is valid.
A cache entry with no modification time element (normally, one that
has been assigned directly using `dir-locals-set-directory-class', not
@@ -3570,17 +3568,15 @@ of no valid cache entry."
(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))
+ ;; FIXME? Is it right to silently ignore unreadable files?
+ (locals-file (locate-dominating-file file dir-locals-file-name
+ (lambda (file)
+ (and (file-readable-p file)
+ (file-regular-p file)))))
(dir-elt nil))
;; `locate-dominating-file' may have abbreviated the name.
- (and locals-file
- (setq locals-file (expand-file-name dir-locals-file-name locals-file))
- ;; FIXME? is it right to silently ignore an unreadable file?
- ;; Maybe we'd want to keep searching in that case.
- ;; That is a locate-dominating-file issue.
- (or (not (file-readable-p locals-file))
- (not (file-regular-p locals-file)))
- (setq locals-file nil))
+ (if 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))