[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[patch] vc-find-root with invert
From: |
Justin Bogner |
Subject: |
[patch] vc-find-root with invert |
Date: |
Fri, 04 Jul 2008 11:47:51 -0600 |
User-agent: |
Thunderbird 2.0.0.14 (X11/20080505) |
Here's a patch that fixes a bug I've noticed in vc-find-root. When
called with `invert' equal to `t', the current implementation is
returning `file' verbatim if a file name is given, and also if `witness'
doesn't exist at all.
In the former case we should return the directory where witness resides,
and in the latter, `nil'. This patch implements such behaviour.
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 <address@hidden>
+
+ * vc-hooks.el (vc-find-root):
+ Find the directory when using invert, not the file itself.
+
2008-07-04 Dan Nicolaescu <address@hidden>
* 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
- Re: [patch] vc-find-root with invert, (continued)
- Re: [patch] vc-find-root with invert, tomas, 2008/07/05
- Re: [patch] vc-find-root with invert, Justin Bogner, 2008/07/21
- Re: [patch] vc-find-root with invert, Stefan Monnier, 2008/07/21
- Re: [patch] vc-find-root with invert, Justin Bogner, 2008/07/21
- Re: [patch] vc-find-root with invert, David Kastrup, 2008/07/21
- Re: [patch] vc-find-root with invert, Justin Bogner, 2008/07/21
- Re: [patch] vc-find-root with invert, David Kastrup, 2008/07/21
- Re: [patch] vc-find-root with invert, Justin Bogner, 2008/07/23
- Re: [patch] vc-find-root with invert, Stefan Monnier, 2008/07/23
- Re: [patch] vc-find-root with invert, Stefan Monnier, 2008/07/21
[patch] vc-find-root with invert,
Justin Bogner <=