GNU bug report logs - #908
Displaying renamed files in vc-dir for bzr is incorrect

Previous Next

Package: emacs;

Reported by: Dan Nicolaescu <dann <at> ics.uci.edu>

Date: Sun, 7 Sep 2008 10:55:04 UTC

Severity: normal

Done: Chong Yidong <cyd <at> stupidchicken.com>

Bug is archived. No further changes may be made.

Full log


Message #5 received at submit <at> emacsbugs.donarmstrong.com (full text, mbox):

From: Dan Nicolaescu <dann <at> ics.uci.edu>
To: bug-gnu-emacs <bug-gnu-emacs <at> gnu.org>
Subject: Displaying renamed files in vc-dir for bzr is incorrect
Date: Sun, 07 Sep 2008 03:46:14 -0700
When using Bzr, renamed files for are shown like this in vc-dir:

           nil     OLD_NAME => NEW_NAME

where `nil' is supposed to be the VC state and `OLD_NAME => NEW_NAME' is
believed to be a file name...

The patch below fixes this.  Not sure if this is appropriate to check in
now given the feature freeze, as the patch needs to add a feature in
order to fix the bug.  So record the fix here so that it does not get
lost.

         * vc-bzr.el (vc-bzr-extra-fileinfo): New defstruct.
	(vc-bzr-status-printer): New function.
	(vc-bzr-after-dir-status): Deal with renamed files.

Index: vc-bzr.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/vc-bzr.el,v
retrieving revision 1.65
diff -u -3 -p -u -p -r1.65 vc-bzr.el
--- vc-bzr.el	10 Aug 2008 19:48:57 -0000	1.65
+++ vc-bzr.el	7 Sep 2008 10:36:07 -0000
@@ -52,7 +52,8 @@
 
 (eval-when-compile
   (require 'cl)
-  (require 'vc))                        ; for vc-exec-after
+  (require 'vc)  ; for vc-exec-after
+  (require 'vc-dir))
 
 ;; Clear up the cache to force vc-call to check again and discover
 ;; new functions when we reload this file.
@@ -576,6 +577,22 @@ stream.  Standard error output is discar
     ;; else fall back to default vc.el representation
     (vc-default-prettify-state-info 'Bzr file)))
 
+(defstruct (vc-bzr-extra-fileinfo
+            (:copier nil)
+            (:constructor vc-bzr-create-extra-fileinfo (extra-name))
+            (:conc-name vc-bzr-extra-fileinfo->))
+  extra-name)         ;; original name for rename targets, new name for
+
+(defun vc-bzr-status-printer (info)
+  "Pretty-printer for the vc-dir-fileinfo structure."
+  (let ((extra (vc-dir-fileinfo->extra info)))
+    (vc-default-status-printer 'Bzr info)
+    (when extra
+      (insert (propertize
+	       (format "   (renamed from %s)"
+		       (vc-bzr-extra-fileinfo->extra-name extra))
+	       'face 'font-lock-comment-face)))))
+
 ;; FIXME: this needs testing, it's probably incomplete.
 (defun vc-bzr-after-dir-status (update-function)
   (let ((status-str nil)
@@ -589,6 +606,9 @@ stream.  Standard error output is discar
                        ;; For conflicts, should we list the .THIS/.BASE/.OTHER?
 		       ("C  " . conflict)
 		       ("?  " . unregistered)
+		       ("?  " . unregistered)
+		       ;; No such state, but we need to distinguish this case.
+		       ("R  " . renamed)
                        ;; Ignore "P " and "P." for pending patches.
                        ))
 	(translated nil)
@@ -598,23 +618,31 @@ stream.  Standard error output is discar
 	(setq status-str
 	      (buffer-substring-no-properties (point) (+ (point) 3)))
 	(setq translated (cdr (assoc status-str translation)))
-	;; For conflicts the file appears twice in the listing: once
-	;; with the M flag and once with the C flag, so take care not
-	;; to add it twice to `result'.  Ugly.
-	(if (eq translated 'conflict)
-	    (let* ((file
-		    (buffer-substring-no-properties
-		     ;;For files with conflicts the format is:
-		     ;;C   Text conflict in FILENAME
-		     ;; Bah.
-		     (+ (point) 21) (line-end-position)))
-		   (entry (assoc file result)))
-	      (when entry
-		(setf (nth 1 entry) 'conflict)))
+	(cond
+	 ((eq translated 'conflict)
+	  ;; For conflicts the file appears twice in the listing: once
+	  ;; with the M flag and once with the C flag, so take care
+	  ;; not to add it twice to `result'.  Ugly.
+	  (let* ((file
+		  (buffer-substring-no-properties
+		   ;;For files with conflicts the format is:
+		   ;;C   Text conflict in FILENAME
+		   ;; Bah.
+		   (+ (point) 21) (line-end-position)))
+		 (entry (assoc file result)))
+	    (when entry
+	      (setf (nth 1 entry) 'conflict))))
+	 ((eq translated 'renamed)
+	  (re-search-forward "R   \\(.*\\) => \\(.*\\)$" (line-end-position) t)
+	  (let ((new-name (match-string 2))
+		(old-name (match-string 1)))
+	    (push (list new-name 'edited
+		      (vc-bzr-create-extra-fileinfo old-name)) result)))
+	 (t
 	  (push (list (buffer-substring-no-properties
 		       (+ (point) 4)
 		       (line-end-position))
-		      translated) result))
+		      translated) result)))
 	(forward-line))
       (funcall update-function result)))
 






This bug report was last modified 16 years and 257 days ago.

Previous Next


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