Subject: bug#75305: 31.0.50; gnus-refer-thread-use-search isn't exact enough about how the current group is searched

From: Eli Zaretskii <[email-masked]>
Date: Sat, 18 Jan 2025 11:34:55 +0200

Ping! Andrew and Eric, would you please review the proposed patch?

> From: Björn Bidar <[email-masked]>
> Cc: Andrew G Cohen <[email-masked]>,  Eric Abrahamsen
>  <[email-masked]>,  [email-masked]
> Date: Sun, 05 Jan 2025 22:36:13 +0200
> 
> 
> I forgot to attach the update patch, see below:
> 
> >From 8cd116f25411575fb8ad59e08ba1cde8f7d7ae12 Mon Sep 17 00:00:00 2001
> From: =?UTF-8?q?Bj=C3=B6rn=20Bidar?= <[email-masked]>
> Date: Fri, 3 Jan 2025 04:09:55 +0200
> Subject: [PATCH] Refactor gnus-refer-thread-use-search
> 
> * lisp/gnus/gnus-sum.el (gnus-refer-thread-use-search):
> Make it easier to customize the variable by adding predefine choices
> as well as descriptions to each choice. Add option to add the value
> `current' to the list of servers and groups to add the current group.
> E.g. to add another group and the current group.
> * lisp/gnus/gnus-search.el
> (gnus-refer-thread-maybe-add-current-group, gnus-search-thread):
> Add helper function to determine if the option contains
> the value current. Use helper function.
> * lisp/gnus/nnselect.el (nnselect-request-thread): Use helper
> function to check if the value current is in
> gnus-refer-thread-use-search.
> * doc/misc/gnus.texi (gnus-refer-thread-use-search):
> Include the current value in the section. Format the section
> a little better to have a paragraph for each possible value that
> the option may contain. Explain the option to have
> a list of servers more detailed , i.e. similarly to the custom
> description. Highlight that the current group is not searched
> unless specified. Explain that unless the articles of that
> thread are contained in the searched groups not adding
> the current group might not be the desired effect.
> ---
>  doc/misc/gnus.texi       | 23 +++++++++++++++++------
>  lisp/gnus/gnus-search.el | 25 ++++++++++++++++++++++---
>  lisp/gnus/gnus-sum.el    | 17 +++++++++++++----
>  lisp/gnus/nnselect.el    |  4 ++--
>  4 files changed, 54 insertions(+), 15 deletions(-)
> 
> diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
> index 200b68d2059..2e9959aeaf0 100644
> --- a/doc/misc/gnus.texi
> +++ b/doc/misc/gnus.texi
> @@ -10557,12 +10557,23 @@ Finding the Parent
>  course, it'll make group entry somewhat slow.
>  
>  @vindex gnus-refer-thread-use-search
> -If @code{gnus-refer-thread-use-search} is @code{nil} (the default)
> -then thread-referral only looks for articles in the current group.  If
> -this variable is @code{t} the server to which the current group
> -belongs is searched (provided that searching is available for the
> -server's backend).  If this variable is a list of servers, each server
> -in the list is searched.
> +If @code{gnus-refer-thread-use-search} is @code{current} or @code{nil}
> +(the default), then thread-referral only looks for articles
> +in the current group.
> +
> +If this variable is @code{t}, the server to which the current group
> +belongs is searched.  Note this is only possible provided that
> +searching is available for the server's backend.
> +
> +The value can also be a list of the form
> +@code{(@var{server} @var{group}@dots{})}, where @var{server} is the
> +server and @var{group}s are the groups belonging to the server.
> +
> +To search in the current group in addition to other groups,
> +the list of servers may contain the symbol @code{current}.
> +If @code{current} is not in the list, the current group is not searched.
> +Note this may be not the desired effect if any of articles referred in
> +the thread are not contained in any of the searched groups.
>  
>  @vindex gnus-refer-thread-limit
>  The @code{gnus-refer-thread-limit} variable says how many old (i.e.,
> diff --git a/lisp/gnus/gnus-search.el b/lisp/gnus/gnus-search.el
> index 12af8dcdfa7..959984c2ca4 100644
> --- a/lisp/gnus/gnus-search.el
> +++ b/lisp/gnus/gnus-search.el
> @@ -2206,6 +2206,24 @@ gnus-search-server-to-engine
>  
>  (declare-function gnus-registry-get-id-key "gnus-registry" (id key))
>  
> +(defun gnus-refer-thread-maybe-add-current-group (group)
> +  "Return `gnus-refer-thread-use-search' with `current' replaced by GROUP.
> +Return nil if `current' was not found or if was not a list."
> +  (cond ((eq 'current gnus-refer-thread-use-search)
> +         (list (gnus-info-method (gnus-get-info group))
> +               group))
> +        ((listp gnus-refer-thread-use-search)
> +         (let (out)
> +           (dolist (search gnus-refer-thread-use-search)
> +             (push (if (and (not (listp search)) (eq 'current search))
> +                       (list (gnus-info-method (gnus-get-info group))
> +                             group)
> +                     search)
> +                   out))
> +           out))
> +        (t
> +         nil)))
> +
>  (defun gnus-search-thread (header &optional group server)
>    "Find articles in the thread containing HEADER from GROUP on SERVER.
>  If `gnus-refer-thread-use-search' is nil only the current group is
> @@ -2227,7 +2245,8 @@ gnus-search-thread
>                              " or "))
>             (cons 'thread t)))
>           (gnus-search-use-parsed-queries t))
> -    (if (not gnus-refer-thread-use-search)
> +    (if (or (not gnus-refer-thread-use-search)
> +            (eq 'current gnus-refer-thread-use-search))
>          ;; Search only the current group and send the headers back to
>          ;; the caller to add to the summary buffer.
>          (gnus-fetch-headers
> @@ -2247,8 +2266,8 @@ gnus-search-thread
>              (thread  (gnus-search-run-query
>                        (list (cons 'search-query-spec query)
>                              (cons 'search-group-spec
> -                                  (if (listp gnus-refer-thread-use-search)
> -                                      gnus-refer-thread-use-search
> +                                  (or (gnus-refer-thread-maybe-add-current-group
> +                                       group)
>                                      (list (list server))))))))
>          (if (< (nnselect-artlist-length thread) 2)
>              (message "No other articles in thread")
> diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
> index a9caa83b15c..107e52ab8ef 100644
> --- a/lisp/gnus/gnus-sum.el
> +++ b/lisp/gnus/gnus-sum.el
> @@ -149,11 +149,20 @@ gnus-refer-thread-use-search
>  list of servers and groups (where each element is a list whose
>  car is the server and whose cdr is a list of groups on this
>  server or nil to search the entire server) searches these
> -server/groups.  This may usefully be set as a group parameter."
> -  :version "28.1"
> +server/groups.
> +
> +The list of of server and groups may contain
> +the symbol `current' to refer to the current group.
> +For example, to search in the current group in addition to other groups.
> +
> +This may usefully be set as a group parameter."
> +  :version "31.1"
>    :group 'gnus-thread
> -  :type '(restricted-sexp :match-alternatives
> -                          (listp 't 'nil)))
> +  :type '(choice (const :tag "Current group" nil)
> +                 (const :tag "All groups" t)
> +                 (repeat :tag "Server and groups"
> +                         (choice (const :tag "Current Group" current)
> +                                 (repeat :tag "Server and groups" string)))))
>  
>  (defcustom gnus-refer-thread-limit-to-thread nil
>    "If non-nil referring a thread will limit the summary buffer to
> diff --git a/lisp/gnus/nnselect.el b/lisp/gnus/nnselect.el
> index c6a1c0a9342..9d55ac27b98 100644
> --- a/lisp/gnus/nnselect.el
> +++ b/lisp/gnus/nnselect.el
> @@ -49,6 +49,7 @@
>  (require 'gnus-art)
>  (autoload 'gnus-search-run-query "gnus-search")
>  (autoload 'gnus-search-server-to-engine "gnus-search")
> +(autoload 'gnus-refer-thread-maybe-add-current-group "gnus-search")
>  
>  (eval-when-compile (require 'cl-lib))
>  
> @@ -707,8 +708,7 @@ nnselect-request-thread
>                   (group-spec
>                    (if (not gnus-refer-thread-use-search)
>                        (list (list server artgroup))
> -                    (if (listp gnus-refer-thread-use-search)
> -                        gnus-refer-thread-use-search
> +                    (or (gnus-refer-thread-maybe-add-current-group group)
>                        (list (list server)))))
>                   (ids (cons (mail-header-id header)
>                              (split-string
> -- 
> 2.45.2
>