Announcements and discussions for Gnus, the GNU Emacs Usenet newsreader
 help / color / mirror / Atom feed
From: Eric Abrahamsen <eric@ericabrahamsen.net>
To: info-gnus-english@gnu.org
Subject: Re: gnus-search-engine set to gnus-search-notmuch and refer threads
Date: Thu, 23 Dec 2021 12:55:55 -0800	[thread overview]
Message-ID: <8735mj11no.fsf@ericabrahamsen.net> (raw)
In-Reply-To: <87zgos9rbv.fsf@gnus.jao.io>

[-- Attachment #1: Type: text/plain, Size: 2757 bytes --]

"Jose A. Ortega Ruiz" <jao@gnu.org> writes:

> On Wed, Dec 22 2021, Eric Abrahamsen wrote:
>
> [...]
>
>> My guess is that we need to go to point-min right here.
>>
>>> 	  (while (re-search-forward "^thread:\\([^ ]+\\)" (point-max) t)
>>> 	    (push (match-string 1) thread-ids))
>>> 	  (cl-call-next-method
>>> 	   engine server
>>> 	   ;; Completely replace the query with our new thread-based one.
>>> 	   (mapconcat (lambda (thrd) (concat "thread:" thrd))
>>> 		      thread-ids " or ")
>>> 	   nil)))
>>>     (cl-call-next-method engine server query groups)))
>
> it's not enough.  before that, there's a problem with invoking the
> search for threads, because notmuch is passed the flag --duplicate=1,
> and that's not accepted for format thread:
>
>   Error: --duplicate=N is only supported with --output=files and --output=messages.
>
> funny thing is that that flag is added for no apparent reason in line
> 1633 of gnus-search.el:
>
>  	"--duplicate=1" ; I have found this necessary, I don't know why.
>
> i don't know why either because searches seem to work without it :).
> if one eliminates that flag and adds your suggested (goto-char
> (point-min)) we are not out the woods yet: the thread id is read, but
> including an eol, so one needs
>
>   (while (re-search-forward "^thread:\\([^\n ]+\\)" (point-max) t)
>                                          ^^^^
>
> and then, we still fail, because that leads, somehow to an error of the
> form:
>
>   Debugger entered--Lisp error: (wrong-type-argument listp "thread:000000000001a830")
>      alist-get(parsed-query "thread:000000000001a830")
>      #f(compiled-function (engine query-spec) #<bytecode 0x1fd1b560df8c2360>)(#<gnus-search-notmuch gnus-search-notmuch-157d5a02af62> "thread:000000000001a830")
>      apply(#f(compiled-function (engine query-spec) #<bytecode 0x1fd1b560df8c2360>) #<gnus-search-notmuch gnus-search-notmuch-157d5a02af62> "thread:000000000001a830")
>      gnus-search-make-query-string(#<gnus-search-notmuch gnus-search-notmuch-157d5a02af62> "thread:000000000001a830")
>
> which indicates that the notmuch method for
> gnus-search-make-query-string is buggy: it doesn't know how to parse
> "thread:000000000001a830" queries...  and here i ran out of steam, but
> the fix seems nearby :)

Here's what I've got so far, would you try it out? I'm not sure about
notmuch not knowing how to parse a "thread:000000000001a830" query, it
looks like it handles it fine to me:

(let* ((engine (make-instance 'gnus-search-notmuch))
       (query "thread:23434223455")
       (parsed-query (gnus-search-parse-query query)))
  (gnus-search-make-query-string engine `((query ,query)
					  (parsed-query . ,parsed-query))))

=> "thread:23434223455"

Am I misunderstanding something?


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: notmuchthreads.diff --]
[-- Type: text/x-patch, Size: 1532 bytes --]

diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el
index d64c0cb90c..bb7fd47eb6 100644
--- a/lisp/gnus/gnus-search.el
+++ b/lisp/gnus/gnus-search.el
@@ -1606,13 +1606,17 @@ gnus-search-run-search
 			    proc-buffer program cp-list))
 	  (while (process-live-p proc)
 	    (accept-process-output proc))
-	  (while (re-search-forward "^thread:\\([^ ]+\\)" (point-max) t)
-	    (push (match-string 1) thread-ids))
+          (goto-char (point-min))
+	  (while (re-search-forward "^thread:\\([^[:space:]\n]+\\)" (point-max) t)
+	    (cl-pushnew (match-string 1) thread-ids :test #'equal))
 	  (cl-call-next-method
 	   engine server
-	   ;; Completely replace the query with our new thread-based one.
-	   (mapconcat (lambda (thrd) (concat "thread:" thrd))
-		      thread-ids " or ")
+	   ;; If we found threads, completely replace the query with
+	   ;; our new thread-based one.
+           (if thread-ids
+	       (mapconcat (lambda (thrd) (concat "thread:" thrd))
+		          thread-ids " or ")
+             query)
 	   nil)))
     (cl-call-next-method engine server query groups)))
 
@@ -1629,8 +1633,9 @@ gnus-search-indexed-search-command
 	"search"
 	,(if thread
 	     "--output=threads"
-	   "--output=files")
-	"--duplicate=1" ; I have found this necessary, I don't know why.
+           ;; No one knows why this "duplicate" flag is necessary, but
+           ;; it doesn't work with a thread search.
+	   "--output=files --duplicate=1")
 	,@switches
 	,(if limit (format "--limit=%d" limit) "")
 	,qstring

  parent reply	other threads:[~2021-12-23 20:56 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <87lf1k11ed.fsf@onenetbeyond.org>
2021-11-19 19:05 ` jao
2021-12-14 21:41   ` dal-blazej
2021-12-15 17:41     ` Eric Abrahamsen
2021-12-18 23:22       ` dal-blazej
2021-12-21  5:56     ` Andrew Cohen
2021-12-22 20:56       ` Jose A. Ortega Ruiz
2021-12-22 21:16         ` Eric Abrahamsen
2021-12-22 21:19           ` Eric Abrahamsen
2021-12-22 23:01             ` Jose A. Ortega Ruiz
2021-12-23  0:30               ` Eric Abrahamsen
2021-12-23  3:34                 ` Jose A. Ortega Ruiz
2021-12-23 20:55               ` Eric Abrahamsen [this message]
2021-12-24  3:08                 ` Jose A. Ortega Ruiz
2021-12-27 21:54                   ` Jose A. Ortega Ruiz
2021-12-30 23:51                     ` Eric Abrahamsen
2021-12-31  0:07                       ` Andrew Cohen
2021-12-31  0:20                         ` Eric Abrahamsen
2021-12-31  0:37                           ` Andrew Cohen
2021-12-31  1:13                             ` Eric Abrahamsen
2021-12-31  2:57                         ` Jose A. Ortega Ruiz
2021-12-31  1:39                       ` jao
2022-02-17 21:11                         ` Eric Abrahamsen
2022-02-18  0:22                           ` Andrew Cohen
2022-02-18  7:36                           ` Eric Abrahamsen
2022-02-18  1:20 Eric Abrahamsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8735mj11no.fsf@ericabrahamsen.net \
    --to=eric@ericabrahamsen.net \
    --cc=info-gnus-english@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).