From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 27133 invoked from network); 23 Dec 2021 20:56:19 -0000 Received: from lists.gnu.org (209.51.188.17) by inbox.vuxu.org with ESMTPUTF8; 23 Dec 2021 20:56:19 -0000 Received: from localhost ([::1]:54436 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n0V8L-00060O-4h for ml@inbox.vuxu.org; Thu, 23 Dec 2021 15:56:17 -0500 Received: from eggs.gnu.org ([209.51.188.92]:34382) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0V8I-00060F-2N for info-gnus-english@gnu.org; Thu, 23 Dec 2021 15:56:14 -0500 Received: from ciao.gmane.io ([116.202.254.214]:57348) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n0V8G-0004K2-Cp for info-gnus-english@gnu.org; Thu, 23 Dec 2021 15:56:13 -0500 Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1n0V8E-0007rE-IX for info-gnus-english@gnu.org; Thu, 23 Dec 2021 21:56:10 +0100 X-Injected-Via-Gmane: http://gmane.org/ To: info-gnus-english@gnu.org From: Eric Abrahamsen Subject: Re: gnus-search-engine set to gnus-search-notmuch and refer threads Date: Thu, 23 Dec 2021 12:55:55 -0800 Message-ID: <8735mj11no.fsf@ericabrahamsen.net> References: <87lf1k11ed.fsf@onenetbeyond.org> <877dd4rmof.fsf@gnus.jao.io> <87wnk6q2ym.fsf@onenetbeyond.org> <87y24ebiw8.fsf@ust.hk> <87pmpoqrxz.fsf@gnus.jao.io> <87k0fw8hmn.fsf@ericabrahamsen.net> <87fsqk8hio.fsf@ericabrahamsen.net> <87zgos9rbv.fsf@gnus.jao.io> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) Cancel-Lock: sha1:4bVqouAp5UckmUtmr6PgkgvE5NY= Received-SPF: pass client-ip=116.202.254.214; envelope-from=gegu-info-gnus-english@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: -15 X-Spam_score: -1.6 X-Spam_bar: - X-Spam_report: (-1.6 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.25, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: info-gnus-english@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Announcements and discussions for GNUS, the GNU Emacs Usenet newsreader \(in English\)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: info-gnus-english-bounces+ml=inbox.vuxu.org@gnu.org Sender: "info-gnus-english" --=-=-= Content-Type: text/plain "Jose A. Ortega Ruiz" 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) #)(# "thread:000000000001a830") > apply(#f(compiled-function (engine query-spec) #) # "thread:000000000001a830") > gnus-search-make-query-string(# "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? --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=notmuchthreads.diff 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 --=-=-=--