emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/gnus-select2 e841a20 2/2: Allow gnus backends to return a list o


From: Andrew G Cohen
Subject: feature/gnus-select2 e841a20 2/2: Allow gnus backends to return a list of headers
Date: Sat, 2 Nov 2019 22:58:18 -0400 (EDT)

branch: feature/gnus-select2
commit e841a206f02bcab97d1fd945548533e374b946c6
Author: Andrew G Cohen <address@hidden>
Commit: Andrew G Cohen <address@hidden>

    Allow gnus backends to return a list of headers
    
    * lisp/gnus/nnselect.el (nnselect-add-novitem): New macro.
    
      (nnselect-retrieve-headers): Allow backends to return headers as a
      list. Return this list rather than re-populating the server buffer
      with 'nov format headers.
    
    * lisp/gnus/gnus-sum.el (gnus-fetch-headers): Allow backends to return
      headers as a list. Make sure the dependencies structure is updated.
---
 lisp/gnus/gnus-sum.el | 42 ++++++++++++++++++++++++++----------------
 lisp/gnus/nnselect.el | 40 ++++++++++++++++++++++------------------
 2 files changed, 48 insertions(+), 34 deletions(-)

diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index e6329ac..f0d6297 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -5646,22 +5646,32 @@ or a straight list of headers."
   "Fetch headers of ARTICLES."
   (gnus-message 7 "Fetching headers for %s..." gnus-newsgroup-name)
   (prog1
-      (if (eq 'nov
-             (setq gnus-headers-retrieved-by
-                   (gnus-retrieve-headers
-                    articles gnus-newsgroup-name
-                    (or limit
-                        ;; We might want to fetch old headers, but
-                        ;; not if there is only 1 article.
-                        (and (or (and
-                                  (not (eq gnus-fetch-old-headers 'some))
-                                  (not (numberp gnus-fetch-old-headers)))
-                                 (> (length articles) 1))
-                             gnus-fetch-old-headers)))))
-         (gnus-get-newsgroup-headers-xover
-          articles force-new dependencies gnus-newsgroup-name t)
-       (gnus-get-newsgroup-headers dependencies force-new))
-    (gnus-message 7 "Fetching headers for %s...done" gnus-newsgroup-name)))
+      (pcase (setq gnus-headers-retrieved-by
+                  (gnus-retrieve-headers
+                   articles gnus-newsgroup-name
+                   (or limit
+                       ;; We might want to fetch old headers, but
+                       ;; not if there is only 1 article.
+                       (and (or (and
+                                 (not (eq gnus-fetch-old-headers 'some))
+                                 (not (numberp gnus-fetch-old-headers)))
+                                (> (length articles) 1))
+                            gnus-fetch-old-headers))))
+    ('nov
+     (gnus-get-newsgroup-headers-xover
+      articles force-new dependencies gnus-newsgroup-name t))
+    ('headers
+     (gnus-get-newsgroup-headers dependencies force-new))
+    ((pred listp)
+     (let ((dependencies
+           (or dependencies
+               (with-current-buffer gnus-summary-buffer
+                 gnus-newsgroup-dependencies))))
+     (delq nil (mapcar   #'(lambda (header)
+                            (gnus-dependencies-add-header
+                             header dependencies force-new))
+                        gnus-headers-retrieved-by)))))
+  (gnus-message 7 "Fetching headers for %s...done" gnus-newsgroup-name)))
 
 (defun gnus-select-newsgroup (group &optional read-all select-articles)
   "Select newsgroup GROUP.
diff --git a/lisp/gnus/nnselect.el b/lisp/gnus/nnselect.el
index 8f5cace..fc2d98b 100644
--- a/lisp/gnus/nnselect.el
+++ b/lisp/gnus/nnselect.el
@@ -65,6 +65,9 @@
 (defvar gnus-inhibit-demon)
 (defvar gnus-message-group-art)
 
+(fset 'nov 'nnheader-parse-nov)
+(fset 'headers 'nnheader-parse-head)
+
 ;; For future use
 (defvoo nnselect-directory gnus-directory
   "Directory for the nnselect backend.")
@@ -218,6 +221,14 @@ as `(keyfunc member)' and the corresponding element is just
      (nnselect-uncompress-artlist
       (gnus-group-get-parameter ,group 'nnselect-artlist t))))
 
+(defmacro nnselect-add-novitem (novitem)
+  `(let* ((novitem ,novitem)
+         (artno (and novitem
+                     (mail-header-number novitem)))
+         (art (car-safe (rassq artno artids))))
+     (when art
+       (setf (mail-header-number novitem) art)
+       (push novitem headers))))
 
 ;;; User Customizable Variables:
 
@@ -296,8 +307,7 @@ If this variable is nil, or if the provided function 
returns nil,
                   (or
                    (car-safe
                     (gnus-group-find-parameter artgroup 
'gnus-fetch-old-headers t))
-                   fetch-old))
-                 parsefunc)
+                   fetch-old)))
              (erase-buffer)
              (pcase (setq gnus-headers-retrieved-by
                           (or
@@ -306,22 +316,17 @@ If this variable is nil, or if the provided function 
returns nil,
                             (funcall 
nnselect-retrieve-headers-override-function
                                      artlist artgroup))
                            (gnus-retrieve-headers artlist artgroup fetch-old)))
-               ('nov
-                (setq parsefunc 'nnheader-parse-nov))
-               ('headers
-                (setq parsefunc 'nnheader-parse-head))
+               ((pred symbol-function)
+                (goto-char (point-min))
+                (while (not (eobp))
+                  (nnselect-add-novitem
+                   (funcall (symbol-function gnus-headers-retrieved-by)))
+                  (forward-line 1)))
+               ((pred listp)
+                (dolist (novitem gnus-headers-retrieved-by)
+                  (nnselect-add-novitem novitem) headers))
                (_ (error "Unknown header type %s while requesting articles \
-                    of group %s" gnus-headers-retrieved-by artgroup)))
-             (goto-char (point-min))
-             (while (not (eobp))
-               (let* ((novitem (funcall parsefunc))
-                      (artno (and novitem
-                                  (mail-header-number novitem)))
-                      (art (car (rassq artno artids))))
-                 (when art
-                   (setf (mail-header-number novitem) art)
-                   (push novitem headers))
-                 (forward-line 1)))))
+                    of group %s" gnus-headers-retrieved-by artgroup)))))
          (setq headers
                (sort headers
                      (lambda (x y)
@@ -330,7 +335,6 @@ If this variable is nil, or if the provided function 
returns nil,
          (mapc 'nnheader-insert-nov headers)
          'nov)))))
 
-
 (deffoo nnselect-request-article (article &optional _group server to-buffer)
   (let* ((gnus-override-method nil)
         servers group-art artlist)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]