(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.
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.
+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
("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)
: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
"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.
(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
;;;;
(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 ()
(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)))))
;;
(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)
(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: .+\\)")
;; 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)
(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
;;; 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
(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)))