Subject: bug#15322: VC log buffer scrolls itself

From: Dmitry Gutov <[email-masked]>
Date: Sun, 3 May 2015 18:58:35 +0300

On 05/03/2015 05:34 PM, Eli Zaretskii wrote:

> I don't think it's a good idea to have in the code comments that only
> mention the bug number, without also trying to explain the reason(s)
> for what the code does.

Okay. That exact piece of code should be self-evident, but I've added 
some words else where, as well as the bug reference anyway.

 > If it's possible to write a clear and concise> explanation, you don't 
even need to mention the bug number.

The surrounding code is pretty hairy, so might be possible to regress by 
accident. This way, someone changing it would look at the bug first.

diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index bb4dd60..1a997a4 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -2224,8 +2224,10 @@ earlier revisions.  Show up to LIMIT entries 
(non-nil means unlimited)."
         (lambda (_bk _files-arg ret)
  	 (vc-print-log-setup-buttons working-revision
  				     is-start-revision limit ret))
-       (lambda (bk)
-	 (vc-call-backend bk 'show-log-entry working-revision))
+       ;; When it's nil, point really shouldn't move (bug#15322).
+       (when working-revision
+         (lambda (bk)
+           (vc-call-backend bk 'show-log-entry working-revision)))
         (lambda (_ignore-auto _noconfirm)
  	 (vc-print-log-internal backend files working-revision
                                is-start-revision limit)))))
@@ -2263,8 +2265,9 @@ earlier revisions.  Show up to LIMIT entries 
(non-nil means unlimited)."
       (let ((inhibit-read-only t))
         (funcall setup-buttons-func backend files retval)
         (shrink-window-if-larger-than-buffer)
-       (funcall goto-location-func backend)
-       (setq vc-sentinel-movepoint (point))
+       (when goto-location-func
+         (funcall goto-location-func backend)
+         (setq vc-sentinel-movepoint (point)))
         (set-buffer-modified-p nil)))))

  (defun vc-incoming-outgoing-internal (backend remote-location 
buffer-name type)
@@ -2273,7 +2276,7 @@ earlier revisions.  Show up to LIMIT entries 
(non-nil means unlimited)."
     (lambda (bk buf type-arg _files)
       (vc-call-backend bk type-arg buf remote-location))
     (lambda (_bk _files-arg _ret) nil)
-   (lambda (_bk) (goto-char (point-min)))
+   nil ;; Don't move point.
     (lambda (_ignore-auto _noconfirm)
       (vc-incoming-outgoing-internal backend remote-location 
buffer-name type))))

@@ -2328,16 +2331,15 @@ When called interactively with a prefix 
argument, prompt for LIMIT."
       (list (when (> vc-log-show-limit 0) vc-log-show-limit)))))
    (let ((backend (vc-deduce-backend))
  	(default-directory default-directory)
-	rootdir working-revision)
+	rootdir)
      (if backend
  	(setq rootdir (vc-call-backend backend 'root default-directory))
        (setq rootdir (read-directory-name "Directory for VC root-log: "))
        (setq backend (vc-responsible-backend rootdir))
        (unless backend
          (error "Directory is not version controlled")))
-    (setq working-revision (vc-working-revision rootdir)
-          default-directory rootdir)
-    (vc-print-log-internal backend (list rootdir) working-revision nil 
limit)))
+    (setq default-directory rootdir)
+    (vc-print-log-internal backend (list rootdir) nil nil limit)))

  ;;;###autoload
  (defun vc-log-incoming (&optional remote-location)