]> git.eshelyaron.com Git - emacs.git/commitdiff
New option for showing a diff in vc-revert (Bug#8927).
authorChong Yidong <cyd@stupidchicken.com>
Sun, 26 Jun 2011 04:05:39 +0000 (00:05 -0400)
committerChong Yidong <cyd@stupidchicken.com>
Sun, 26 Jun 2011 04:05:39 +0000 (00:05 -0400)
* vc/vc.el (vc-revert-show-diff): New defcustom.
(vc-diff-internal): New arg specifying diff buffer.
(vc-revert): Obey vc-revert-show-diff.  If we show a diff, don't
reuse an existing *vc-diff* buffer.

etc/NEWS
lisp/ChangeLog
lisp/vc/vc.el

index ac9a49af864bdc75bda4d2f2d26be14751e61e3d..5fcd8927cf1671e5556d64baddbd4463cdaae170 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -787,6 +787,9 @@ the user for specifics, e.g. a merge source.
 
 **** Currently supported for Bzr, Git, and Mercurial.
 
+*** New option `vc-revert-show-diff' controls whether `vc-revert'
+shows a diff while querying the user.  It defaults to nil.
+
 *** Log entries in some Log View buffers can be toggled to display a
 longer description by typing RET (log-view-toggle-entry-display).
 In the Log View buffers made by `C-x v L' (vc-print-root-log), you can
index dd0c187759eb99ec5d08d85cd026722e673b6d2d..81f0eaa723ac6ca2cce90ea0c15e23ef4e12e269 100644 (file)
@@ -1,5 +1,10 @@
 2011-06-26  Chong Yidong  <cyd@stupidchicken.com>
 
+       * vc/vc.el (vc-revert-show-diff): New defcustom.
+       (vc-diff-internal): New arg specifying diff buffer.
+       (vc-revert): Obey vc-revert-show-diff.  If we show a diff, don't
+       reuse an existing *vc-diff* buffer (Bug#8927).
+
        * progmodes/cperl-mode.el (cperl-mode): Derive from prog-mode.
 
 2011-06-26  Glenn Morris  <rgm@gnu.org>
index 3809b5b429374a9de04fca9ffcc815a6ee30812c..5e4347d2fe87bffa91560305b94c0f59fa861acd 100644 (file)
@@ -775,6 +775,12 @@ See `run-hooks'."
   :type 'hook
   :group 'vc)
 
+(defcustom vc-revert-show-diff nil
+  "If non-nil, `vc-revert' shows a `vc-diff' buffer before querying."
+  :type 'boolean
+  :group 'vc
+  :version "24.1")
+
 ;; Header-insertion hair
 
 (defcustom vc-static-header-alist
@@ -1534,10 +1540,13 @@ to override the value of `vc-diff-switches' and `diff-switches'."
 (defvar vc-diff-added-files nil
   "If non-nil, diff added files by comparing them to /dev/null.")
 
-(defun vc-diff-internal (async vc-fileset rev1 rev2 &optional verbose)
+(defun vc-diff-internal (async vc-fileset rev1 rev2 &optional verbose buffer)
   "Report diffs between two revisions of a fileset.
-Diff output goes to the *vc-diff* buffer.  The function
-returns t if the buffer had changes, nil otherwise."
+Output goes to the buffer BUFFER, which defaults to *vc-diff*.
+BUFFER, if non-nil, should be a buffer or a buffer name.
+Return t if the buffer had changes, nil otherwise."
+  (unless buffer
+    (setq buffer "*vc-diff*"))
   (let* ((files (cadr vc-fileset))
         (messages (cons (format "Finding changes in %s..."
                                  (vc-delistify files))
@@ -1549,7 +1558,7 @@ returns t if the buffer had changes, nil otherwise."
         ;; be to call the back end separately for each file.
         (coding-system-for-read
          (if files (vc-coding-system-for-diff (car files)) 'undecided)))
-    (vc-setup-buffer "*vc-diff*")
+    (vc-setup-buffer buffer)
     (message "%s" (car messages))
     ;; Many backends don't handle well the case of a file that has been
     ;; added but not yet committed to the repo (notably CVS and Subversion).
@@ -1574,13 +1583,13 @@ returns t if the buffer had changes, nil otherwise."
                 (error "No revisions of %s exist" file)
               ;; We regard this as "changed".
               ;; Diff it against /dev/null.
-              (apply 'vc-do-command "*vc-diff*"
+              (apply 'vc-do-command buffer
                      1 "diff" file
                      (append (vc-switches nil 'diff) '("/dev/null"))))))
         (setq files (nreverse filtered))))
     (let ((vc-disable-async-diff (not async)))
-      (vc-call-backend (car vc-fileset) 'diff files rev1 rev2 "*vc-diff*"))
-    (set-buffer "*vc-diff*")
+      (vc-call-backend (car vc-fileset) 'diff files rev1 rev2 buffer))
+    (set-buffer buffer)
     (if (and (zerop (buffer-size))
              (not (get-buffer-process (current-buffer))))
         ;; Treat this case specially so as not to pop the buffer.
@@ -2256,11 +2265,12 @@ This asks for confirmation if the buffer contents are not identical
 to the working revision (except for keyword expansion)."
   (interactive)
   (let* ((vc-fileset (vc-deduce-fileset))
-        (files (cadr vc-fileset)))
-    ;; If any of the files is visited by the current buffer, make
-    ;; sure buffer is saved.  If the user says `no', abort since
-    ;; we cannot show the changes and ask for confirmation to
-    ;; discard them.
+        (files (cadr vc-fileset))
+        (queried nil)
+        diff-buffer)
+    ;; If any of the files is visited by the current buffer, make sure
+    ;; buffer is saved.  If the user says `no', abort since we cannot
+    ;; show the changes and ask for confirmation to discard them.
     (when (or (not files) (memq (buffer-file-name) files))
       (vc-buffer-sync nil))
     (dolist (file files)
@@ -2268,20 +2278,29 @@ to the working revision (except for keyword expansion)."
        (when (and buf (buffer-modified-p buf))
          (error "Please kill or save all modified buffers before reverting")))
       (when (vc-up-to-date-p file)
-       (unless (yes-or-no-p (format "%s seems up-to-date.  Revert anyway? " file))
+       (if (yes-or-no-p (format "%s seems up-to-date.  Revert anyway? " file))
+           (setq queried t)
          (error "Revert canceled"))))
-    (when (vc-diff-internal vc-allow-async-revert vc-fileset nil nil)
-      (unless (yes-or-no-p
-              (format "Discard changes in %s? "
-                      (let ((str (vc-delistify files))
-                            (nfiles (length files)))
-                        (if (< (length str) 50)
-                            str
-                          (format "%d file%s" nfiles
-                                  (if (= nfiles 1) "" "s"))))))
-       (error "Revert canceled"))
-      (delete-windows-on "*vc-diff*")
-      (kill-buffer "*vc-diff*"))
+    (unwind-protect
+       (when (if vc-revert-show-diff
+                 (progn
+                   (setq diff-buffer (generate-new-buffer-name "*vc-diff*"))
+                   (vc-diff-internal vc-allow-async-revert vc-fileset
+                                     nil nil nil diff-buffer))
+               ;; Avoid querying the user again.
+               (null queried))
+         (unless (yes-or-no-p
+                  (format "Discard changes in %s? "
+                          (let ((str (vc-delistify files))
+                                (nfiles (length files)))
+                            (if (< (length str) 50)
+                                str
+                              (format "%d file%s" nfiles
+                                      (if (= nfiles 1) "" "s"))))))
+           (error "Revert canceled")))
+      (when diff-buffer
+       (delete-windows-on diff-buffer)
+       (kill-buffer diff-buffer)))
     (dolist (file files)
       (message "Reverting %s..." (vc-delistify files))
       (vc-revert-file file)