mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-27 07:37:33 +00:00
* vc.el (vc-default-previous-version): Doc enhancement.
(vc-default-next-version): New function. (vc-print-log): New arg FOCUS-REV. (vc-annotate-mode): Derives from view-mode now. (vc-annotate): New args REVISION, DISPLAY-MODE. (vc-annotate-prev-version): New function. (vc-annotate-prev-version): New function. (vc-annotate-next-version): New function. (vc-annotate-workfile-version): New function. (vc-annotate-extract-revision-at-line): New function. (vc-annotate-revision-at-line): New function. (vc-annotate-revision-previous-to-line): New function. (vc-annotate-show-log-revision-at-line): New function. (vc-annotate-show-diff-revision-at-line): New function. (vc-current-line): New function. (vc-annotate-warp-version): New function.
This commit is contained in:
parent
a73c299983
commit
1b5a73430e
257
lisp/vc.el
257
lisp/vc.el
@ -7,7 +7,7 @@
|
||||
;; Maintainer: Andre Spiegel <spiegel@gnu.org>
|
||||
;; Keywords: tools
|
||||
|
||||
;; $Id: vc.el,v 1.360 2003/09/01 15:45:17 miles Exp $
|
||||
;; $Id: vc.el,v 1.361 2003/12/24 23:18:10 uid66361 Exp $
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
@ -347,6 +347,13 @@
|
||||
;; time with hours, minutes, and seconds included. Probably safe to
|
||||
;; ignore. Return the current-time, in units of fractional days.
|
||||
;;
|
||||
;; - annotate-extract-revision-at-line ()
|
||||
;;
|
||||
;; Only required if `annotate-command' is defined for the backend.
|
||||
;; Invoked from a buffer in vc-annotate-mode, return the revision
|
||||
;; corresponding to the current line, or nil if there is no revision
|
||||
;; corresponding to the current line.
|
||||
;;
|
||||
;; SNAPSHOT SYSTEM
|
||||
;;
|
||||
;; - create-snapshot (dir name branchp)
|
||||
@ -392,7 +399,13 @@
|
||||
;;
|
||||
;; - previous-version (file rev)
|
||||
;;
|
||||
;; Return the version number that precedes REV for FILE.
|
||||
;; Return the version number that precedes REV for FILE, or nil if no such
|
||||
;; version exists.
|
||||
;;
|
||||
;; - next-version (file rev)
|
||||
;;
|
||||
;; Return the version number that follows REV for FILE, or nil if no such
|
||||
;; version exists.
|
||||
;;
|
||||
;; - check-headers ()
|
||||
;;
|
||||
@ -631,6 +644,14 @@ List of factors, used to expand/compress the time scale. See `vc-annotate'."
|
||||
m)
|
||||
"Local keymap used for VC-Annotate mode.")
|
||||
|
||||
(define-key vc-annotate-mode-map "A" 'vc-annotate-revision-previous-to-line)
|
||||
(define-key vc-annotate-mode-map "D" 'vc-annotate-show-diff-revision-at-line)
|
||||
(define-key vc-annotate-mode-map "J" 'vc-annotate-revision-at-line)
|
||||
(define-key vc-annotate-mode-map "L" 'vc-annotate-show-log-revision-at-line)
|
||||
(define-key vc-annotate-mode-map "N" 'vc-annotate-next-version)
|
||||
(define-key vc-annotate-mode-map "P" 'vc-annotate-prev-version)
|
||||
(define-key vc-annotate-mode-map "W" 'vc-annotate-workfile-version)
|
||||
|
||||
(defvar vc-annotate-mode-menu nil
|
||||
"Local keymap used for VC-Annotate mode's menu bar menu.")
|
||||
|
||||
@ -714,9 +735,10 @@ The keys are \(BUFFER . BACKEND\). See also `vc-annotate-get-backend'.")
|
||||
(substring rev (match-beginning 0) (match-end 0)))
|
||||
|
||||
(defun vc-default-previous-version (backend file rev)
|
||||
"Guess the version number immediately preceding REV for FILE.
|
||||
This default implementation works for <major>.<minor>-style version numbers
|
||||
as used by RCS and CVS."
|
||||
"Return the version number immediately preceding REV for FILE,
|
||||
or nil if there is no previous version. This default
|
||||
implementation works for <major>.<minor>-style version numbers as
|
||||
used by RCS and CVS."
|
||||
(let ((branch (vc-branch-part rev))
|
||||
(minor-num (string-to-number (vc-minor-part rev))))
|
||||
(when branch
|
||||
@ -731,6 +753,16 @@ as used by RCS and CVS."
|
||||
;; return version of starting point
|
||||
(vc-branch-part branch))))))
|
||||
|
||||
(defun vc-default-next-version (backend file rev)
|
||||
"Return the version number immediately following REV for FILE,
|
||||
or nil if there is no next version. This default implementation
|
||||
works for <major>.<minor>-style version numbers as used by RCS
|
||||
and CVS."
|
||||
(when (not (string= rev (vc-workfile-version file)))
|
||||
(let ((branch (vc-branch-part rev))
|
||||
(minor-num (string-to-number (vc-minor-part rev))))
|
||||
(concat branch "." (number-to-string (1+ minor-num))))))
|
||||
|
||||
;; File property caching
|
||||
|
||||
(defun vc-clear-context ()
|
||||
@ -2285,11 +2317,13 @@ allowed and simply skipped)."
|
||||
;; Miscellaneous other entry points
|
||||
|
||||
;;;###autoload
|
||||
(defun vc-print-log ()
|
||||
"List the change log of the current buffer in a window."
|
||||
(defun vc-print-log (&optional focus-rev)
|
||||
"List the change log of the current buffer in a window. If
|
||||
FOCUS-REV is non-nil, leave the point at that revision."
|
||||
(interactive)
|
||||
(vc-ensure-vc-buffer)
|
||||
(let ((file buffer-file-name))
|
||||
(or focus-rev (setq focus-rev (vc-workfile-version file)))
|
||||
(vc-call print-log file)
|
||||
(set-buffer "*vc*")
|
||||
(pop-to-buffer (current-buffer))
|
||||
@ -2307,7 +2341,7 @@ allowed and simply skipped)."
|
||||
;; move point to the log entry for the current version
|
||||
(vc-call-backend ',(vc-backend file)
|
||||
'show-log-entry
|
||||
',(vc-workfile-version file))
|
||||
',focus-rev)
|
||||
(set-buffer-modified-p nil)))))
|
||||
|
||||
(defun vc-default-show-log-entry (backend rev)
|
||||
@ -2778,6 +2812,14 @@ Uses `rcs2log' which only works for RCS and CVS."
|
||||
(defvar vc-annotate-ratio nil "Global variable.")
|
||||
(defvar vc-annotate-backend nil "Global variable.")
|
||||
|
||||
;; internal buffer-local variables
|
||||
(defvar vc-annotate-parent-file nil)
|
||||
(defvar vc-annotate-parent-rev nil)
|
||||
(defvar vc-annotate-parent-display-mode nil)
|
||||
(make-local-variable 'vc-annotate-parent-file)
|
||||
(make-local-variable 'vc-annotate-parent-rev)
|
||||
(make-local-variable 'vc-annotate-parent-display-mode)
|
||||
|
||||
(defconst vc-annotate-font-lock-keywords
|
||||
;; The fontification is done by vc-annotate-lines instead of font-lock.
|
||||
'((vc-annotate-lines)))
|
||||
@ -2788,7 +2830,7 @@ Return nil if no match made. Associations are made based on
|
||||
`vc-annotate-buffers'."
|
||||
(cdr (assoc buffer vc-annotate-buffers)))
|
||||
|
||||
(define-derived-mode vc-annotate-mode fundamental-mode "Annotate"
|
||||
(define-derived-mode vc-annotate-mode view-mode "Annotate"
|
||||
"Major mode for output buffers of the `vc-annotate' command.
|
||||
|
||||
You can use the mode-specific menu to alter the time-span of the used
|
||||
@ -2885,7 +2927,23 @@ cover the range from the oldest annotation to the newest."
|
||||
(unless (eq vc-annotate-display-mode 'fullscale)
|
||||
(vc-annotate-display-select nil 'fullscale))
|
||||
:style toggle :selected
|
||||
(eq vc-annotate-display-mode 'fullscale)])))
|
||||
(eq vc-annotate-display-mode 'fullscale)])
|
||||
(list "--")
|
||||
(list ["Annotate previous revision"
|
||||
(call-interactively 'vc-annotate-prev-version)])
|
||||
(list ["Annotate next revision"
|
||||
(call-interactively 'vc-annotate-next-version)])
|
||||
(list ["Annotate revision at line"
|
||||
(vc-annotate-revision-at-line)])
|
||||
(list ["Annotate revision previous to line"
|
||||
(vc-annotate-revision-previous-to-line)])
|
||||
(list ["Annotate latest revision"
|
||||
(vc-annotate-workfile-version)])
|
||||
(list ["Show log of revision at line"
|
||||
(vc-annotate-show-log-revision-at-line)])
|
||||
(list ["Show diff of revision at line"
|
||||
(vc-annotate-show-diff-revision-at-line)])))
|
||||
|
||||
;; Define the menu
|
||||
(if (or (featurep 'easymenu) (load "easymenu" t))
|
||||
(easy-menu-define vc-annotate-mode-menu vc-annotate-mode-map
|
||||
@ -2922,7 +2980,7 @@ use; you may override this using the second optional arg MODE."
|
||||
;;;; the contents in BUFFER.
|
||||
|
||||
;;;###autoload
|
||||
(defun vc-annotate (prefix)
|
||||
(defun vc-annotate (prefix &optional revision display-mode)
|
||||
"Display the edit history of the current file using colours.
|
||||
|
||||
This command creates a buffer that shows, for each line of the current
|
||||
@ -2949,19 +3007,24 @@ mode-specific menu. `vc-annotate-color-map' and
|
||||
colors. `vc-annotate-background' specifies the background color."
|
||||
(interactive "P")
|
||||
(vc-ensure-vc-buffer)
|
||||
(let* ((temp-buffer-name (concat "*Annotate " (buffer-name) "*"))
|
||||
(let* ((temp-buffer-name nil)
|
||||
(temp-buffer-show-function 'vc-annotate-display-select)
|
||||
(rev (vc-workfile-version buffer-file-name))
|
||||
(rev (or revision (vc-workfile-version buffer-file-name)))
|
||||
(bfn buffer-file-name)
|
||||
(vc-annotate-version
|
||||
(if prefix (read-string
|
||||
(format "Annotate from version: (default %s) " rev)
|
||||
nil nil rev)
|
||||
rev)))
|
||||
(if prefix
|
||||
(setq vc-annotate-display-mode
|
||||
(float (string-to-number
|
||||
(read-string "Annotate span days: (default 20) "
|
||||
nil nil "20")))))
|
||||
(if prefix (read-string
|
||||
(format "Annotate from version: (default %s) " rev)
|
||||
nil nil rev)
|
||||
rev)))
|
||||
(if display-mode
|
||||
(setq vc-annotate-display-mode display-mode)
|
||||
(if prefix
|
||||
(setq vc-annotate-display-mode
|
||||
(float (string-to-number
|
||||
(read-string "Annotate span days: (default 20) "
|
||||
nil nil "20"))))))
|
||||
(setq temp-buffer-name (format "*Annotate %s (rev %s)*"
|
||||
(buffer-name) vc-annotate-version))
|
||||
(setq vc-annotate-backend (vc-backend buffer-file-name))
|
||||
(message "Annotating...")
|
||||
(if (not (vc-find-backend-function vc-annotate-backend 'annotate-command))
|
||||
@ -2972,6 +3035,12 @@ colors. `vc-annotate-background' specifies the background color."
|
||||
buffer-file-name
|
||||
(get-buffer temp-buffer-name)
|
||||
vc-annotate-version))
|
||||
(save-excursion
|
||||
(set-buffer temp-buffer-name)
|
||||
(setq vc-annotate-parent-file bfn)
|
||||
(setq vc-annotate-parent-rev vc-annotate-version)
|
||||
(setq vc-annotate-parent-display-mode vc-annotate-display-mode))
|
||||
|
||||
;; Don't use the temp-buffer-name until the buffer is created
|
||||
;; (only after `with-output-to-temp-buffer'.)
|
||||
(setq vc-annotate-buffers
|
||||
@ -2979,6 +3048,150 @@ colors. `vc-annotate-background' specifies the background color."
|
||||
(list (cons (get-buffer temp-buffer-name) vc-annotate-backend))))
|
||||
(message "Annotating... done")))
|
||||
|
||||
(defun vc-annotate-prev-version (prefix)
|
||||
"Visit the annotation of the version previous to this one.
|
||||
|
||||
With a numeric prefix argument, annotate the version that many
|
||||
versions previous."
|
||||
(interactive "p")
|
||||
(vc-annotate-warp-version (- 0 prefix)))
|
||||
|
||||
(defun vc-annotate-next-version (prefix)
|
||||
"Visit the annotation of the version after this one.
|
||||
|
||||
With a numeric prefix argument, annotate the version that many
|
||||
versions after."
|
||||
(interactive "p")
|
||||
(vc-annotate-warp-version prefix))
|
||||
|
||||
(defun vc-annotate-workfile-version ()
|
||||
"Visit the annotation of the workfile version of this file."
|
||||
(interactive)
|
||||
(if (not (equal major-mode 'vc-annotate-mode))
|
||||
(message "Cannot be invoked outside of a vc annotate buffer")
|
||||
(let ((warp-rev (vc-workfile-version vc-annotate-parent-file)))
|
||||
(if (equal warp-rev vc-annotate-parent-rev)
|
||||
(message "Already at version %s" warp-rev)
|
||||
(vc-annotate-warp-version warp-rev)))))
|
||||
|
||||
(defun vc-annotate-extract-revision-at-line ()
|
||||
"Extract the revision number of the current line."
|
||||
;; This function must be invoked from a buffer in vc-annotate-mode
|
||||
(save-window-excursion
|
||||
(vc-ensure-vc-buffer)
|
||||
(setq vc-annotate-backend (vc-backend buffer-file-name)))
|
||||
(vc-call-backend vc-annotate-backend 'annotate-extract-revision-at-line))
|
||||
|
||||
(defun vc-annotate-revision-at-line ()
|
||||
"Visit the annotation of the version identified in the current line."
|
||||
(interactive)
|
||||
(if (not (equal major-mode 'vc-annotate-mode))
|
||||
(message "Cannot be invoked outside of a vc annotate buffer")
|
||||
(let ((rev-at-line (vc-annotate-extract-revision-at-line)))
|
||||
(if (not rev-at-line)
|
||||
(message "Cannot extract revision number from the current line")
|
||||
(if (equal rev-at-line vc-annotate-parent-rev)
|
||||
(message "Already at version %s" rev-at-line)
|
||||
(vc-annotate-warp-version rev-at-line))))))
|
||||
|
||||
(defun vc-annotate-revision-previous-to-line ()
|
||||
"Visit the annotation of the version before the version at line."
|
||||
(interactive)
|
||||
(if (not (equal major-mode 'vc-annotate-mode))
|
||||
(message "Cannot be invoked outside of a vc annotate buffer")
|
||||
(let ((rev-at-line (vc-annotate-extract-revision-at-line))
|
||||
(prev-rev nil))
|
||||
(if (not rev-at-line)
|
||||
(message "Cannot extract revision number from the current line")
|
||||
(setq prev-rev
|
||||
(vc-call previous-version vc-annotate-parent-file rev-at-line))
|
||||
(vc-annotate-warp-version prev-rev)))))
|
||||
|
||||
(defun vc-annotate-show-log-revision-at-line ()
|
||||
"Visit the log of the version at line."
|
||||
(interactive)
|
||||
(if (not (equal major-mode 'vc-annotate-mode))
|
||||
(message "Cannot be invoked outside of a vc annotate buffer")
|
||||
(let ((rev-at-line (vc-annotate-extract-revision-at-line)))
|
||||
(if (not rev-at-line)
|
||||
(message "Cannot extract revision number from the current line")
|
||||
(vc-print-log rev-at-line)))))
|
||||
|
||||
(defun vc-annotate-show-diff-revision-at-line ()
|
||||
"Visit the diff of the version at line from its previous version."
|
||||
(interactive)
|
||||
(if (not (equal major-mode 'vc-annotate-mode))
|
||||
(message "Cannot be invoked outside of a vc annotate buffer")
|
||||
(let ((rev-at-line (vc-annotate-extract-revision-at-line))
|
||||
(prev-rev nil))
|
||||
(if (not rev-at-line)
|
||||
(message "Cannot extract revision number from the current line")
|
||||
(setq prev-rev
|
||||
(vc-call previous-version vc-annotate-parent-file rev-at-line))
|
||||
(if (not prev-rev)
|
||||
(message "Cannot diff from any version prior to %s" rev-at-line)
|
||||
(save-window-excursion
|
||||
(vc-version-diff vc-annotate-parent-file prev-rev rev-at-line))
|
||||
(switch-to-buffer "*vc-diff*"))))))
|
||||
|
||||
(defun vc-current-line ()
|
||||
"Return the current buffer's line number."
|
||||
(let ((oldpoint (point)) start)
|
||||
(save-excursion
|
||||
(save-restriction
|
||||
(goto-char (point-min))
|
||||
(widen)
|
||||
(forward-line 0)
|
||||
(setq start (point))
|
||||
(goto-char oldpoint)
|
||||
(forward-line 0)
|
||||
(1+ (count-lines (point-min) (point)))))))
|
||||
|
||||
(defun vc-annotate-warp-version (revspec)
|
||||
"Annotate the version described by REVSPEC.
|
||||
|
||||
If REVSPEC is a positive integer, warp that many versions
|
||||
forward, if possible, otherwise echo a warning message. If
|
||||
REVSPEC is a negative integer, warp that many versions backward,
|
||||
if possible, otherwise echo a warning message. If REVSPEC is a
|
||||
string, then it describes a revision number, so warp to that
|
||||
revision."
|
||||
(if (not (equal major-mode 'vc-annotate-mode))
|
||||
(message "Cannot be invoked outside of a vc annotate buffer")
|
||||
(let* ((oldline (vc-current-line))
|
||||
(revspeccopy revspec)
|
||||
(newrev nil))
|
||||
(cond
|
||||
((and (integerp revspec) (> revspec 0))
|
||||
(setq newrev vc-annotate-parent-rev)
|
||||
(while (and (> revspec 0) newrev)
|
||||
(setq newrev (vc-call next-version
|
||||
vc-annotate-parent-file newrev))
|
||||
(setq revspec (1- revspec)))
|
||||
(if (not newrev)
|
||||
(message "Cannot increment %d versions from version %s"
|
||||
revspeccopy vc-annotate-parent-rev)))
|
||||
((and (integerp revspec) (< revspec 0))
|
||||
(setq newrev vc-annotate-parent-rev)
|
||||
(while (and (< revspec 0) newrev)
|
||||
(setq newrev (vc-call previous-version
|
||||
vc-annotate-parent-file newrev))
|
||||
(setq revspec (1+ revspec)))
|
||||
(if (not newrev)
|
||||
(message "Cannot decrement %d versions from version %s"
|
||||
(- 0 revspeccopy) vc-annotate-parent-rev)))
|
||||
((stringp revspec) (setq newrev revspec))
|
||||
(t (error "Invalid argument to vc-annotate-warp-version")))
|
||||
(when newrev
|
||||
(save-window-excursion
|
||||
(find-file vc-annotate-parent-file)
|
||||
(vc-annotate nil newrev vc-annotate-parent-display-mode))
|
||||
(kill-buffer (current-buffer)) ;; kill the buffer we started from
|
||||
(switch-to-buffer (car (car (last vc-annotate-buffers))))
|
||||
(goto-line (min oldline (progn (goto-char (point-max))
|
||||
(previous-line)
|
||||
(vc-current-line))))))))
|
||||
|
||||
(defun vc-annotate-car-last-cons (a-list)
|
||||
"Return car of last cons in association list A-LIST."
|
||||
(if (not (eq nil (cdr a-list)))
|
||||
|
Loading…
Reference in New Issue
Block a user