]> git.eshelyaron.com Git - emacs.git/commitdiff
(locate-dominating-file): Remove initial loop because it's
authorStefan Monnier <monnier@iro.umontreal.ca>
Sat, 16 Feb 2008 21:39:31 +0000 (21:39 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sat, 16 Feb 2008 21:39:31 +0000 (21:39 +0000)
not careful enough.  Detect the uid-change all within the main loop.

lisp/ChangeLog
lisp/files.el

index 5d565c9015e8705522273ba1dfb2faf554db71ba..08664b7b3460cb2110735e9021456ed2184f7c7d 100644 (file)
@@ -1,3 +1,8 @@
+2008-02-16  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * files.el (locate-dominating-file): Remove initial loop because it's
+       not careful enough.  Detect the uid-change all within the main loop.
+
 2008-02-16  Lawrence Mitchell  <wence@gmx.li>  (tiny change)
 
        * ielm.el (ielm-is-whitespace-or-comment): Docstring fix.
index ffa8e0a328f512ef5d3cc5a82a00aacae1963537..82f190a013f17de74478c99a11df1782c077f9a7 100644 (file)
@@ -727,18 +727,22 @@ PATH-AND-SUFFIXES is a pair of lists, (DIRECTORIES . SUFFIXES)."
 
 (defun locate-dominating-file (file regexp)
   "Look up the directory hierarchy from FILE for a file matching REGEXP."
-  (while (and file (not (file-directory-p file)))
-    (setq file (file-name-directory (directory-file-name file))))
   (catch 'found
-    (let ((user (nth 2 (file-attributes file)))
+    ;; `user' is not initialized yet because `file' may not exist, so we may
+    ;; have to walk up part of the hierarchy before we find the "initial UID".
+    (let ((user nil)
           ;; Abbreviate, so as to stop when we cross ~/.
           (dir (abbreviate-file-name (file-name-as-directory file)))
           files)
-      ;; As a heuristic, we stop looking up the hierarchy of directories as
-      ;; soon as we find a directory belonging to another user.  This should
-      ;; save us from looking in things like /net and /afs.  This assumes
-      ;; that all the files inside a project belong to the same user.
-      (while (and dir (equal user (nth 2 (file-attributes dir))))
+      (while (and dir
+                  ;; As a heuristic, we stop looking up the hierarchy of
+                  ;; directories as soon as we find a directory belonging to
+                  ;; another user.  This should save us from looking in
+                  ;; things like /net and /afs.  This assumes that all the
+                  ;; files inside a project belong to the same user.
+                  (let ((prev-user user))
+                    (setq user (nth 2 (file-attributes file)))
+                    (not (or (null prev-user) (equal user prev-user)))))
         (if (setq files (directory-files dir 'full regexp))
             (throw 'found (car files))
           (if (equal dir