diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ee073bc..5473538 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2008-07-04 Justin Bogner + + * vc-hooks.el (vc-find-root): + Find the directory when using invert, not the file itself. + 2008-07-04 Dan Nicolaescu * vc-dir.el (vc-dir-query-replace-regexp): New function. diff --git a/lisp/vc-hooks.el b/lisp/vc-hooks.el index 2ccbdcc..0662961 100644 --- a/lisp/vc-hooks.el +++ b/lisp/vc-hooks.el @@ -327,39 +327,46 @@ The function walks up the directory tree from FILE looking for WITNESS. If WITNESS if not found, return nil, otherwise return the root. Optional arg INVERT non-nil reverses the sense of the check; the root is the last directory for which WITNESS *is* found." - ;; Represent /home/luser/foo as ~/foo so that we don't try to look for - ;; witnesses in /home or in /. - (setq file (abbreviate-file-name file)) - (let ((root nil) - (prev-file 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) - try) - (while (not (or root - (null file) - ;; 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))) - (and prev-user (not (equal user prev-user)))) - (string-match vc-ignore-dir-regexp file))) - (setq try (file-exists-p (expand-file-name witness file))) - (cond ((and invert (not try)) (setq root prev-file)) - ((and (not invert) try) (setq root file)) - ((equal file (setq prev-file file - file (file-name-directory - (directory-file-name file)))) - (setq file nil)))) - ;; Handle the case where ~/WITNESS exists and the original FILE is "~". - ;; (This occurs, for example, when placing dotfiles under RCS.) - (when (and (not root) invert prev-file) - (setq root prev-file)) - root)) + (when (not (file-directory-p file)) + (setq file (file-name-directory file))) + ;; In the invert case, we should return nil if WITNESS doesn't exist + ;; in the first place. + (if (and invert + (not (file-exists-p (expand-file-name witness file)))) + nil + ;; Represent /home/luser/foo as ~/foo so that we don't try to look for + ;; witnesses in /home or in /. + (setq file (abbreviate-file-name file)) + (let ((root nil) + (prev-file 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) + try) + (while (not (or root + (null file) + ;; 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))) + (and prev-user (not (equal user prev-user)))) + (string-match vc-ignore-dir-regexp file))) + (setq try (file-exists-p (expand-file-name witness file))) + (cond ((and invert (not try)) (setq root prev-file)) + ((and (not invert) try) (setq root file)) + ((equal file (setq prev-file file + file (file-name-directory + (directory-file-name file)))) + (setq file nil)))) + ;; Handle the case where ~/WITNESS exists and the original FILE is "~". + ;; (This occurs, for example, when placing dotfiles under RCS.) + (when (and (not root) invert prev-file) + (setq root prev-file)) + root))) ;; Access functions to file properties ;; (Properties should be _set_ using vc-file-setprop, but