(locate-dominating-file): New function.
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 19 Jul 2007 03:29:47 +0000 (03:29 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 19 Jul 2007 03:29:47 +0000 (03:29 +0000)
lisp/ChangeLog
lisp/files.el

index f8a3826..daa0bbb 100644 (file)
@@ -1,3 +1,7 @@
+2007-07-19  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * files.el (locate-dominating-file): New function.
+
 2007-07-18  Michael Albinus  <michael.albinus@gmx.de>
 
        * progmodes/grep.el (grep-host-defaults-alist): New defvar.
@@ -13,6 +17,7 @@
        files.  Change two keybindings to point to new function names.
 
 2007-07-18  Juanma Barranquero  <lekktu@gmail.com>
+
        * follow.el (follow-mode-hook, follow-mode-off-hook, follow-mode)
        (follow-delete-other-windows-and-split, follow-recenter)
        (follow-windows-aligned-p, follow-point-visible-all-windows-p)
index ed76e16..631e75f 100644 (file)
@@ -711,6 +711,24 @@ PATH-AND-SUFFIXES is a pair of lists, (DIRECTORIES . SUFFIXES)."
        ((null action) (try-completion string names))
        (t (test-completion string names))))))
 
+(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)))
+          ;; Abbreviate, so as to stop when we cross ~/.
+          (dir (abbreviate-file-name (file-name-as-directory file)))
+          files)
+      (while (and dir (equal user (nth 2 (file-attributes dir))))
+        (if (setq files (directory-files dir 'full regexp))
+            (throw 'found (car files))
+          (if (equal dir
+                     (setq dir (file-name-directory
+                                (directory-file-name dir))))
+              (setq dir nil))))
+      nil)))
+
 (defun executable-find (command)
   "Search for COMMAND in `exec-path' and return the absolute file name.
 Return nil if COMMAND is not found anywhere in `exec-path'."