Subject: 27.0.50; Allow use of Gnus search groups as notmuch :path search terms
From: Eric Abrahamsen <[email-masked]>
To: [email-masked]
Date: Tue, 23 Oct 2018 10:56:47 +0800
List-Id: <debbugs-submit.debbugs.gnu.org>

Searches in Gnus are always conducted on one or more groups. Right now,
using the notmuch search engine, it's not possible to turn those groups
into path: search terms in the notmuch query, though that's clearly the
sensible thing to do (it looks like rudimentary support for path
filtering was halfway added, but not quite).

This patch creates a new `nnir-notmuch-filter-group-names-function'
custom option which transforms group names into something notmuch is
likely to understand.

From 4274d95d3eece4a58b1f712fbacb3a3baaab2986 Mon Sep 17 00:00:00 2001
From: Eric Abrahamsen <[email-masked]>
Date: Tue, 23 Oct 2018 10:51:37 +0800
Subject: [PATCH] Allow use of Gnus search groups as notmuch path: search term

* lisp/gnus/nnir.el (nnir-notmuch-filter-group-names-function): New
  option governing whether and how to use Gnus' search groups as path:
  search terms to notmuch.
  (nnir-run-notmuch): Check and possibly use above variable.
---
 lisp/gnus/nnir.el | 56 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 41 insertions(+), 15 deletions(-)

diff --git a/lisp/gnus/nnir.el b/lisp/gnus/nnir.el
index 7e5f56e4dd..251e54e015 100644
--- a/lisp/gnus/nnir.el
+++ b/lisp/gnus/nnir.el
@@ -518,6 +518,26 @@ nnir-notmuch-remove-prefix
   :type '(regexp)
   :group 'nnir)
 
+(defcustom nnir-notmuch-filter-group-names-function
+  (lambda (g) (gnus-group-short-name g))
+  "Whether and how to use Gnus group names as \"path:\" search terms.
+When nil, the groups being searched in are not used as notmuch
+:path search terms.  It's still possible to use \"path:\" terms
+manually within the search query, however.
+
+When a function, map this function over all the group names.  By
+default this runs them through `gnus-group-short-name', and it is
+recommended to use this transform, at least.  Further
+transforms (for instance, converting \".\" to \"/\") can be
+added like so:
+
+\(add-function :filter-return
+   nnir-notmuch-filter-group-names-function
+   (lambda (g) (replace-regexp-in-string \"\\\\.\" \"/\" g)))"
+  :version "27.1"
+  :type '(choice function
+		 nil))
+
 ;;; Developer Extension Variable:
 
 (defvar nnir-engines
@@ -1505,23 +1525,28 @@ nnir-run-namazu
                                (> (nnir-artitem-rsv x)
                                   (nnir-artitem-rsv y)))))))))
 
-(defun nnir-run-notmuch (query server &optional _group)
+(defun nnir-run-notmuch (query server &optional groups)
   "Run QUERY against notmuch.
 Returns a vector of (group name, file name) pairs (also vectors,
-actually)."
-
-  ;; (when group
-  ;;   (error "The notmuch backend cannot search specific groups"))
+actually).  If GROUPS is a list of group names, use them to
+construct path: search terms (see the variable
+`nnir-notmuch-filter-group-names-function')."
 
   (save-excursion
-    (let ( (qstring (cdr (assq 'query query)))
-	   (groupspec (cdr (assq 'notmuch-group query)))
+    (let* ((qstring (cdr (assq 'query query)))
 	   (prefix (nnir-read-server-parm 'nnir-notmuch-remove-prefix server))
            artlist
 	   (article-pattern (if (string-match "\\`nnmaildir:"
 					      (gnus-group-server server))
-			       ":[0-9]+"
-			     "^[0-9]+$"))
+				":[0-9]+"
+			      "^[0-9]+$"))
+	   (groups (when nnir-notmuch-filter-group-names-function
+		     (mapcar nnir-notmuch-filter-group-names-function
+			     groups)))
+	   (pathquery (when groups
+			(mapconcat (lambda (g)
+				     (format " path:%s" g))
+				   groups " or")))
            artno dirnam filenam)
 
       (when (equal "" qstring)
@@ -1530,10 +1555,14 @@ nnir-run-notmuch
       (set-buffer (get-buffer-create nnir-tmp-buffer))
       (erase-buffer)
 
-      (if groupspec
-          (message "Doing notmuch query %s on %s..." qstring groupspec)
+      (if groups
+          (message "Doing notmuch query %s on %s..."
+		   qstring (mapconcat #'identity groups " "))
         (message "Doing notmuch query %s..." qstring))
 
+      (when groups
+	(setq qstring (concat qstring pathquery)))
+
       (let* ((cp-list `( ,nnir-notmuch-program
                          nil            ; input from /dev/null
                          t              ; output
@@ -1571,10 +1600,7 @@ nnir-run-notmuch
         (when (string-match article-pattern artno)
           (when (not (null dirnam))
 
-	    ;; maybe limit results to matching groups.
-	    (when (or (not groupspec)
-		      (string-match groupspec dirnam))
-	      (nnir-add-result dirnam artno "" prefix server artlist)))))
+	    (nnir-add-result dirnam artno "" prefix server artlist))))
 
       (message "Massaging notmuch output...done")
 
-- 
2.19.1