]> code.delx.au - gnu-emacs/commitdiff
* log-view.el (log-view-diff-changeset): New function.
authorDan Nicolaescu <dann@ics.uci.edu>
Sun, 15 Jun 2008 14:58:24 +0000 (14:58 +0000)
committerDan Nicolaescu <dann@ics.uci.edu>
Sun, 15 Jun 2008 14:58:24 +0000 (14:58 +0000)
(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.

etc/NEWS
lisp/ChangeLog
lisp/log-view.el
lisp/vc-bzr.el
lisp/vc-hg.el
lisp/vc-svn.el
lisp/vc.el

index db7835884ac5f597f1092e1c872425f58d1b38aa..8aba3907e602136a0f6a1d914f0aa2b6d8179a9f 100644 (file)
--- a/etc/NEWS
+++ b/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.
 
index 6d8266efdca8e4bf3599e676fb9cae4e02f50f60..0d3d3a40638e1f1712e2b4ce2bef6aa6f000fc04 100644 (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
index e7bb43a49430d0cb8e0afda71c6d5b6696830355..eb1327fdde09edd3820df631dfd5965080d1a282 100644 (file)
     ("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.
@@ -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)
 
index 8e2ae86b4710024a6f1331b5b8c73e199a37b098..77593f0a2d3fd8b614b0d01ca23dfaee81cb060c 100644 (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: .+\\)")
index 025b2d9500e7880a67c13c28149893dec9007e49..663609d39b34212dc6f3b1fec2733352503c3a1a 100644 (file)
   ;; 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
index 8a7c2b291f76863944bb9333b9627fe7afd8100c..9f116a3c964d9226330d7728a84f4b2909c89938 100644 (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
index e149976d8db0a098931a30af8273ef84b7402474..26af0317b0e4ae20c92ad04b6d75beb23dc7bf96 100644 (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)))