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.
This commit is contained in:
parent
5fdd4046b9
commit
2afef60a03
3 changed files with 52 additions and 25 deletions
3
etc/NEWS
3
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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue