diff lisp/vc-dispatcher.el @ 94650:276c5ce56449

Move the fileset staleness check from vc-next-action to vc-dispatcher-selection-set.
author Eric S. Raymond <esr@snark.thyrsus.com>
date Tue, 06 May 2008 00:37:31 +0000
parents d0547efd97db
children 3a091c58b092
line wrap: on
line diff
--- a/lisp/vc-dispatcher.el	Mon May 05 22:50:58 2008 +0000
+++ b/lisp/vc-dispatcher.el	Tue May 06 00:37:31 2008 +0000
@@ -1602,6 +1602,16 @@
 
 (put 'vc-dir-mode 'mode-class 'special)
 
+(defun vc-buffer-sync (&optional not-urgent)
+  "Make sure the current buffer and its working file are in sync.
+NOT-URGENT means it is ok to continue if the user says not to save."
+  (when (buffer-modified-p)
+    (if (or vc-suppress-confirm
+	    (y-or-n-p (format "Buffer %s modified; save it? " (buffer-name))))
+	(save-buffer)
+      (unless not-urgent
+	(error "Aborted")))))
+
 (defun vc-dispatcher-browsing ()
   "Are we in a directory browser buffer?"
   (or vc-dired-mode (eq major-mode 'vc-dir-mode)))
@@ -1623,6 +1633,7 @@
 return the list of VC files in those directories instead of
 the directories themselves.
 Otherwise, throw an error."
+  (let ((files
     (cond
      ;; Browsing with dired
      (vc-dired-mode
@@ -1668,7 +1679,33 @@
      ((and allow-ineligible (not (eligible buffer-file-name)))
       (list buffer-file-name))
      ;; No good set here, throw error
-     (t (error "No fileset is available here."))))
+     (t (error "No fileset is available here.")))))
+    ;; We assume, in order to avoid unpleasant surprises to the user, 
+    ;; that a fileset is not in good shape to be handed to the user if the  
+    ;; buffers visting the fileset don't match the on-disk contents.
+    (dolist (file files)
+      (let ((visited (get-file-buffer file)))
+	(when visited
+	  (if (or vc-dired-mode (eq major-mode 'vc-dir-mode))
+	      (switch-to-buffer-other-window visited)
+	    (set-buffer visited))
+	  ;; Check relation of buffer and file, and make sure
+	  ;; user knows what he's doing.  First, finding the file
+	  ;; will check whether the file on disk is newer.
+	  ;; Ignore buffer-read-only during this test, and
+	  ;; preserve find-file-literally.
+	  (let ((buffer-read-only (not (file-writable-p file))))
+	    (find-file-noselect file nil find-file-literally))
+	  (if (not (verify-visited-file-modtime (current-buffer)))
+	      (if (yes-or-no-p (format "Replace %s on disk with buffer contents? " file))
+		  (write-file buffer-file-name)
+		(error "Aborted"))
+	    ;; Now, check if we have unsaved changes.
+	    (vc-buffer-sync t)
+	    (when (buffer-modified-p)
+	      (or (y-or-n-p (message "Use %s on disk, keeping modified buffer? " file))
+		  (error "Aborted")))))))
+    files))
 
 ;; arch-tag: 7d08b17f-5470-4799-914b-bfb9fcf6a246
 ;;; vc-dispatcher.el ends here