* lisp/vc/vc-git.el (vc-git-log-search): New function.
(vc-git-log-view-mode): Check vc-log-view-type for log-search.
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.
"@{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)))
(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.
(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
;; 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
(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.