changeset 40958:4b4504c5aa56

* vc.el (vc-print-log): Bind `inhibit-read-only' to t before and set-buffer-modified-p to nil after `vc-exec-after'. * log-view.el (log-view-mode-map): Bind "q", "z", "m" and "d". (log-view-mode): Make read-only. (log-view-current-file): Do final `expand-file-name' in the current `default-directory'. (log-view-current-tag): Take an optional `where' arg. (log-view-diff): New user command.
author Sam Steingold <sds@gnu.org>
date Mon, 12 Nov 2001 23:01:17 +0000
parents 721d19071a5f
children 321a7ae8b600
files lisp/ChangeLog lisp/log-view.el lisp/vc.el
diffstat 3 files changed, 94 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Mon Nov 12 22:55:02 2001 +0000
+++ b/lisp/ChangeLog	Mon Nov 12 23:01:17 2001 +0000
@@ -1,3 +1,14 @@
+2001-11-12  Sam Steingold  <sds@gnu.org>
+
+	* vc.el (vc-print-log): Bind `inhibit-read-only' to t before and
+	set-buffer-modified-p to nil after `vc-exec-after'.
+	* log-view.el (log-view-mode-map): Bind "q", "z", "m" and "d".
+	(log-view-mode): Make read-only.
+	(log-view-current-file): Do final `expand-file-name' in the
+	current `default-directory'.
+	(log-view-current-tag): Take an optional `where' arg.
+	(log-view-diff): New user command.
+
 2001-11-12  Pavel Jan,Bm(Bk  <Pavel@Janik.cz>
 
 	* progmodes/cpp.el (cpp-choose-face): Fix typo.
--- a/lisp/log-view.el	Mon Nov 12 22:55:02 2001 +0000
+++ b/lisp/log-view.el	Mon Nov 12 23:01:17 2001 +0000
@@ -4,7 +4,7 @@
 
 ;; Author: Stefan Monnier <monnier@cs.yale.edu>
 ;; Keywords: rcs sccs cvs log version-control
-;; Revision: $Id: log-view.el,v 1.7 2001/10/29 15:46:46 kai Exp $
+;; Revision: $Id: log-view.el,v 1.8 2001/11/12 20:34:45 sds Exp $
 
 ;; This file is part of GNU Emacs.
 
@@ -35,7 +35,7 @@
 
 (eval-when-compile (require 'cl))
 (require 'pcvs-util)
-
+(autoload 'vc-version-diff "vc")
 
 (defgroup log-view nil
   "Major mode for browsing log output of RCS/CVS/SCCS."
@@ -43,7 +43,11 @@
   :prefix "log-view-")
 
 (easy-mmode-defmap log-view-mode-map
-  '(("n" . log-view-msg-next)
+  '(("q" . quit-window)
+    ("z" . kill-this-buffer)
+    ("m" . set-mark-command)
+    ("d" . log-view-diff)
+    ("n" . log-view-msg-next)
     ("p" . log-view-msg-prev)
     ("N" . log-view-file-next)
     ("P" . log-view-file-prev)
@@ -97,6 +101,8 @@
 ;;;###autoload
 (define-derived-mode log-view-mode fundamental-mode "Log-View"
   "Major mode for browsing CVS log output."
+  (set-buffer-modified-p nil)
+  (setq buffer-read-only t)
   (set (make-local-variable 'font-lock-defaults) log-view-font-lock-defaults)
   (set (make-local-variable 'cvs-minor-wrap-function) 'log-view-minor-wrap))
 
@@ -135,11 +141,12 @@
 	   (dir ""))
       (let ((default-directory ""))
 	(when pcldir (setq dir (expand-file-name pcldir dir)))
-	(when cvsdir (setq dir (expand-file-name cvsdir dir)))
-	(expand-file-name file dir)))))
+	(when cvsdir (setq dir (expand-file-name cvsdir dir))))
+      (expand-file-name file dir))))
 
-(defun log-view-current-tag ()
+(defun log-view-current-tag (&optional where)
   (save-excursion
+    (when where (goto-char where))
     (forward-line 1)
     (let ((pt (point)))
       (when (re-search-backward log-view-message-re nil t)
@@ -167,10 +174,32 @@
 	  (cvs-force-command "/F"))
       (funcall f))))
 
+;;;
+;;; diff
+;;;
+
+(defun log-view-diff (beg end)
+  "Get the diff for several revisions.
+If the point is the same as the mark, get the diff for this revision.
+Otherwise, get the diff between the revisions
+ were the region starts and ends."
+  (interactive "r")
+  (let ((fr (log-view-current-tag beg))
+        (to (log-view-current-tag end)))
+    (when (string-equal fr to)
+      (save-excursion
+        (goto-char end)
+        (log-view-msg-next)
+        (setq to (log-view-current-tag))))
+    (vc-version-diff (log-view-current-file) to fr)))
+
 (provide 'log-view)
 
 ;;; Change Log:
 ;; $Log: log-view.el,v $
+;; Revision 1.8  2001/11/12 20:34:45  sds
+;; updated (C)
+;;
 ;; Revision 1.7  2001/10/29 15:46:46  kai
 ;; (log-view-mode-map): Bind `M-n' and `M-p', not `M n'
 ;; and `M p'.
--- a/lisp/vc.el	Mon Nov 12 22:55:02 2001 +0000
+++ b/lisp/vc.el	Mon Nov 12 23:01:17 2001 +0000
@@ -6,7 +6,7 @@
 ;; Maintainer: Andre Spiegel <spiegel@gnu.org>
 ;; Keywords: tools
 
-;; $Id: vc.el,v 1.317 2001/10/29 12:26:15 spiegel Exp $
+;; $Id: vc.el,v 1.318 2001/11/09 14:55:52 spiegel Exp $
 
 ;; This file is part of GNU Emacs.
 
@@ -90,7 +90,7 @@
 ;; return it; it should not look it up in the property, and it needn't
 ;; store it there either.  However, if a backend-specific function does
 ;; store a value in a property, that value takes precedence over any
-;; value that the generic code might want to set (check for uses of 
+;; value that the generic code might want to set (check for uses of
 ;; the macro `with-vc-properties' in vc.el).
 ;;
 ;; In the list of functions below, each identifier needs to be prepended
@@ -103,7 +103,7 @@
 ;;
 ;;   Return non-nil if FILE is registered in this backend.
 ;;
-;; * state (file) 
+;; * state (file)
 ;;
 ;;   Return the current version control state of FILE.  For a list of
 ;;   possible values, see `vc-state'.  This function should do a full and
@@ -296,10 +296,10 @@
 ;;   found), or 1 (either non-empty diff or the diff is run
 ;;   asynchronously).
 ;;
-;; - diff-tree (dir &optional rev1 rev2) 
+;; - diff-tree (dir &optional rev1 rev2)
 ;;
 ;;   Insert the diff for all files at and below DIR into the *vc-diff*
-;;   buffer.  The meaning of REV1 and REV2 is the same as for 
+;;   buffer.  The meaning of REV1 and REV2 is the same as for
 ;;   vc-BACKEND-diff.  The default implementation does an explicit tree
 ;;   walk, calling vc-BACKEND-diff for each individual file.
 ;;
@@ -564,7 +564,7 @@
     (300. . "#00EEFF")
     (320. . "#00B6FF")
     (340. . "#007EFF"))
-  "*ASSOCIATION list of age versus color, for \\[vc-annotate].  
+  "*ASSOCIATION list of age versus color, for \\[vc-annotate].
 Ages are given in units of fractional days.  Default is eighteen steps
 using a twenty day increment."
   :type 'alist
@@ -1061,7 +1061,7 @@
   (zerop (vc-call diff file (vc-workfile-version file))))
 
 (defun vc-default-latest-on-branch-p (backend file)
-  "Default check whether the current workfile version of FILE is the 
+  "Default check whether the current workfile version of FILE is the
 latest on its branch."
   t)
 
@@ -1832,20 +1832,20 @@
       (vc-call diff file rel1 rel2))))
 
 (defmacro vc-diff-switches-list (backend)
-  "Make a list of `diff-switches', `vc-diff-switches', 
+  "Make a list of `diff-switches', `vc-diff-switches',
 and `vc-BACKEND-diff-switches'."
-  `(append 
+  `(append
     (if (listp diff-switches) diff-switches (list diff-switches))
     (if (listp vc-diff-switches) vc-diff-switches (list vc-diff-switches))
-    (let ((backend-switches 
-           (eval (intern (concat "vc-" (symbol-name ',backend) 
+    (let ((backend-switches
+           (eval (intern (concat "vc-" (symbol-name ',backend)
                                  "-diff-switches")))))
       (if (listp backend-switches) backend-switches (list backend-switches)))))
 
 (defun vc-default-diff-tree (backend dir rel1 rel2)
   "Default implementation for diffing an entire tree at and below DIR.
 The meaning of REL1 and REL2 is the same as for `vc-version-diff'."
-  ;; This implementation does an explicit tree walk, and calls 
+  ;; This implementation does an explicit tree walk, and calls
   ;; vc-BACKEND-diff directly for each file.  An optimization
   ;; would be to use `vc-diff-internal', so that diffs can be local,
   ;; and to call it only for files that are actually changed.
@@ -1856,15 +1856,15 @@
    default-directory
    (lambda (f)
      (vc-exec-after
-      `(let ((coding-system-for-read (vc-coding-system-for-diff ',f))) 
+      `(let ((coding-system-for-read (vc-coding-system-for-diff ',f)))
          (message "Looking at %s" ',f)
-         (vc-call-backend ',(vc-backend f) 
+         (vc-call-backend ',(vc-backend f)
                           'diff ',f ',rel1 ',rel2))))))
 
 (defun vc-coding-system-for-diff (file)
   "Return the coding system for reading diff output for FILE."
   (or coding-system-for-read
-      ;; if we already have this file open, 
+      ;; if we already have this file open,
       ;; use the buffer's coding system
       (let ((buf (find-buffer-visiting file)))
         (if buf (with-current-buffer buf
@@ -2438,7 +2438,7 @@
     (pop-to-buffer (current-buffer))
     (if (fboundp 'log-view-mode) (log-view-mode))
     (vc-exec-after
-     `(progn
+     `(let ((inhibit-read-only t))
 	(goto-char (point-max)) (forward-line -1)
 	(while (looking-at "=*\n")
 	  (delete-char (- (match-end 0) (match-beginning 0)))
@@ -2453,7 +2453,8 @@
 	  (if (vc-find-backend-function ',(vc-backend file) 'show-log-entry)
 	      (vc-call-backend ',(vc-backend file)
 			       'show-log-entry
-			       ',(vc-workfile-version file))))))))
+			       ',(vc-workfile-version file))))
+        (set-buffer-modified-p nil)))))
 
 (defun vc-default-comment-history (backend file)
   "Return a string with all log entries that were made under BACKEND for FILE."
@@ -2883,7 +2884,7 @@
 colormap by RATIO, if present.  Use the current time as offset."
   (interactive "e")
   (message "Redisplaying annotation...")
-  (vc-annotate-display 
+  (vc-annotate-display
    (if ratio (vc-annotate-time-span vc-annotate-color-map ratio)))
   (message "Redisplaying annotation...done"))
 
@@ -2908,12 +2909,12 @@
     (vc-annotate-display
      (vc-annotate-time-span		;return the scaled colormap.
       vc-annotate-color-map
-      (/ (-  (if full newest current) oldest) 
+      (/ (-  (if full newest current) oldest)
 	 (vc-annotate-car-last-cons vc-annotate-color-map)))
      (if full newest))
-    (message "Redisplaying annotation...done \(%s\)" 
-	     (if full 
-		 (format "Spanned from %.1f to %.1f days old" 
+    (message "Redisplaying annotation...done \(%s\)"
+	     (if full
+		 (format "Spanned from %.1f to %.1f days old"
 			 (- current oldest)
 			 (- current newest))
 	       (format "Spanned to %.1f days old" (- current oldest))))))
@@ -2933,39 +2934,39 @@
       (let* ((element (car menu-elements))
 	     (days (* element oldest-in-map)))
 	(setq menu-elements (cdr menu-elements))
-	(setq menu-def 
-	      (append menu-def 
+	(setq menu-def
+	      (append menu-def
 		      `([,(format "Span %.1f days" days)
 			 (unless (and (numberp vc-annotate-display-mode)
 				      (= vc-annotate-display-mode ,days))
 			   (vc-annotate-display-select nil ,days))
-			 :style toggle :selected 
+			 :style toggle :selected
 			 (and (numberp vc-annotate-display-mode)
 			      (= vc-annotate-display-mode ,days)) ])))))
-    (setq menu-def 
-	  (append menu-def 
+    (setq menu-def
+	  (append menu-def
 		  (list
 		   ["Span ..."
-		    (let ((days 
+		    (let ((days
 			   (float (string-to-number
 				   (read-string "Span how many days? ")))))
 		      (vc-annotate-display-select nil days)) t])
 		  (list "--")
-		  (list 
-		   ["Span to Oldest" 
+		  (list
+		   ["Span to Oldest"
 		    (unless (eq vc-annotate-display-mode 'scale)
 		      (vc-annotate-display-select nil 'scale))
-		    :style toggle :selected 
+		    :style toggle :selected
 		    (eq vc-annotate-display-mode 'scale)])
-		  (list 
-		   ["Span Oldest->Newest" 
+		  (list
+		   ["Span Oldest->Newest"
 		    (unless (eq vc-annotate-display-mode 'fullscale)
 		      (vc-annotate-display-select nil 'fullscale))
-		    :style toggle :selected 
+		    :style toggle :selected
 		    (eq vc-annotate-display-mode 'fullscale)])))
     ;; Define the menu
     (if (or (featurep 'easymenu) (load "easymenu" t))
-	(easy-menu-define vc-annotate-mode-menu vc-annotate-mode-map 
+	(easy-menu-define vc-annotate-mode-menu vc-annotate-mode-map
 			  "VC Annotate Display Menu" menu-def))))
 
 (defun vc-annotate-display-select (&optional buffer mode)
@@ -2978,18 +2979,18 @@
     (display-buffer buffer))
   (if (not vc-annotate-mode)		; Turn on vc-annotate-mode if not done
       (vc-annotate-mode))
-  (cond ((null vc-annotate-display-mode) (vc-annotate-display-default 
+  (cond ((null vc-annotate-display-mode) (vc-annotate-display-default
 					  vc-annotate-ratio))
 	((symbolp vc-annotate-display-mode) ; One of the auto-scaling modes
 	 (cond ((eq vc-annotate-display-mode 'scale)
 		(vc-annotate-display-autoscale))
-	       ((eq vc-annotate-display-mode 'fullscale) 
+	       ((eq vc-annotate-display-mode 'fullscale)
 		(vc-annotate-display-autoscale t))
-	       (t (error "No such display mode: %s" 
+	       (t (error "No such display mode: %s"
 			 vc-annotate-display-mode))))
 	((numberp vc-annotate-display-mode) ; A fixed number of days lookback
 	 (vc-annotate-display-default
-	  (/ vc-annotate-display-mode (vc-annotate-car-last-cons 
+	  (/ vc-annotate-display-mode (vc-annotate-car-last-cons
 				       vc-annotate-color-map))))
 	(t (error "Error in display mode select"))))
 
@@ -3028,15 +3029,15 @@
   (let* ((temp-buffer-name (concat "*Annotate " (buffer-name) "*"))
          (temp-buffer-show-function 'vc-annotate-display-select)
          (rev (vc-workfile-version (buffer-file-name)))
-         (vc-annotate-version 
-          (if prefix (read-string 
-                      (format "Annotate from version: (default %s) " rev) 
+         (vc-annotate-version
+          (if prefix (read-string
+                      (format "Annotate from version: (default %s) " rev)
                       nil nil rev)
             rev)))
-    (if prefix 
+    (if prefix
         (setq vc-annotate-display-mode
               (float (string-to-number
-                      (read-string "Annotate span days: (default 20) " 
+                      (read-string "Annotate span days: (default 20) "
                                    nil nil "20")))))
     (setq vc-annotate-backend (vc-backend (buffer-file-name)))
     (message "Annotating...")
@@ -3098,14 +3099,14 @@
 set, use it as the time base instead of the current time."
    (let ((next-time (vc-call-backend vc-annotate-backend 'annotate-time)))
      (if next-time
-	 (- (or offset 
+	 (- (or offset
 		(vc-call-backend vc-annotate-backend 'annotate-current-time))
 	    next-time))))
 
 (defun vc-default-annotate-current-time (backend)
   "Return the current time, encoded as fractional days."
   (vc-annotate-convert-time (current-time)))
-  
+
 (defun vc-annotate-display (&optional color-map offset)
   "Do the VC-Annotate display in BUFFER using COLOR-MAP, and time
 offset OFFSET (defaults to the present time).  You probably want
@@ -3133,7 +3134,7 @@
 		     (let ((tmp-face (make-face (intern face-name))))
 		       (set-face-foreground tmp-face (cdr color))
 		       (if vc-annotate-background
-			     (set-face-background tmp-face 
+			     (set-face-background tmp-face
 						  vc-annotate-background))
 		       tmp-face)))	; Return the face
 	   (point (point))