From: Eric Abrahamsen <eric@ericabrahamsen.net>
To: 38011@debbugs.gnu.org
Cc: Lars Ingebrigtsen <larsi@gnus.org>
Subject: bug#38011: 27.0.50; [PATCH] WIP on allowing Gnus backends to return header data directly
Date: Thu, 31 Oct 2019 14:34:06 -0700 [thread overview]
Message-ID: <87y2x0a9bl.fsf@ericabrahamsen.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 1789 bytes --]
Right now, Gnus backends return article header data by writing it in a
parseable format into the `nntp-server-buffer', and returning one of the
symbols 'nov or 'headers, indicating how the data should be parsed.
This isn't great because it requires backends to first munge their data
into a format that looks like the NNTP format, which is then parsed
again, which is an extra layer of data transformation. It also makes use
of the `nntp-server-buffer', which is something I'd like to work on
reducing because it causes problems with threading and introduces
potential encoding bugs.
This patch provides the possibility for backends to return their own
headers (ie a list of vectors), though it doesn't actually change any of
the backends to do that -- that will be another patch.
I have one question at this stage: the 'nov or 'headers value gets
stored into the `gnus-headers-retrieved-by' variable. That variable is
later checked in a couple of places like so:
(when (and gnus-fetch-old-headers
(eq gnus-headers-retrieved-by 'nov))
(if (eq gnus-fetch-old-headers 'invisible)
(gnus-build-all-threads)
(gnus-build-old-threads)))
If the variable is 'headers, the `gnus-build-*-threads' functions don't
get called at all.
What's the difference between 'nov and 'headers, and why can we build
threads in one case and not the other? If backends were to return their
own headers, what value should they return? I'll also note that the nnir
version of this function returns 'nov regardless of what the "real"
backend function returned -- why is that?
I would love to use some other, more direct, heuristic to decide about
building threads or not, and get rid of the
'nov/'headers/gnus-headers-retrieved-by stuff altogether, but I don't
yet know how to do that.
Eric
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-WIP-on-allowing-Gnus-backends-to-return-headers-dire.patch --]
[-- Type: text/x-patch, Size: 4186 bytes --]
From d871f95325ef230f0fda7aeecf1c2b6461d23183 Mon Sep 17 00:00:00 2001
From: Eric Abrahamsen <eric@ericabrahamsen.net>
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
next reply other threads:[~2019-10-31 21:34 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-31 21:34 Eric Abrahamsen [this message]
2019-11-01 14:12 ` bug#38011: 27.0.50; [PATCH] WIP on allowing Gnus backends to return header data directly Lars Ingebrigtsen
2019-11-01 18:41 ` Eric Abrahamsen
2019-11-01 20:52 ` Eric Abrahamsen
2019-11-02 14:49 ` Lars Ingebrigtsen
2019-11-07 23:21 ` Eric Abrahamsen
2019-11-08 21:03 ` Lars Ingebrigtsen
2019-11-08 21:43 ` Eric Abrahamsen
2019-11-08 21:58 ` Lars Ingebrigtsen
2020-03-29 19:50 ` Eric Abrahamsen
2020-04-30 4:50 ` Lars Ingebrigtsen
2020-09-27 4:13 ` Eric Abrahamsen
2020-09-27 12:16 ` Lars Ingebrigtsen
2020-09-27 23:41 ` Eric Abrahamsen
2021-01-02 3:18 ` Eric Abrahamsen
2021-01-02 5:59 ` Lars Ingebrigtsen
2021-01-02 20:49 ` Eric Abrahamsen
2021-01-03 7:45 ` Lars Ingebrigtsen
2021-01-03 19:53 ` Eric Abrahamsen
2021-01-04 9:05 ` Lars Ingebrigtsen
2021-01-04 18:09 ` Eric Abrahamsen
2021-01-05 8:47 ` Lars Ingebrigtsen
2021-01-05 17:02 ` Eric Abrahamsen
2021-01-17 5:00 ` Eric Abrahamsen
2021-01-18 10:48 ` Robert Pluim
2021-01-18 21:12 ` Eric Abrahamsen
2021-01-18 16:37 ` Lars Ingebrigtsen
2021-01-03 19:54 ` Eric Abrahamsen
2021-01-03 21:38 ` Eric Abrahamsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y2x0a9bl.fsf@ericabrahamsen.net \
--to=eric@ericabrahamsen.net \
--cc=38011@debbugs.gnu.org \
--cc=larsi@gnus.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).