* 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.
This commit is contained in:
Dan Nicolaescu 2008-06-15 14:58:24 +00:00
parent 6f77e7d72e
commit 6653c6b769
7 changed files with 105 additions and 19 deletions

View file

@ -597,6 +597,10 @@ active.
For now only CVS, RCS, SCCS and SVN support this functionality.
This is done by the `modify-change-comment' backend function.
*** In log-view-mode, for VC systems that support changesets, you can
see the diff for the whole changeset (not only for the current file)
by typing the D key or using the "Changeset Diff" menu entry.
*** VC Support for Meta-CVS has been removed for lack of maintainer able
to update it to the new VC.

View file

@ -1,3 +1,28 @@
2008-06-15 Dan Nicolaescu <dann@ics.uci.edu>
* 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.
2008-06-15 Michael Albinus <michael.albinus@gmx.de>
* net/tramp.el (tramp-handle-start-file-process): Clear

View file

@ -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)

View file

@ -427,6 +427,7 @@ REV non-nil gets an error."
(define-derived-mode vc-bzr-log-view-mode log-view-mode "Bzr-Log-View"
(remove-hook 'log-view-mode-hook 'vc-bzr-log-view-mode) ;Deactivate the hack.
(require 'add-log)
(set (make-local-variable 'log-view-per-file-logs) nil)
(set (make-local-variable 'log-view-file-re) "^Working file:[ \t]+\\(.+\\)")
(set (make-local-variable 'log-view-message-re)
"^ *-+\n *\\(?:revno: \\([0-9.]+\\)\\|merged: .+\\)")

View file

@ -212,23 +212,19 @@
;; If the buffer exists from a previous invocation it might be
;; read-only.
(let ((inhibit-read-only t))
;; We need to loop and call "hg log" on each file separately.
;; "hg log" with multiple file arguments mashes all the logs
;; together. Ironically enough, this puts us back near CVS
;; which can't generate proper fileset logs either.
(dolist (file files)
(with-current-buffer
buffer
(insert "Working file: " file "\n")) ;; Like RCS/CVS.
(vc-hg-command buffer 0 file "log"))))
(with-current-buffer
buffer
(vc-hg-command buffer 0 files "log"))))
(defvar log-view-message-re)
(defvar log-view-file-re)
(defvar log-view-font-lock-keywords)
(defvar log-view-per-file-logs)
(define-derived-mode vc-hg-log-view-mode log-view-mode "Hg-Log-View"
(require 'add-log) ;; we need the add-log faces
(set (make-local-variable 'log-view-file-re) "^Working file:[ \t]+\\(.+\\)")
(set (make-local-variable 'log-view-file-re) "\\`a\\`")
(set (make-local-variable 'log-view-per-file-logs) nil)
(set (make-local-variable 'log-view-message-re)
"^changeset:[ \t]*\\([0-9]+\\):\\(.+\\)")
(set (make-local-variable 'log-view-font-lock-keywords)
@ -251,14 +247,16 @@
(defun vc-hg-diff (files &optional oldvers newvers buffer)
"Get a difference report using hg between two revisions of FILES."
(let ((working (vc-working-revision (car files))))
(let* ((firstfile (car files))
(working (and firstfile (vc-working-revision firstfile))))
(when (and (equal oldvers working) (not newvers))
(setq oldvers nil))
(when (and (not oldvers) newvers)
(setq oldvers working))
(apply #'vc-hg-command (or buffer "*vc-diff*") nil
(mapcar (lambda (file) (file-name-nondirectory file)) files)
"--cwd" (file-name-directory (car files))
"--cwd" (or (when firstfile (file-name-directory firstfile))
(expand-file-name default-directory))
"diff"
(append
(when oldvers

View file

@ -425,6 +425,10 @@ or svn+ssh://."
;;; History functions
;;;
(define-derived-mode vc-svn-log-view-mode log-view-mode "SVN-Log-View"
(require 'add-log)
(set (make-local-variable 'log-view-per-file-logs) nil))
(defun vc-svn-print-log (files &optional buffer)
"Get change log(s) associated with FILES."
(save-current-buffer

View file

@ -2175,6 +2175,8 @@ If WORKING-REVISION is non-nil, leave the point at that revision."
(vc-exec-after
`(let ((inhibit-read-only t))
(vc-call-backend ',backend 'log-view-mode)
(set (make-local-variable 'log-view-vc-backend) ',backend)
(set (make-local-variable 'log-view-vc-fileset) ',files)
(goto-char (point-max)) (forward-line -1)
(while (looking-at "=*\n")
(delete-char (- (match-end 0) (match-beginning 0)))