X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/56602a4bfcc63d2fc2460d10e9c32ea75162ee61..b07ca177d449e58e6e5c14e21e140e63354e335c:/lisp/vc/log-view.el?ds=sidebyside diff --git a/lisp/vc/log-view.el b/lisp/vc/log-view.el index de103c0cdb..f1b57109e3 100644 --- a/lisp/vc/log-view.el +++ b/lisp/vc/log-view.el @@ -1,6 +1,6 @@ ;;; log-view.el --- Major mode for browsing revision log histories -*- lexical-binding: t -*- -;; Copyright (C) 1999-2013 Free Software Foundation, Inc. +;; Copyright (C) 1999-2015 Free Software Foundation, Inc. ;; Author: Stefan Monnier ;; Keywords: tools, vc @@ -404,7 +404,9 @@ This calls `log-view-expanded-log-entry-function' to do the work." (unless (and pos (log-view-inside-comment-p pos)) (error "Broken markup in `log-view-toggle-entry-display'")) (delete-region pos - (next-single-property-change pos 'log-view-comment)) + (or + (next-single-property-change pos 'log-view-comment) + (point-max))) (put-text-property beg (1+ beg) 'log-view-entry-expanded nil) (if (< opoint pos) (goto-char opoint))) @@ -429,18 +431,31 @@ to the beginning of the ARGth following entry. This is Log View mode's default `beginning-of-defun-function'. It assumes that a log entry starts with a line matching `log-view-message-re'." - (if (or (null arg) (zerop arg)) - (setq arg 1)) + (when (null arg) (setf arg 1)) (if (< arg 0) - (dotimes (_n (- arg)) - (log-view-end-of-defun)) - (catch 'beginning-of-buffer - (dotimes (_n arg) - (or (log-view-current-entry nil t) - (throw 'beginning-of-buffer nil))) - (point)))) - -(defun log-view-end-of-defun () + ;; In log view, the end of one defun is the beginning of the + ;; next, so punting to log-view-end-of-defun is safe in this + ;; context. + (log-view-end-of-defun (- arg)) + (let ((found t)) + (while (> arg 0) + (setf arg (1- arg)) + (let ((cur-start (log-view-current-entry))) + (setf found + (cond ((null cur-start) + (goto-char (point-min)) + nil) + ((>= (car cur-start) (point)) + (unless (bobp) + (forward-line -1) + (setf arg (1+ arg))) + nil) + (t + (goto-char (car cur-start)) + t))))) + found))) + +(defun log-view-end-of-defun-1 () "Move forward to the next Log View entry." (let ((looping t)) (if (looking-at log-view-message-re) @@ -453,9 +468,23 @@ It assumes that a log entry starts with a line matching (goto-char (match-beginning 0)))) ;; Don't advance past the end buttons inserted by ;; `vc-print-log-setup-buttons'. - ((looking-back "Show 2X entries Show unlimited entries") + ((looking-back "Show 2X entries Show unlimited entries" + (line-beginning-position)) (setq looping nil) - (forward-line -1)))))) + (forward-line -1)) + ;; There are no buttons if we've turned on unlimited entries. + ((eobp) + (setq looping nil)))))) + +(defun log-view-end-of-defun (&optional arg) + "Move forward to the next Log View entry. +Works like `end-of-defun'." + (when (null arg) (setf arg 1)) + (if (< arg 0) + (log-view-beginning-of-defun (- arg)) + (dotimes (_n arg) + (log-view-end-of-defun-1) + t))) (defvar cvs-minor-current-files) (defvar cvs-branch-prefix) @@ -511,7 +540,8 @@ If called interactively, visit the version at point." (cond ((eq backend 'SVN) (forward-line -1))) (setq en (point)) - (log-view-beginning-of-defun) + (or (log-view-current-entry nil t) + (throw 'beginning-of-buffer nil)) (cond ((memq backend '(SCCS RCS CVS MCVS SVN)) (forward-line 2)) ((eq backend 'Hg) @@ -562,19 +592,7 @@ file(s)." (interactive (list (if (use-region-p) (region-beginning) (point)) (if (use-region-p) (region-end) (point)))) - (let ((fr (log-view-current-tag beg)) - (to (log-view-current-tag end))) - (when (string-equal fr to) - (save-excursion - (goto-char end) - (log-view-msg-next) - (setq to (log-view-current-tag)))) - (vc-diff-internal - t (list log-view-vc-backend - (if log-view-per-file-logs - (list (log-view-current-file)) - log-view-vc-fileset)) - to fr))) + (log-view-diff-common beg end)) (defun log-view-diff-changeset (beg end) "Get the diff between two revisions. @@ -591,18 +609,26 @@ considered file(s)." (if (use-region-p) (region-end) (point)))) (when (eq (vc-call-backend log-view-vc-backend 'revision-granularity) 'file) (error "The %s backend does not support changeset diffs" log-view-vc-backend)) - (let ((fr (log-view-current-tag beg)) - (to (log-view-current-tag end))) + (let ((default-directory (vc-root-dir))) + (log-view-diff-common beg end t))) + +(defun log-view-diff-common (beg end &optional whole-changeset) + (let ((to (log-view-current-tag beg)) + (fr (log-view-current-tag end))) (when (string-equal fr to) ;; TO and FR are the same, look at the previous revision. - (setq to (vc-call-backend log-view-vc-backend 'previous-revision nil fr))) + (setq fr (vc-call-backend log-view-vc-backend 'previous-revision nil fr))) (vc-diff-internal - t - ;; We want to see the diff for all the files in the changeset, so - ;; pass NIL for the file list. The value passed here should - ;; follow what `vc-deduce-fileset' returns. - (list log-view-vc-backend nil) - to fr))) + t (list log-view-vc-backend + ;; The value passed here should follow what + ;; `vc-deduce-fileset' returns. If we want to see the + ;; diff for all the files in the changeset, pass NIL for + ;; the file list. + (unless whole-changeset + (if log-view-per-file-logs + (list (log-view-current-file)) + log-view-vc-fileset))) + fr to))) (provide 'log-view)