Mercurial > emacs
diff lisp/vc-annotate.el @ 105670:6f463ea7a91a
Make vc-annotate work through copies and renames.
* vc-annotate.el (vc-annotate-extract-revision-at-line): Return
the file name too.
(vc-annotate-revision-at-line)
(vc-annotate-find-revision-at-line)
(vc-annotate-revision-previous-to-line)
(vc-annotate-show-log-revision-at-line): Update to get the file
name from vc-annotate-extract-revision-at-line.
(vc-annotate-show-diff-revision-at-line-internal): Change the
argument to mean whether to show a file diff or not. Get the file
name from vc-annotate-extract-revision-at-line.
(vc-annotate-show-diff-revision-at-line): Update
vc-annotate-show-diff-revision-at-line call.
(vc-annotate-warp-revision): Add an optional file argument.
* vc-git.el (vc-git-annotate-command): Pass -C -C to the blame command.
(vc-git-annotate-extract-revision-at-line): Also return the file
name if found.
* vc-hg.el (vc-hg-annotate-command): Pass --follow to the annotate
command. Remove unused code.
(vc-hg-annotate-re): Update to match --follow output.
(vc-hg-annotate-extract-revision-at-line): Also return the file
name if found.
* vc.el: Update annotate-extract-revision-at-line documentation.
author | Dan Nicolaescu <dann@ics.uci.edu> |
---|---|
date | Mon, 19 Oct 2009 05:04:22 +0000 |
parents | 4fab4cdb3614 |
children | 42f3f64ab6e5 |
line wrap: on
line diff
--- a/lisp/vc-annotate.el Mon Oct 19 04:27:09 2009 +0000 +++ b/lisp/vc-annotate.el Mon Oct 19 05:04:22 2009 +0000 @@ -430,9 +430,14 @@ (vc-annotate-warp-revision warp-rev))))) (defun vc-annotate-extract-revision-at-line () - "Extract the revision number of the current line." + "Extract the revision number of the current line. +Return a cons (REV . FILENAME)." ;; This function must be invoked from a buffer in vc-annotate-mode - (vc-call-backend vc-annotate-backend 'annotate-extract-revision-at-line)) + (let ((rev (vc-call-backend vc-annotate-backend + 'annotate-extract-revision-at-line))) + (if (or (null rev) (consp rev)) + rev + (cons rev vc-annotate-parent-file)))) (defun vc-annotate-revision-at-line () "Visit the annotation of the revision identified in the current line." @@ -442,9 +447,9 @@ (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) + (if (equal (car rev-at-line) vc-annotate-parent-rev) (message "Already at revision %s" rev-at-line) - (vc-annotate-warp-revision rev-at-line)))))) + (vc-annotate-warp-revision (car rev-at-line) (cdr rev-at-line))))))) (defun vc-annotate-find-revision-at-line () "Visit the revision identified in the current line." @@ -454,21 +459,24 @@ (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-revision-other-window rev-at-line))))) + (switch-to-buffer-other-window + (vc-find-revision (cdr rev-at-line) (car rev-at-line))))))) (defun vc-annotate-revision-previous-to-line () "Visit the annotation of the revision before the revision 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)) + (let* ((rev-at-line (vc-annotate-extract-revision-at-line)) + (prev-rev nil) + (rev (car rev-at-line)) + (fname (cdr rev-at-line))) (if (not rev-at-line) (message "Cannot extract revision number from the current line") (setq prev-rev (vc-call-backend vc-annotate-backend 'previous-revision - vc-annotate-parent-file rev-at-line)) - (vc-annotate-warp-revision prev-rev))))) + fname rev)) + (vc-annotate-warp-revision rev fname))))) (defun vc-annotate-show-log-revision-at-line () "Visit the log of the revision at line." @@ -478,33 +486,39 @@ (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))))) + (vc-print-log-internal + vc-annotate-backend (list (cdr rev-at-line)) (car rev-at-line)))))) -(defun vc-annotate-show-diff-revision-at-line-internal (fileset) +(defun vc-annotate-show-diff-revision-at-line-internal (filediff) (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)) + (let* ((rev-at-line (vc-annotate-extract-revision-at-line)) + (prev-rev nil) + (rev (car rev-at-line)) + (fname (cdr rev-at-line))) (if (not rev-at-line) (message "Cannot extract revision number from the current line") (setq prev-rev (vc-call-backend vc-annotate-backend 'previous-revision - vc-annotate-parent-file rev-at-line)) + fname rev)) (if (not prev-rev) - (message "Cannot diff from any revision prior to %s" rev-at-line) + (message "Cannot diff from any revision prior to %s" rev) (save-window-excursion (vc-diff-internal nil ;; The value passed here should follow what ;; `vc-deduce-fileset' returns. - (cons vc-annotate-backend (cons fileset nil)) - prev-rev rev-at-line)) + (list vc-annotate-backend + (if filediff + (list fname) + nil)) + prev-rev rev)) (switch-to-buffer "*vc-diff*")))))) (defun vc-annotate-show-diff-revision-at-line () "Visit the diff of the revision at line from its previous revision." (interactive) - (vc-annotate-show-diff-revision-at-line-internal (list vc-annotate-parent-file))) + (vc-annotate-show-diff-revision-at-line-internal t)) (defun vc-annotate-show-changeset-diff-revision-at-line () "Visit the diff of the revision at line from its previous revision for all files in the changeset." @@ -513,7 +527,7 @@ (error "The %s backend does not support changeset diffs" vc-annotate-backend)) (vc-annotate-show-diff-revision-at-line-internal nil)) -(defun vc-annotate-warp-revision (revspec) +(defun vc-annotate-warp-revision (revspec &optional file) "Annotate the revision described by REVSPEC. If REVSPEC is a positive integer, warp that many revisions forward, @@ -532,7 +546,7 @@ (setq newrev vc-annotate-parent-rev) (while (and (> revspec 0) newrev) (setq newrev (vc-call-backend vc-annotate-backend 'next-revision - vc-annotate-parent-file newrev)) + (or file vc-annotate-parent-file) newrev)) (setq revspec (1- revspec))) (unless newrev (message "Cannot increment %d revisions from revision %s" @@ -541,7 +555,7 @@ (setq newrev vc-annotate-parent-rev) (while (and (< revspec 0) newrev) (setq newrev (vc-call-backend vc-annotate-backend 'previous-revision - vc-annotate-parent-file newrev)) + (or file vc-annotate-parent-file) newrev)) (setq revspec (1+ revspec))) (unless newrev (message "Cannot decrement %d revisions from revision %s" @@ -549,7 +563,7 @@ ((stringp revspec) (setq newrev revspec)) (t (error "Invalid argument to vc-annotate-warp-revision"))) (when newrev - (vc-annotate vc-annotate-parent-file newrev + (vc-annotate (or file vc-annotate-parent-file) newrev vc-annotate-parent-display-mode buf ;; Pass the current line so that vc-annotate will