From: Chong Yidong Date: Sun, 26 Jun 2011 04:05:39 +0000 (-0400) Subject: New option for showing a diff in vc-revert (Bug#8927). X-Git-Tag: emacs-pretest-24.0.90~104^2~152^2~396 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=2afef60a03c32cd6a9db697f12d6284b2b41415a;p=emacs.git New option for showing a diff in vc-revert (Bug#8927). * 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. --- diff --git a/etc/NEWS b/etc/NEWS index ac9a49af864..5fcd8927cf1 100644 --- 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 diff --git a/lisp/ChangeLog b/lisp/ChangeLog index dd0c187759e..81f0eaa723a 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,10 @@ 2011-06-26 Chong Yidong + * 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 diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index 3809b5b4293..5e4347d2fe8 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -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)