GNU bug report logs - #3224
23.0.92; vc-dir vs uniquify: wrong directory used

Previous Next

Package: emacs;

Reported by: Magnus Henoch <mange <at> freemail.hu>

Date: Tue, 5 May 2009 15:25:06 UTC

Severity: normal

Merged with 4553, 6672

Found in version 23.1

Done: Juanma Barranquero <lekktu <at> gmail.com>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Juanma Barranquero <lekktu <at> gmail.com>
To: Dan Nicolaescu <dann <at> ics.uci.edu>
Cc: Magnus Henoch <mange <at> freemail.hu>, 3224 <at> debbugs.gnu.org
Subject: bug#3224: 23.0.92; vc-dir vs uniquify: wrong directory used
Date: Wed, 6 Jan 2010 05:00:38 +0100
On Tue, Aug 4, 2009 at 13:30, Dan Nicolaescu <dann <at> ics.uci.edu> wrote:

> I am not familiar with uniquify, but after binding default-directory in
> vc-dir-prepare-status-buffer, I get the result above.
> And it is identical to what happens when doing:
>
>
> (progn
>  (require 'uniquify)
>  (setq uniquify-buffer-name-style 'post-forward)
>  (cd "/tmp")
>  (make-directory "foo")
>  (make-directory "bar")
>  (cd "/tmp/foo")
>  (create-file-buffer "*vc-dir*")
>  (cd "/tmp/bar")
>  (create-file-buffer "*vc-dir*"))

In fact, I think the two problems are not exactly the same, though
they are related. If my analysis, and the following patch, are
correct, Dan's example is caused by a bug in
`uniquify-rationalize-file-buffer-names', which sometimes, while
trying to refresh the dirname of a candidate, fails to check that it
is setting it to nil. Fixing that problem makes Dan's example to work,
but Magnus' vc-dir example still fails.

The reason of the other bug is twofold:

On one hand, vc-dir (specifically `vc-dir-prepare-status-buffer') is
calling `create-file-buffer' passing "*vc-dir*" to it; but that
function expects to be passed a filename; in this case, the difference
is relevant because uniquify tries to use that filename's directory
information to decide the dirname for the candidates.

On the other hand, `uniquify-buffer-file-name' should return a
directory, but fails to deal with the case that the "filename" is
already a directory (which can happen, for example, when it is getting
this "filename" from `list-buffers-directory'). In this case it should
just remove any trailing slash and pass it back unscathed.

Please, try the attached patch to see whether it helps.

Thanks,

    Juanma



2010-01-06  Juanma Barranquero  <lekktu <at> gmail.com>

	Bug#3224
	
	* uniquify.el (uniquify-rationalize-file-buffer-names):
	Don't set uniquify-item-dirname to nil.
	(uniquify-buffer-file-name): If the "filename" is already a directory
	name, do not modify it.

	* vc-dir.el (vc-dir-prepare-status-buffer): Pass a (fake) filename
	to `create-file-buffer' as it expects, not just a buffer name.



=== modified file 'lisp/uniquify.el'
--- lisp/uniquify.el	2010-01-04 05:35:18 +0000
+++ lisp/uniquify.el	2010-01-06 03:22:51 +0000
@@ -232,9 +232,9 @@
 	    ;; of code like in set-visited-file-name:
 	    ;; (or (string= new-name (buffer-name)) (rename-buffer new-name t))
 	    ;; So we need to refresh the dirname of the uniquify-item.
-	    (setf (uniquify-item-dirname (car items))
-		  (uniquify-buffer-file-name
-		   (uniquify-item-buffer (car items))))
+	    (let ((bfn (uniquify-buffer-file-name (uniquify-item-buffer (car
items)))))
+	      (when bfn
+		(setf (uniquify-item-dirname (car items)) bfn)))
 	    ;; This shouldn't happen, but maybe there's no dirname any more.
 	    (unless (uniquify-item-dirname (car items))
 	      (with-current-buffer (uniquify-item-buffer (car items))
@@ -265,9 +265,11 @@
 		   list-buffers-directory))))
       (when filename
 	(directory-file-name
-	 (file-name-directory
-	  (expand-file-name
-	   (directory-file-name filename))))))))
+	 (if (file-directory-p filename)
+	     (file-name-as-directory filename)
+	   (file-name-directory
+	    (expand-file-name
+	     (directory-file-name filename)))))))))

 (defun uniquify-rerationalize-w/o-cb (fix-list)
   "Re-rationalize the buffers in FIX-LIST, but ignoring `current-buffer'."

=== modified file 'lisp/vc-dir.el'
--- lisp/vc-dir.el	2009-12-05 00:24:03 +0000
+++ lisp/vc-dir.el	2010-01-06 03:26:33 +0000
@@ -101,7 +101,7 @@
                       (return buffer))))))))
     (or buf
         ;; Create a new buffer named BNAME.
-        (with-current-buffer (create-file-buffer bname)
+        (with-current-buffer (create-file-buffer (expand-file-name bname dir))
           (cd dir)
           (vc-setup-buffer (current-buffer))
           ;; Reset the vc-parent-buffer-name so that it does not appear




This bug report was last modified 15 years ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.