diff lisp/vc.el @ 73445:59e895845146

(vc-switch-backend): Try to be more careful with unwanted side-effect due to mixing various backends's file properties.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 20 Oct 2006 07:58:11 +0000
parents 6d32f7f6fd3a
children e3694f1cb928 034f67f59091 7eeafaaa9eab
line wrap: on
line diff
--- a/lisp/vc.el	Fri Oct 20 07:56:20 2006 +0000
+++ b/lisp/vc.el	Fri Oct 20 07:58:11 2006 +0000
@@ -2682,25 +2682,32 @@
         (error "There is no version-controlled file in this buffer"))
     (let ((backend (vc-backend buffer-file-name))
 	  (backends nil))
-      (unless backend
-        (error "File %s is not under version control" buffer-file-name))
-      ;; Find the registered backends.
-      (dolist (backend vc-handled-backends)
-	(when (vc-call-backend backend 'registered buffer-file-name)
-	  (push backend backends)))
-      ;; Find the next backend.
-      (let ((def (car (delq backend (append (memq backend backends) backends))))
-	    (others (delete backend backends)))
-	(cond
-	 ((null others) (error "No other backend to switch to"))
-	 (current-prefix-arg
-	  (intern
-	   (upcase
-	    (completing-read
-	     (format "Switch to backend [%s]: " def)
-	     (mapcar (lambda (b) (list (downcase (symbol-name b)))) backends)
-	     nil t nil nil (downcase (symbol-name def))))))
-       (t def))))))
+      (unwind-protect
+	  (progn
+	    (unless backend
+	      (error "File %s is not under version control" buffer-file-name))
+	    ;; Find the registered backends.
+	    (dolist (backend vc-handled-backends)
+	      (when (vc-call-backend backend 'registered buffer-file-name)
+		(push backend backends)))
+	    ;; Find the next backend.
+	    (let ((def (car (delq backend
+				  (append (memq backend backends) backends))))
+		  (others (delete backend backends)))
+	      (cond
+	       ((null others) (error "No other backend to switch to"))
+	       (current-prefix-arg
+		(intern
+		 (upcase
+		  (completing-read
+		   (format "Switch to backend [%s]: " def)
+		   (mapcar (lambda (b) (list (downcase (symbol-name b)))) backends)
+		   nil t nil nil (downcase (symbol-name def))))))
+	       (t def))))
+	;; Calling the `registered' method can mess up the file
+	;; properties, so we want to revert them to what they were.
+	(if (and backend (delete backend backends))
+	    (vc-call-backend backend 'registered buffer-file-name))))))
   (unless (eq backend (vc-backend file))
     (vc-file-clearprops file)
     (vc-file-setprop file 'vc-backend backend)