diff options
author | Dan Nicolaescu <dann@ics.uci.edu> | 2008-06-15 14:58:24 +0000 |
---|---|---|
committer | Dan Nicolaescu <dann@ics.uci.edu> | 2008-06-15 14:58:24 +0000 |
commit | 54b639a9aa019b5e3244f5f314837cd16d0f800a (patch) | |
tree | 86e74c3d2330fc9c965393195a59a7e7786cac52 /lisp/log-view.el | |
parent | 01ad8c0b564c3eb54716a5a65a42eb5061d35bf4 (diff) | |
download | emacs-54b639a9aa019b5e3244f5f314837cd16d0f800a.tar.gz |
* log-view.el (log-view-diff-changeset): New function.
(log-view-mode-map, log-view-mode-menu): Bind it.
(log-view-per-file-logs, log-view-vc-fileset)
(log-view-vc-backend): New variables.
(log-view-find-revision, log-view-modify-change-comment)
(log-view-annotate-version): Throw an error if the log is for more
than one file and we can't find the current file. Get the current
file from log-view-vc-fileset if necessary.
(log-view-diff): Get the current file from log-view-vc-fileset if
necessary.
* vc.el (vc-print-log): Set log-view-vc-fileset and log-view-vc-backend.
* vc-hg.el (vc-hg-log-view-mode): Call the log method only once.
(vc-hg-log-view-mode): Declare for compiler.
(vc-hg-log-view-mode): Set log-view-per-file-logs and
log-view-file-re.
(vc-hg-diff): If no file is passed, use default-directory for cwd.
* vc-bzr.el (vc-bzr-log-view-mode): Set log-view-per-file-logs.
* vc-svn.el (vc-svn-log-view-mode): New derived mode.
Diffstat (limited to 'lisp/log-view.el')
-rw-r--r-- | lisp/log-view.el | 66 |
1 files changed, 59 insertions, 7 deletions
diff --git a/lisp/log-view.el b/lisp/log-view.el index e7bb43a4943..eb1327fdde0 100644 --- a/lisp/log-view.el +++ b/lisp/log-view.el @@ -128,6 +128,7 @@ ("m" . log-view-toggle-mark-entry) ("e" . log-view-modify-change-comment) ("d" . log-view-diff) + ("D" . log-view-diff-changeset) ("a" . log-view-annotate-version) ("f" . log-view-find-revision) ("n" . log-view-msg-next) @@ -154,6 +155,8 @@ :help ""] ["Diff Revisions" log-view-diff :help "Get the diff between two revisions"] + ["Changeset Diff" log-view-diff-changeset + :help "Get the changeset diff between two revisions"] ["Visit Version" log-view-find-revision :help "Visit the version at point"] ["Annotate Version" log-view-annotate-version @@ -201,6 +204,9 @@ "Regexp matching the text identifying the file. The match group number 1 should match the file name itself.") +(defvar log-view-per-file-logs t + "Set if to t if the logs are shown one file at a time.") + (defvar log-view-message-re (concat "^\\(?:revision \\(?1:[.0-9]+\\)\\(?:\t.*\\)?" ; RCS and CVS. "\\|r\\(?1:[0-9]+\\) | .* | .*" ; Subversion. @@ -229,6 +235,12 @@ The match group number 1 should match the revision number itself.") (defconst log-view-font-lock-defaults '(log-view-font-lock-keywords t nil nil nil)) +(defvar log-view-vc-fileset nil + "Set this to the fileset corresponding to the current log.") + +(defvar log-view-vc-backend nil + "Set this to the VC backend that created the current log.") + ;;;; ;;;; Actual code ;;;; @@ -415,10 +427,15 @@ log entries." (defun log-view-find-revision (pos) "Visit the version at point." (interactive "d") + (unless log-view-per-file-logs + (when (> (length log-view-vc-fileset) 1) + (error "Multiple files shown in this buffer, cannot use this command here"))) (save-excursion (goto-char pos) - (switch-to-buffer (vc-find-revision (log-view-current-file) - (log-view-current-tag))))) + (switch-to-buffer (vc-find-revision (if log-view-per-file-logs + (log-view-current-file) + (car log-view-vc-fileset)) + (log-view-current-tag))))) (defun log-view-extract-comment () @@ -443,16 +460,23 @@ log entries." (defun log-view-modify-change-comment () "Edit the change comment displayed at point." (interactive) - (vc-modify-change-comment (list (log-view-current-file)) - (log-view-current-tag) - (log-view-extract-comment))) + (vc-modify-change-comment (list (if log-view-per-file-logs + (log-view-current-file) + (car log-view-vc-fileset))) + (log-view-current-tag) + (log-view-extract-comment))) (defun log-view-annotate-version (pos) "Annotate the version at point." (interactive "d") + (unless log-view-per-file-logs + (when (> (length log-view-vc-fileset) 1) + (error "Multiple files shown in this buffer, cannot use this command here"))) (save-excursion (goto-char pos) - (switch-to-buffer (vc-annotate (log-view-current-file) + (switch-to-buffer (vc-annotate (if log-view-per-file-logs + (log-view-current-file) + (car log-view-vc-fileset)) (log-view-current-tag))))) ;; @@ -475,7 +499,35 @@ and ends." (goto-char end) (log-view-msg-next) (setq to (log-view-current-tag)))) - (vc-version-diff (list (log-view-current-file)) to fr))) + (vc-version-diff + (if log-view-per-file-logs + (list (log-view-current-file)) + log-view-vc-fileset) + to fr))) + +(defun log-view-diff-changeset (beg end) + "Get the diff between two revisions. +If the mark is not active or the mark is on the revision at point, +get the diff between the revision at point and its previous revision. +Otherwise, get the diff between the revisions where the region starts +and ends." + (interactive + (list (if mark-active (region-beginning) (point)) + (if mark-active (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))) + (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))) + (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))) (provide 'log-view) |