>From d871f95325ef230f0fda7aeecf1c2b6461d23183 Mon Sep 17 00:00:00 2001 From: Eric Abrahamsen Date: Thu, 31 Oct 2019 14:14:44 -0700 Subject: [PATCH] WIP on allowing Gnus backends to return headers directly * lisp/gnus/gnus-sum.el (gnus-fetch-headers): Allow the gnus-retrieve-headers backend function to directly return a list of headers, instead of inserting data to parse in the nntp-server-buffer. * lisp/gnus/nnir.el (nnir-retrieve-headers): Handle the same case when nnir calls the "real" backend function. --- lisp/gnus/gnus-sum.el | 37 ++++++++++++++++++++----------------- lisp/gnus/nnir.el | 35 +++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index f21bc7584e..e86781bd1a 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -5631,23 +5631,26 @@ gnus-summary-remove-list-identifiers (defun gnus-fetch-headers (articles &optional limit force-new dependencies) "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))) + (let ((res (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)))))) + (prog1 + (pcase res + ('nov + (gnus-get-newsgroup-headers-xover + articles force-new dependencies gnus-newsgroup-name t)) + ((pred listp) res) + ;; 'headers is the other likely value. + (_ (gnus-get-newsgroup-headers dependencies force-new))) + (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/nnir.el b/lisp/gnus/nnir.el index 7cb2d1615a..48af6067f0 100644 --- a/lisp/gnus/nnir.el +++ b/lisp/gnus/nnir.el @@ -719,22 +719,29 @@ nnir-retrieve-headers (setq parsefunc 'nnheader-parse-nov)) ('headers (setq parsefunc 'nnheader-parse-head)) + ((pred listp) + (setq headers gnus-headers-retrieved-by)) (_ (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 articleids)))) - (when art - (setf (mail-header-number novitem) art) - (push novitem headers)) - (forward-line 1))))) - (setq headers - (sort headers - (lambda (x y) - (< (mail-header-number x) (mail-header-number y))))) + (unless headers + (goto-char (point-min)) + (while (not (eobp)) + (push (funcall parsefunc) headers) + (forward-line 1))) + (setq headers + (sort + (delq nil + (mapcar + (lambda (novitem) + (let* ((artno (and novitem + (mail-header-number novitem))) + (art (car-safe (rassq artno articleids)))) + (when art + (setf (mail-header-number novitem) art) + novitem))) + headers)) + (lambda (x y) + (< (mail-header-number x) (mail-header-number y))))))) (erase-buffer) (mapc 'nnheader-insert-nov headers) 'nov))) -- 2.23.0