File 0009-Refactor-gnus-refer-thread-use-search.patch of Package emacs

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Bidar?= <bjorn.bidar@thaodan.de>
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 41ec75a5ed2eebc77428a4e92afad2a6fbc24cf0..6848f6c370c60bc6d37f157fc7b2ff5c8bc7c6aa 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 f7599adf88e91224479f3c577992d1268875b037..9c06de6fc8580e839c18e6799999807009aaf478 100644
--- a/lisp/gnus/gnus-search.el
+++ b/lisp/gnus/gnus-search.el
@@ -2205,6 +2205,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
@@ -2226,7 +2244,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
@@ -2246,8 +2265,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 c909d9cfd5c4bf3fb1021835f1990478c39afeab..18421d52e91043c7031b41dd8db4c5a574390211 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 19d3936777f1dd7b920d75ebe320b1644b476c12..f001c5e179e299bdae5a9d47bcbd2b3f41b5ac80 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
openSUSE Build Service is sponsored by