]> git.eshelyaron.com Git - emacs.git/commitdiff
Support VC revisions in diff-goto-source (bug#33319)
authorJuri Linkov <juri@linkov.net>
Wed, 14 Nov 2018 00:14:52 +0000 (02:14 +0200)
committerJuri Linkov <juri@linkov.net>
Wed, 14 Nov 2018 00:14:52 +0000 (02:14 +0200)
* lisp/vc/diff-mode.el (diff-vc-revisions): New defvar.
(diff-find-source-location): Call vc-find-revision for
non-nil values of 'other', diff-vc-backend, diff-vc-revisions.

* lisp/vc/vc.el (vc-diff-internal): Set buffer-local
diff-vc-revisions to the list of used revisions.

* doc/emacs/files.texi (Diff Mode): Update diff-goto-source
for VC-related prefix argument.

doc/emacs/files.texi
etc/NEWS
lisp/vc/diff-mode.el
lisp/vc/vc.el

index 649fa8bcb4d6e271d3e7c06ebbf85bb524373aff..b47be51e24cf6a4a5342d88d2e7cf00767a39ab3 100644 (file)
@@ -1530,6 +1530,10 @@ default jumps to the ``old'' file, and the meaning of the prefix
 argument is reversed.  If the prefix argument is a number greater than
 8 (e.g., if you type @kbd{C-u C-u C-c C-c}), then this command also
 sets @code{diff-jump-to-old-file} for the next invocation.
+If the source file is under version control (@pxref{Version Control}),
+this jumps to the work file by default.  With a prefix argument, jump
+to the ``old'' revision of the file (@pxref{Old Revisions}), when
+point is on the old line, or otherwise jump to the ``new'' revision.
 
 @item C-c C-e
 @findex diff-ediff-patch
index 2f07abb4eb552f31f8e872c03fcea2c55b490e76..2a2010e9d36c5a2d527f8763c7358821cd17aa8d 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -368,6 +368,10 @@ To disable it, set the new defcustom 'diff-font-lock-refine' to nil.
 *** File headers can be shortened, mimicking Magit's diff format.
 To enable it, set the new defcustom 'diff-font-lock-prettify to t.
 
+*** Prefix arg of 'diff-goto-source' means jump to the old revision
+of the file under version control if point is on an old changed line,
+or to the new revision of the file otherwise.
+
 ** Browse-url
 
 *** The function 'browse-url-emacs' can now visit a URL in selected window.
index cf5236850862fbe24e746004e2455bbde95cc5bb..8539423eed5024f0819fd1f3f1a575cf32caf05c 100644 (file)
@@ -55,6 +55,7 @@
 ;;; Code:
 (eval-when-compile (require 'cl-lib))
 
+(autoload 'vc-find-revision "vc")
 (defvar add-log-buffer-file-name-function)
 
 
@@ -104,6 +105,9 @@ when editing big diffs)."
 (defvar diff-vc-backend nil
   "The VC backend that created the current Diff buffer, if any.")
 
+(defvar diff-vc-revisions nil
+  "The VC revisions compared in the current Diff buffer, if any.")
+
 (defvar diff-outline-regexp
   "\\([*+][*+][*+] [^0-9]\\|@@ ...\\|\\*\\*\\* [0-9].\\|--- [0-9]..\\)")
 
@@ -1736,7 +1740,11 @@ NOPROMPT, if non-nil, means not to prompt the user."
                       (match-string 1)))))
           (file (or (diff-find-file-name other noprompt)
                      (error "Can't find the file")))
-          (buf (find-file-noselect file)))
+          (revision (and other diff-vc-backend
+                          (nth (if reverse 1 0) diff-vc-revisions)))
+          (buf (if revision
+                    (vc-find-revision file revision diff-vc-backend)
+                  (find-file-noselect file))))
       ;; Update the user preference if he so wished.
       (when (> (prefix-numeric-value other-file) 8)
        (setq diff-jump-to-old-file other))
@@ -1862,7 +1870,11 @@ With a prefix argument, try to REVERSE the hunk."
 `diff-jump-to-old-file' (or its opposite if the OTHER-FILE prefix arg
 is given) determines whether to jump to the old or the new file.
 If the prefix arg is bigger than 8 (for example with \\[universal-argument] \\[universal-argument])
-then `diff-jump-to-old-file' is also set, for the next invocations."
+then `diff-jump-to-old-file' is also set, for the next invocations.
+
+Under version control, the OTHER-FILE prefix arg means jump to the old
+revision of the file if point is on an old changed line, or to the new
+revision of the file otherwise."
   (interactive (list current-prefix-arg last-input-event))
   ;; When pointing at a removal line, we probably want to jump to
   ;; the old location, and else to the new (i.e. as if reverting).
index dcfbf26e86704b2d1e4f120d444727906c6f34d0..6b7ca02440d8b660baf38ae30462b049d12b866f 100644 (file)
@@ -987,6 +987,7 @@ Within directories, only files already under version control are noticed."
 (defvar log-view-vc-backend)
 (defvar log-edit-vc-backend)
 (defvar diff-vc-backend)
+(defvar diff-vc-revisions)
 
 (defun vc-deduce-backend ()
   (cond ((derived-mode-p 'vc-dir-mode)   vc-dir-backend)
@@ -1728,6 +1729,7 @@ Return t if the buffer had changes, nil otherwise."
     (set-buffer buffer)
     (diff-mode)
     (set (make-local-variable 'diff-vc-backend) (car vc-fileset))
+    (set (make-local-variable 'diff-vc-revisions) (list rev1 rev2))
     (set (make-local-variable 'revert-buffer-function)
         (lambda (_ignore-auto _noconfirm)
            (vc-diff-internal async vc-fileset rev1 rev2 verbose)))