X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/cdbb990f7884be01a1945822f38297aa6ef26293..9c0c2af5a157eca18c86f644121f7eac5488dbda:/lisp/log-view.el diff --git a/lisp/log-view.el b/lisp/log-view.el index 46cefeae8a..a6f736d16f 100644 --- a/lisp/log-view.el +++ b/lisp/log-view.el @@ -1,11 +1,9 @@ -;;; log-view.el --- Major mode for browsing CVS log output +;;; log-view.el --- Major mode for browsing RCS/CVS/SCCS log output -;; Copyright (C) 1999-2000 Free Software Foundation, Inc. +;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. ;; Author: Stefan Monnier -;; Keywords: pcl-cvs cvs log -;; Version: $Name: $ -;; Revision: $Id: log-view.el,v 1.1 2000/03/11 03:42:28 monnier Exp $ +;; Keywords: rcs sccs cvs log version-control ;; This file is part of GNU Emacs. @@ -30,37 +28,45 @@ ;; - add compatibility with cvs-log.el ;; - add ability to modify a log-entry (via cvs-mode-admin ;-) +;; - remove references to cvs-* ;;; Code: (eval-when-compile (require 'cl)) -;;(require 'pcvs-defs) (require 'pcvs-util) - +(autoload 'vc-version-diff "vc") (defgroup log-view nil - "Major mode for browsing log output for PCL-CVS." + "Major mode for browsing log output of RCS/CVS/SCCS." :group 'pcl-cvs :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) + ;; ("e" . cvs-mode-edit-log) + ("d" . log-view-diff) + ("f" . log-view-find-version) + ("n" . log-view-msg-next) ("p" . log-view-msg-prev) ("N" . log-view-file-next) ("P" . log-view-file-prev) - ("M-n" . log-view-file-next) - ("M-p" . log-view-file-prev)) + ("\M-n" . log-view-file-next) + ("\M-p" . log-view-file-prev)) "Log-View's keymap." :group 'log-view - :inherit 'cvs-mode-map) + ;; Here I really need either buffer-local keymap-inheritance + ;; or a minor-mode-map with lower precedence than the local map. + :inherit (if (boundp 'cvs-mode-map) cvs-mode-map)) (defvar log-view-mode-hook nil "Hook run at the end of `log-view-mode'.") (defface log-view-file-face '((((class color) (background light)) - (:background "grey70" :bold t)) - (t (:bold t))) + (:background "grey70" :weight bold)) + (t (:weight bold))) "Face for the file header line in `log-view-mode'." :group 'log-view) (defvar log-view-file-face 'log-view-file-face) @@ -68,7 +74,7 @@ (defface log-view-message-face '((((class color) (background light)) (:background "grey85")) - (t (:bold t))) + (t (:weight bold))) "Face for the message header line in `log-view-mode'." :group 'log-view) (defvar log-view-message-face 'log-view-message-face) @@ -78,24 +84,26 @@ "Working file: \\(.+\\)" "\\|SCCS/s\\.\\(.+\\):" "\\)\n")) -(defconst log-view-message-re "^\\(revision \\([.0-9]+\\)\\|D \\([.0-9]+\\) .*\\)$") +;; In RCS, a locked revision will look like "revision N.M\tlocked by: FOO". +(defconst log-view-message-re "^\\(revision \\([.0-9]+\\)\\(?:\t.*\\)?\\|rev \\([0-9]+\\): .*\\|D \\([.0-9]+\\) .*\\)$") (defconst log-view-font-lock-keywords `((,log-view-file-re - (2 'cvs-filename-face nil t) - (3 'cvs-filename-face nil t) - (0 'log-view-file-face append)) + (2 (if (boundp 'cvs-filename-face) cvs-filename-face) nil t) + (3 (if (boundp 'cvs-filename-face) cvs-filename-face) nil t) + (0 log-view-file-face append)) (,log-view-message-re . log-view-message-face))) (defconst log-view-font-lock-defaults '(log-view-font-lock-keywords t nil nil nil)) -;;;; +;;;; ;;;; Actual code -;;;; +;;;; ;;;###autoload (define-derived-mode log-view-mode fundamental-mode "Log-View" "Major mode for browsing CVS log output." + (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)) @@ -107,6 +115,13 @@ (easy-mmode-define-navigation log-view-msg log-view-message-re "log message") (easy-mmode-define-navigation log-view-file log-view-file-re "file") +(defun log-view-goto-rev (rev) + (goto-char (point-min)) + (ignore-errors + (while (not (equal rev (log-view-current-tag))) + (log-view-msg-next)) + t)) + ;;;; ;;;; Linkage to PCL-CVS (mostly copied from cvs-status.el) ;;;; @@ -121,20 +136,22 @@ (let* ((file (or (match-string 2) (match-string 3))) (cvsdir (and (re-search-backward log-view-dir-re nil t) (match-string 1))) - (pcldir (and (re-search-backward cvs-pcl-cvs-dirchange-re nil t) + (pcldir (and (boundp 'cvs-pcl-cvs-dirchange-re) + (re-search-backward cvs-pcl-cvs-dirchange-re nil t) (match-string 1))) (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) - (let ((rev (or (match-string 2) (match-string 3)))) + (let ((rev (or (match-string 2) (match-string 3) (match-string 4)))) (unless (re-search-forward log-view-file-re pt t) rev)))))) @@ -143,8 +160,7 @@ (cons (cons (log-view-current-file) (log-view-current-tag)) - (when (ignore-errors (mark)) - ;; `mark-active' is not provided by XEmacs :-( + (when mark-active (save-excursion (goto-char (mark)) (cons (log-view-current-file) @@ -159,9 +175,34 @@ (cvs-force-command "/F")) (funcall f)))) -(provide 'log-view) +(defun log-view-find-version (pos) + "Visit the version at point." + (interactive "d") + (save-excursion + (goto-char pos) + (switch-to-buffer (vc-find-version (log-view-current-file) + (log-view-current-tag))))) + +;; +;; 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))) -;;; Change Log: -;; $Log$ +(provide 'log-view) +;;; arch-tag: 0d64220b-ce7e-4f62-9c2a-6b04c2f81f4f ;;; log-view.el ends here