* lisp/vc/vc.el (vc-log-search): New command (bug#36644).

* lisp/vc/vc-git.el (vc-git-log-search): New function.
(vc-git-log-view-mode): Check vc-log-view-type for log-search.
This commit is contained in:
Juri Linkov 2019-07-16 01:27:19 +03:00
parent 6253541c76
commit cdec5a17fd
3 changed files with 44 additions and 2 deletions

View file

@ -695,6 +695,14 @@ buffers will delete the marked files (or if no files are marked, the
file under point). This command does not notify the VC backend, and
is mostly useful for unregistered files.
*** New command 'vc-log-search' asks for a pattern string, searches
it in the revision log, and displays matched log entries in the
log buffer. For example, 'M-x vc-log-search RET bug#36644 RET'
displays all entries whose log messages match the bug number.
With a prefix argument asks for a command, so for example,
'C-u M-x vc-log-search RET git log -1 f302475 RET' will display
just one log entry found by its revision number.
** Diff mode
+++
*** Hunks are now automatically refined by font-lock.

View file

@ -1073,6 +1073,22 @@ If LIMIT is a revision string, use it as an end-revision."
"@{upstream}"
remote-location))))
(defun vc-git-log-search (buffer pattern)
(let ((args `("log" "--no-color" "-i"
,(format "--grep=%s"
(or (and pattern (shell-quote-argument pattern))
"")))))
(when current-prefix-arg
(setq args (cdr (split-string
(read-shell-command
"Search log with command: "
(format "%s %s" vc-git-program
(mapconcat 'identity args " "))
'vc-git-history)
" " t))))
(vc-setup-buffer buffer)
(apply 'vc-git-command buffer 'async nil args)))
(defun vc-git-mergebase (rev1 &optional rev2)
(unless rev2 (setq rev2 "HEAD"))
(string-trim-right (vc-git--run-command-string nil "merge-base" rev1 rev2)))
@ -1089,7 +1105,7 @@ If LIMIT is a revision string, use it as an end-revision."
(set (make-local-variable 'log-view-file-re) regexp-unmatchable)
(set (make-local-variable 'log-view-per-file-logs) nil)
(set (make-local-variable 'log-view-message-re)
(if (not (eq vc-log-view-type 'long))
(if (not (memq vc-log-view-type '(long log-search)))
(cadr vc-git-root-log-format)
"^commit *\\([0-9a-z]+\\)"))
;; Allow expanding short log entries.
@ -1098,7 +1114,7 @@ If LIMIT is a revision string, use it as an end-revision."
(set (make-local-variable 'log-view-expanded-log-entry-function)
'vc-git-expanded-log-entry))
(set (make-local-variable 'log-view-font-lock-keywords)
(if (not (eq vc-log-view-type 'long))
(if (not (memq vc-log-view-type '(long log-search)))
(list (cons (nth 1 vc-git-root-log-format)
(nth 2 vc-git-root-log-format)))
(append

View file

@ -337,6 +337,10 @@
;; Insert in BUFFER the revision log for the changes that will be
;; received when performing a pull operation from REMOTE-LOCATION.
;;
;; - log-search (pattern)
;;
;; Search for string PATTERN in the revision log.
;;
;; - log-view-mode ()
;;
;; Mode to use for the output of print-log. This defaults to
@ -2526,6 +2530,20 @@ When called interactively with a prefix argument, prompt for REMOTE-LOCATION."
(vc-incoming-outgoing-internal backend (or remote-location "")
"*vc-outgoing*" 'log-outgoing)))
;;;###autoload
(defun vc-log-search (pattern)
"Search a log of changes for PATTERN string.
Display all entries that match log messages in long format.
With a prefix argument, ask for a command to run that will output
log entries."
(interactive (list (unless current-prefix-arg
(read-regexp "Search log with pattern: "))))
(let ((backend (vc-deduce-backend)))
(unless backend
(error "Buffer is not version controlled"))
(vc-incoming-outgoing-internal backend pattern
"*vc-search-log*" 'log-search)))
;;;###autoload
(defun vc-log-mergebase (_files rev1 rev2)
"Show a log of changes between the merge base of REV1 and REV2 revisions.