]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/vc/vc.el (vc-log-search): New command (bug#36644).
authorJuri Linkov <juri@linkov.net>
Mon, 15 Jul 2019 22:27:19 +0000 (01:27 +0300)
committerJuri Linkov <juri@linkov.net>
Mon, 15 Jul 2019 22:27:19 +0000 (01:27 +0300)
* lisp/vc/vc-git.el (vc-git-log-search): New function.
(vc-git-log-view-mode): Check vc-log-view-type for log-search.

etc/NEWS
lisp/vc/vc-git.el
lisp/vc/vc.el

index edba159bd499399c4e9bb5584672ccf30a13a51b..76ea1df8213e2dba121aba1ff6412fea7e0e6ca3 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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.
index 8b828563325768c80e257edf2f51a9563cfcceba..5b61a7b4bc225cd2bcaa871bf6618e3c74cf79e5 100644 (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
index eb6d6d331fea03008eee1448027315d971a96ec3..a68beb5e50563accff3fc03745532c404cf12757 100644 (file)
 ;;   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.