# HG changeset patch # User Dan Nicolaescu # Date 1213541904 0 # Node ID 054335cbee3dab63a5ff9147a3bd6bcb47051062 # Parent 2793cde5d016912ea7e0e56d300fe2a12f3cc8b9 * 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. diff -r 2793cde5d016 -r 054335cbee3d etc/NEWS --- a/etc/NEWS Sun Jun 15 13:40:27 2008 +0000 +++ b/etc/NEWS Sun Jun 15 14:58:24 2008 +0000 @@ -597,6 +597,10 @@ 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. diff -r 2793cde5d016 -r 054335cbee3d lisp/ChangeLog --- a/lisp/ChangeLog Sun Jun 15 13:40:27 2008 +0000 +++ b/lisp/ChangeLog Sun Jun 15 14:58:24 2008 +0000 @@ -1,3 +1,28 @@ +2008-06-15 Dan Nicolaescu + + * 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 * net/tramp.el (tramp-handle-start-file-process): Clear diff -r 2793cde5d016 -r 054335cbee3d lisp/log-view.el --- a/lisp/log-view.el Sun Jun 15 13:40:27 2008 +0000 +++ b/lisp/log-view.el Sun Jun 15 14:58:24 2008 +0000 @@ -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 @@ (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 @@ (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 @@ (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 @@ (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) diff -r 2793cde5d016 -r 054335cbee3d lisp/vc-bzr.el --- a/lisp/vc-bzr.el Sun Jun 15 13:40:27 2008 +0000 +++ b/lisp/vc-bzr.el Sun Jun 15 14:58:24 2008 +0000 @@ -427,6 +427,7 @@ (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: .+\\)") diff -r 2793cde5d016 -r 054335cbee3d lisp/vc-hg.el --- a/lisp/vc-hg.el Sun Jun 15 13:40:27 2008 +0000 +++ b/lisp/vc-hg.el Sun Jun 15 14:58:24 2008 +0000 @@ -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 diff -r 2793cde5d016 -r 054335cbee3d lisp/vc-svn.el --- a/lisp/vc-svn.el Sun Jun 15 13:40:27 2008 +0000 +++ b/lisp/vc-svn.el Sun Jun 15 14:58:24 2008 +0000 @@ -425,6 +425,10 @@ ;;; 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 diff -r 2793cde5d016 -r 054335cbee3d lisp/vc.el --- a/lisp/vc.el Sun Jun 15 13:40:27 2008 +0000 +++ b/lisp/vc.el Sun Jun 15 14:58:24 2008 +0000 @@ -2175,6 +2175,8 @@ (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)))