Patch from Dan Nicolaescu <dann@ics.uci.edu>: Improve support for

vc-annotate and log-view and make sure that they are interoperable.

[git-p4: depot-paths = "//guest/Ben_Key/vc-p4/,//guest/jonathan_kamens/vc-p4/,//guest/magnus_henoch/vc-p4/": change = 5991]
This commit is contained in:
Jonathan Kamens 2007-07-27 04:28:08 -08:00
parent 3f3aa0ac1f
commit 0ec70d5f50

View file

@ -468,6 +468,7 @@ comment COMMENT."
(vc-p4-state file nil t) (vc-p4-state file nil t)
(vc-mode-line file)))) (vc-mode-line file))))
;;; FIXME: this should not have a DESTFILE argument
(defun vc-p4-checkout (file &optional editable rev destfile) (defun vc-p4-checkout (file &optional editable rev destfile)
(if (and editable destfile (not (string= file destfile))) (if (and editable destfile (not (string= file destfile)))
(error "Can't lock a Perforce file in an alternate location.")) (error "Can't lock a Perforce file in an alternate location."))
@ -539,13 +540,23 @@ comment COMMENT."
(let ((default-directory (file-name-directory file))) (let ((default-directory (file-name-directory file)))
(p4-lowlevel-reopen file))) (p4-lowlevel-reopen file)))
(defun vc-p4-print-log (file) (defun vc-p4-print-log (file &optional buffer)
"Print Perforce log for FILE into *vc* buffer." "Print Perforce log for FILE into *vc* buffer."
(set-buffer (get-buffer-create "*vc*")) ;; `log-view-mode' needs to have the file name in order to function
;; correctly. "p4 logview" does not print it, so we insert it here by
;; hand.
;; `vc-do-command' creates the buffer, but we need it before running
;; the command.
(vc-setup-buffer buffer)
(let ((inhibit-read-only t) (let ((inhibit-read-only t)
(default-directory (file-name-directory file))) (default-directory (file-name-directory file)))
(erase-buffer) (with-current-buffer
(p4-lowlevel-filelog file (current-buffer) t t))) buffer
(p4-lowlevel-filelog file (current-buffer) t t)
;; Insert the file name at the beginning.
(goto-char (point-min))
(insert "File: " (file-name-nondirectory file) "\n"))))
(defun vc-p4-show-log-entry (version) (defun vc-p4-show-log-entry (version)
"Make sure Perforce log entry for VERSION is displayed in the "Make sure Perforce log entry for VERSION is displayed in the
@ -619,6 +630,28 @@ files under the default directory otherwise."
(kill-line))) (kill-line)))
(message "Computing change log entries... done"))) (message "Computing change log entries... done")))
(defvar log-view-message-re)
(defvar log-view-file-re)
(defvar log-view-font-lock-keywords)
(define-derived-mode vc-p4-log-view-mode log-view-mode "P4-Log-View"
(require 'add-log) ;; we need the faces add-log
(set (make-local-variable 'log-view-file-re) "^File:[ \t]+\\(.+\\)")
(set (make-local-variable 'log-view-message-re)
"^#\\([0-9]+\\) .*")
(set (make-local-variable 'log-view-font-lock-keywords)
(append `((,log-view-message-re . 'log-view-message-face)
(,log-view-file-re . 'log-view-file-face))
'(("^user:[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
(1 'change-log-email))
;; Handle the case:
;; user: FirstName LastName <foo@bar>
("^user:[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
(1 'change-log-name)
(2 'change-log-email))
("^date: \\(.+\\)" (1 'change-log-date))
("^summary:[ \t]+\\(.+\\)" (1 'log-view-message))))))
(defun vc-p4-diff (file &optional rev1 rev2) (defun vc-p4-diff (file &optional rev1 rev2)
"Do a Perforce diff into the *vc-diff* buffer." "Do a Perforce diff into the *vc-diff* buffer."
(let ((buffer (get-buffer-create "*vc-diff*")) (let ((buffer (get-buffer-create "*vc-diff*"))
@ -663,11 +696,11 @@ Annotate version VERSION if it's specified."
(starting-date (if current-prefix-arg (starting-date (if current-prefix-arg
(read-string "Starting date: (default none) "))) (read-string "Starting date: (default none) ")))
log-buffer times args) log-buffer times args)
(setq args (append (list vc-p4-annotate-command nil buffer nil) (setq args (append (list buffer nil vc-p4-annotate-command nil)
(if starting-date (if starting-date
(list "--after" starting-date)) (list "--after" starting-date))
(list full-file))) (list full-file)))
(apply 'call-process args) (apply 'vc-do-command args)
; Calculate the date of each revision, for later ; Calculate the date of each revision, for later
(setq log-buffer (p4-lowlevel-filelog file nil nil t)) (setq log-buffer (p4-lowlevel-filelog file nil nil t))
(set-buffer log-buffer) (set-buffer log-buffer)
@ -702,15 +735,26 @@ line at point and the current time."
"Returns the time of the next Perforce annotation at or after point, "Returns the time of the next Perforce annotation at or after point,
as a floating point fractional number of days." as a floating point fractional number of days."
(let ((regex (concat "^[[:space:]]*[[:digit:]]+[[:space:]]+" (let ((regex (concat "^[[:space:]]*[[:digit:]]+[[:space:]]+"
"[^[:space:]]+[[:space:]]+\\([[:digit:]]+\\)")) "[^[:space:]]+[[:space:]]+\\([[:digit:]]+\\)"
"[[:space:]]+\\([[:digit:]]+\\)"))
match) match)
(if (and (or (looking-at regex) (if (and (or (looking-at regex)
(and (re-search-forward regex nil t) (and (re-search-forward regex nil t)
(forward-line 0))) (forward-line 0)))
(setq match (assoc (match-string 1) vc-p4-change-times))) (setq match (assoc (match-string 1) vc-p4-change-times)))
(vc-annotate-convert-time (cdr match)) (progn
(goto-char (match-end 0))
(vc-annotate-convert-time (cdr match)))
nil))) nil)))
(defun vc-p4-annotate-extract-revision-at-line ()
(save-excursion
(let ((regex (concat "^[[:space:]]*[[:digit:]]+[[:space:]]+"
"[^[:space:]]+[[:space:]]+\\([[:digit:]]+\\)"
"[[:space:]]+\\([[:digit:]]+\\)")))
(beginning-of-line)
(if (looking-at regex) (match-string-no-properties 2)))))
(defun vc-p4-previous-version (file rev) (defun vc-p4-previous-version (file rev)
"Return the Perforce revision of FILE prior to REV." "Return the Perforce revision of FILE prior to REV."
(number-to-string (- (string-to-number rev) 1))) (number-to-string (- (string-to-number rev) 1)))
@ -817,4 +861,9 @@ third subblock in each conflict block."
(insert replacement))) (insert replacement)))
(if block-start t nil))) (if block-start t nil)))
(defun vc-p4-command (buffer okstatus file &rest flags)
"A wrapper around `vc-do-command' for use in vc-p4.el.
The difference to vc-do-command is that this function always invokes `p4'."
(apply 'vc-do-command buffer okstatus "p4" file flags))
(provide 'vc-p4) (provide 'vc-p4)