changeset 80132:bbd6defe1e72

(vc-find-root): Remove initial loop because it's not careful enough. Detect the uid-change all within the main loop.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sat, 16 Feb 2008 21:38:24 +0000
parents 684473b333ab
children 86666002b78d
files lisp/ChangeLog lisp/vc-hooks.el
diffstat 2 files changed, 12 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Sat Feb 16 20:21:16 2008 +0000
+++ b/lisp/ChangeLog	Sat Feb 16 21:38:24 2008 +0000
@@ -1,3 +1,8 @@
+2008-02-16  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* vc-hooks.el (vc-find-root): Remove initial loop because it's not
+	careful enough.  Detect the uid-change all within the main loop.
+
 2008-02-14  Stefan Monnier  <monnier@pastel.home>
 
 	* textmodes/sgml-mode.el (sgml-mode): Fix comment syntax.
--- a/lisp/vc-hooks.el	Sat Feb 16 20:21:16 2008 +0000
+++ b/lisp/vc-hooks.el	Sat Feb 16 21:38:24 2008 +0000
@@ -316,11 +316,12 @@
 If WITNESS if not found, return nil, otherwise return the root."
   ;; Represent /home/luser/foo as ~/foo so that we don't try to look for
   ;; witnesses in /home or in /.
-  (while (not (file-directory-p file))
-    (setq file (file-name-directory (directory-file-name file))))
   (setq file (abbreviate-file-name file))
   (let ((root nil)
-        (user (nth 2 (file-attributes file))))
+        ;; `user' is not initialized outside the loop because
+        ;; `file' may not exist, so we may have to walk up part of the
+        ;; hierarchy before we find the "initial UID".
+        (user nil))
     (while (not (or root
                     (null file)
                     ;; As a heuristic, we stop looking up the hierarchy of
@@ -328,7 +329,9 @@
                     ;; 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.
-                    (not (equal user (nth 2 (file-attributes file))))
+                    (let ((prev-user user))
+                      (setq user (nth 2 (file-attributes file)))
+                      (and prev-user (not (equal user prev-user))))
                     (string-match vc-ignore-dir-regexp file)))
       (if (file-exists-p (expand-file-name witness file))
           (setq root file)