"Jose A. Ortega Ruiz" <[email protected]> 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?
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