* 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:
parent
6f77e7d72e
commit
6653c6b769
7 changed files with 105 additions and 19 deletions
4
etc/NEWS
4
etc/NEWS
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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: .+\\)")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)))
|
||||
|
|
Loading…
Add table
Reference in a new issue