From 47f0b35ef3d1ac82846ba6e641ad783e0f378a6a Mon Sep 17 00:00:00 2001 From: Andrew Cohen Date: Sun, 24 Jul 2011 00:19:29 +0000 Subject: [PATCH] Merge changes made in Gnus trunk. nnir.el (nnir-search-thread): New function to make an nnir group based on a thread query. gnus-sum.el (gnus-refer-thread-use-nnir): New variable to control use of nnir in thread referral. (gnus-summary-refer-thread): Use it. nnimap.el (nnimap-request-thread): Use it. --- lisp/gnus/ChangeLog | 11 +++++++++ lisp/gnus/gnus-sum.el | 55 ++++++++++++++++++++++++++++--------------- lisp/gnus/nnimap.el | 20 +++++++++------- lisp/gnus/nnir.el | 11 +++++++++ 4 files changed, 69 insertions(+), 28 deletions(-) diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index a8065fc5ca4..400abd51c27 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,14 @@ +2011-07-23 Andrew Cohen + + * nnir.el (nnir-search-thread): New function to make an nnir group + based on a thread query. + + * gnus-sum.el (gnus-refer-thread-use-nnir): New variable to control use + of nnir in thread referral. + (gnus-summary-refer-thread): Use it. + + * nnimap.el (nnimap-request-thread): Use it. + 2011-07-20 Lars Magne Ingebrigtsen * shr.el (shr-tag-comment): Ignore HTML comments. diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index 6e8fc63d79f..5917c9d7cef 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -118,6 +118,13 @@ If t, fetch all the available old headers." :type '(choice number (sexp :menu-tag "other" t))) +(defcustom gnus-refer-thread-use-nnir nil + "*Use nnir to search an entire server when referring threads. A +nil value will only search for thread-related articles in the +current group." + :group 'gnus-thread + :type 'boolean) + (defcustom gnus-summary-make-false-root 'adopt "*nil means that Gnus won't gather loose threads. If the root of a thread has expired or been read in a previous @@ -8972,11 +8979,16 @@ Return the number of articles fetched." result)) (defun gnus-summary-refer-thread (&optional limit) - "Fetch all articles in the current thread. -If no backend-specific 'request-thread function is available -fetch LIMIT (the numerical prefix) old headers. If LIMIT is nil -fetch what's specified by the `gnus-refer-thread-limit' -variable." + "Fetch all articles in the current thread. For backends that +know how to search for threads (currently only 'nnimap) a +non-numeric prefix arg will use nnir to search the entire +server; without a prefix arg only the current group is +searched. If the variable `gnus-refer-thread-use-nnir' is +non-nil the prefix arg has the reverse meaning. If no +backend-specific 'request-thread function is available fetch +LIMIT (the numerical prefix) old headers. If LIMIT is +non-numeric or nil fetch the number specified by the +`gnus-refer-thread-limit' variable." (interactive "P") (gnus-warp-to-article) (let* ((header (gnus-summary-article-header)) @@ -8984,13 +8996,16 @@ variable." (gnus-inhibit-demon t) (gnus-summary-ignore-duplicates t) (gnus-read-all-available-headers t) - (limit (if limit (prefix-numeric-value limit) - gnus-refer-thread-limit)) + (gnus-refer-thread-use-nnir + (if (and (not (null limit)) (listp limit)) + (not gnus-refer-thread-use-nnir) gnus-refer-thread-use-nnir)) (new-headers (if (gnus-check-backend-function 'request-thread gnus-newsgroup-name) (gnus-request-thread header gnus-newsgroup-name) - (let* ((last (if (numberp limit) + (let* ((limit (if (numberp limit) (prefix-numeric-value limit) + gnus-refer-thread-limit)) + (last (if (numberp limit) (min (+ (mail-header-number header) limit) gnus-newsgroup-highest) @@ -9005,17 +9020,19 @@ variable." (regexp-opt (append refs (list id subject))))))) (gnus-fetch-headers (list last) (if (numberp limit) (* 2 limit) limit) t))))) - (dolist (header new-headers) - (when (member (mail-header-number header) gnus-newsgroup-unselected) - (push (mail-header-number header) gnus-newsgroup-unreads) - (setq gnus-newsgroup-unselected - (delete (mail-header-number header) gnus-newsgroup-unselected)))) - (setq gnus-newsgroup-headers - (gnus-delete-duplicate-headers - (gnus-merge - 'list gnus-newsgroup-headers new-headers - 'gnus-article-sort-by-number))) - (gnus-summary-limit-include-thread id))) + (when (listp new-headers) + (dolist (header new-headers) + (when (member (mail-header-number header) gnus-newsgroup-unselected) + (push (mail-header-number header) gnus-newsgroup-unreads) + (setq gnus-newsgroup-unselected + (delete (mail-header-number header) + gnus-newsgroup-unselected)))) + (setq gnus-newsgroup-headers + (gnus-delete-duplicate-headers + (gnus-merge + 'list gnus-newsgroup-headers new-headers + 'gnus-article-sort-by-number))) + (gnus-summary-limit-include-thread id)))) (defun gnus-summary-refer-article (message-id) "Fetch an article specified by MESSAGE-ID." diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el index 385522759b6..8a0d635ef7b 100644 --- a/lisp/gnus/nnimap.el +++ b/lisp/gnus/nnimap.el @@ -1566,15 +1566,17 @@ textual parts.") (articles &optional limit force-new dependencies)) (deffoo nnimap-request-thread (header &optional group server) - (when (nnimap-possibly-change-group group server) - (let* ((cmd (nnimap-make-thread-query header)) - (result (with-current-buffer (nnimap-buffer) - (nnimap-command "UID SEARCH %s" cmd)))) - (when result - (gnus-fetch-headers - (and (car result) (delete 0 (mapcar #'string-to-number - (cdr (assoc "SEARCH" (cdr result)))))) - nil t))))) + (if gnus-refer-thread-use-nnir + (nnir-search-thread header) + (when (nnimap-possibly-change-group group server) + (let* ((cmd (nnimap-make-thread-query header)) + (result (with-current-buffer (nnimap-buffer) + (nnimap-command "UID SEARCH %s" cmd)))) + (when result + (gnus-fetch-headers + (and (car result) (delete 0 (mapcar #'string-to-number + (cdr (assoc "SEARCH" (cdr result)))))) + nil t)))))) (defun nnimap-possibly-change-group (group server) (let ((open-result t)) diff --git a/lisp/gnus/nnir.el b/lisp/gnus/nnir.el index 9840dddcb66..e6420a4d7bb 100644 --- a/lisp/gnus/nnir.el +++ b/lisp/gnus/nnir.el @@ -289,6 +289,7 @@ is `(valuefunc member)'." (autoload 'nnimap-buffer "nnimap") (autoload 'nnimap-command "nnimap") (autoload 'nnimap-possibly-change-group "nnimap") + (autoload 'nnimap-make-thread-query "nnimap") (autoload 'gnus-registry-action "gnus-registry") (defvar gnus-registry-install)) @@ -1649,6 +1650,16 @@ server is of form 'backend:name'." (nnir-open-server server))) +(defun nnir-search-thread (header) + "Make an nnir group based on the thread containing the article header" + (let ((parm (list + (cons 'query + (nnimap-make-thread-query header)) + (cons 'criteria "") + (cons 'server (gnus-method-to-server + (gnus-find-method-for-group + gnus-newsgroup-name)))))) + (gnus-group-make-nnir-group nil parm))) ;; unused? (defun nnir-artlist-groups (artlist) -- 2.39.2