From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Eric Abrahamsen Newsgroups: gmane.emacs.bugs Subject: bug#45033: 28.0.50; New option gnus-registery-register-all-p Date: Fri, 04 Dec 2020 09:35:52 -0800 Message-ID: <87zh2t324n.fsf@ericabrahamsen.net> References: <87tut24ej3.fsf@ericabrahamsen.net> <87blf9nanz.fsf@gnus.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="29978"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: 45033@debbugs.gnu.org To: Lars Ingebrigtsen Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Dec 04 21:09:13 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1klHOC-0007dl-U5 for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 04 Dec 2020 21:09:13 +0100 Original-Received: from localhost ([::1]:33886 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1klHOB-0005FR-TQ for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 04 Dec 2020 15:09:11 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:47490) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1klF12-0002N2-JH for bug-gnu-emacs@gnu.org; Fri, 04 Dec 2020 12:37:15 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:34005) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1klF0w-0003op-59 for bug-gnu-emacs@gnu.org; Fri, 04 Dec 2020 12:37:05 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1klF0w-0005vx-3L for bug-gnu-emacs@gnu.org; Fri, 04 Dec 2020 12:37:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Eric Abrahamsen Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 04 Dec 2020 17:37:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 45033 X-GNU-PR-Package: emacs Original-Received: via spool by 45033-submit@debbugs.gnu.org id=B45033.160710336222715 (code B ref 45033); Fri, 04 Dec 2020 17:37:02 +0000 Original-Received: (at 45033) by debbugs.gnu.org; 4 Dec 2020 17:36:02 +0000 Original-Received: from localhost ([127.0.0.1]:45542 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1klEzy-0005uI-7M for submit@debbugs.gnu.org; Fri, 04 Dec 2020 12:36:02 -0500 Original-Received: from ericabrahamsen.net ([52.70.2.18]:43410 helo=mail.ericabrahamsen.net) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1klEzw-0005to-Hw for 45033@debbugs.gnu.org; Fri, 04 Dec 2020 12:36:01 -0500 Original-Received: from localhost (c-73-254-86-141.hsd1.wa.comcast.net [73.254.86.141]) (Authenticated sender: eric@ericabrahamsen.net) by mail.ericabrahamsen.net (Postfix) with ESMTPSA id 153E3FA094; Fri, 4 Dec 2020 17:35:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ericabrahamsen.net; s=mail; t=1607103354; bh=tm2maAfQnpzdAHltO1gEOKr+7u4acl6VIrDkY1qj8xc=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From; b=sa2OzZk9891nHj6MEDMpUYkON+CWrURuqAggWikH68RezgfMGrgolSeqlWqZq/qjD FjGAX+FV7yfRbHQUtueUNMd8co2b2GAFbhJPk291EJgC41qh96lZZ4CZqTC+rwkWC4 HBNjkhxX0LPHLbk7QNQsltj4sgVfZE3iFvM8jSNE= In-Reply-To: <87blf9nanz.fsf@gnus.org> (Lars Ingebrigtsen's message of "Fri, 04 Dec 2020 11:11:12 +0100") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:195002 Archived-At: --=-=-= Content-Type: text/plain Lars Ingebrigtsen writes: > Eric Abrahamsen writes: > >> This patch introduces a new customization option, >> `gnus-registry-register-all-p', which, when nil, won't create database >> entries automatically. The registry will only contain entries that the >> user (or other packages) has created manually. If the user isn't using >> automatic splitting, this can provide a significant speedup for general >> Gnus usage. > > Makes sense to me. However, the option shouldn't have a name ending in > -p -- that's for predicate functions only. `gnus-registry-register-all' > would be a better name. Ah, I hesitated about that. Thanks. >> Discussions on gnus.general lead me to believe that universal splitting >> isn't used all that often, and that most users are very surprised to >> find that they have a 50MB registry file on disk. Therefore I've >> defaulted this option to nil, which is a change from previous behavior. >> It would be perfectly easy to default to t if this seems inappropriate. > > I think defaulting it to t makes more sense (besides being more > backwards-compatible) -- the registry isn't on by default, after all. Makes sense. Here's a new version of the patch with option name edited and docs adjusted. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-New-option-gnus-registry-register-all.patch >From 1b94a5bc72ac56a132f73b5d1732800ac0ee830d Mon Sep 17 00:00:00 2001 From: Eric Abrahamsen Date: Thu, 3 Dec 2020 15:58:57 -0800 Subject: [PATCH] New option gnus-registry-register-all * lisp/gnus/gnus-registry.el (gnus-registry-register-all): If nil, the registry won't automatically create new entries for all seen messages. Defaults to t to preserve previous behavior. (gnus-registry-handle-action): Don't automatically create entries; if one doesn't exist, don't handle anything. (gnus-registry-register-message-ids): Only register if this option is t. (gnus-registry-get-or-make-entry): Add optional no-create argument. (gnus-registry-get-id-key): This "get" operation should only create an entry if this option is t. * doc/misc/gnus.texi: Documentation and news. --- doc/misc/gnus.texi | 24 +++++++++++-- etc/NEWS | 7 ++++ lisp/gnus/gnus-registry.el | 72 +++++++++++++++++++++++--------------- 3 files changed, 71 insertions(+), 32 deletions(-) diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 4aa07ce388..3659134621 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -26260,6 +26260,16 @@ Gnus Registry Setup size, it will reject insertion of new entries. @end defvar +@defvar gnus-registry-register-all +If this option is non-nil, the registry will register all messages, as +you see them. This is important to making split-to-parent and +Message-ID references work correctly, as the registry needs to know +where all messages are, but it can slow down group opening and the +saving of Gnus. If this option is nil, entries must be created +manually, for instance by storing a custom flag or keyword for the +message. +@end defvar + @defvar gnus-registry-prune-factor This option (a float between 0 and 1) controls how much the registry is cut back during pruning. In order to prevent constant pruning, the @@ -26349,8 +26359,14 @@ Fancy splitting to parent "mail") @end lisp -in your fancy split setup. In addition, you may want to customize the -following variables. +in your fancy split setup. + +If @code{gnus-registry-register-all} is non-nil (the default), the +registry will perform splitting for all messages. If it is nil, +splitting will only happen for children of messages you've explicitly +registered. + +In addition, you may want to customize the following variables. @defvar gnus-registry-track-extra This is a list of symbols, so it's best to change it from the @@ -26423,7 +26439,9 @@ Store arbitrary data @end defun @defun gnus-registry-get-id-key (id key) -Get the data under @code{key} for message @code{id}. +Get the data under @code{key} for message @code{id}. If the option +@code{gnus-registry-register-all} is non-nil, this function will also +create an entry for @code{id} if one doesn't exist. @end defun @defvar gnus-registry-extra-entries-precious diff --git a/etc/NEWS b/etc/NEWS index 7f18f12946..0163c43e56 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -488,6 +488,13 @@ tags to be considered as well. ** Gnus ++++ +*** New user option 'gnus-registry-register-all'. + +If non-nil (the default), create registry entries for all messages. +If nil, don't automatically create entries, they must be created +manually. + +++ *** New user option 'gnus-paging-select-next'. This controls what happens when using commands like 'SPC' and 'DEL' to diff --git a/lisp/gnus/gnus-registry.el b/lisp/gnus/gnus-registry.el index 65bcd0e8a3..31aee0364c 100644 --- a/lisp/gnus/gnus-registry.el +++ b/lisp/gnus/gnus-registry.el @@ -54,6 +54,9 @@ ;; (: gnus-registry-split-fancy-with-parent) +;; This won't work as expected unless `gnus-registry-register-all' +;; is set to t. + ;; You should also consider using the nnregistry backend to look up ;; articles. See the Gnus manual for more information. @@ -160,6 +163,11 @@ gnus-registry-install (const :tag "Always Install" t) (const :tag "Ask Me" ask))) +(defcustom gnus-registry-register-all nil + "If non-nil, register all articles in the registry." + :type 'boolean + :version "28.1") + (defvar gnus-registry-enabled nil) (defvar gnus-summary-misc-menu) ;; Avoid byte compiler warning. @@ -478,8 +486,8 @@ gnus-registry-handle-action (let ((db gnus-registry-db) ;; if the group is ignored, set the destination to nil (same as delete) (to (if (gnus-registry-ignore-group-p to) nil to)) - ;; safe if not found - (entry (gnus-registry-get-or-make-entry id)) + ;; Only retrieve an existing entry, don't create a new one. + (entry (gnus-registry-get-or-make-entry id t)) (subject (gnus-string-remove-all-properties (gnus-registry-simplify-subject subject))) (sender (gnus-string-remove-all-properties sender))) @@ -488,29 +496,30 @@ gnus-registry-handle-action ;; several times but it's better to bunch the transactions ;; together - (registry-delete db (list id) nil) - (when from - (setq entry (cons (delete from (assoc 'group entry)) - (assq-delete-all 'group entry)))) - ;; Only keep the entry if the message is going to a new group, or - ;; it's still in some previous group. - (when (or to (alist-get 'group entry)) - (dolist (kv `((group ,to) - (sender ,sender) - (recipient ,@recipients) - (subject ,subject))) - (when (cadr kv) - (let ((new (or (assq (car kv) entry) - (list (car kv))))) - (dolist (toadd (cdr kv)) - (unless (member toadd new) - (setq new (append new (list toadd))))) - (setq entry (cons new - (assq-delete-all (car kv) entry)))))) - (gnus-message 10 "Gnus registry: new entry for %s is %S" - id - entry) - (gnus-registry-insert db id entry)))) + (when entry + (registry-delete db (list id) nil) + (when from + (setq entry (cons (delete from (assoc 'group entry)) + (assq-delete-all 'group entry)))) + ;; Only keep the entry if the message is going to a new group, or + ;; it's still in some previous group. + (when (or to (alist-get 'group entry)) + (dolist (kv `((group ,to) + (sender ,sender) + (recipient ,@recipients) + (subject ,subject))) + (when (cadr kv) + (let ((new (or (assq (car kv) entry) + (list (car kv))))) + (dolist (toadd (cdr kv)) + (unless (member toadd new) + (setq new (append new (list toadd))))) + (setq entry (cons new + (assq-delete-all (car kv) entry)))))) + (gnus-message 10 "Gnus registry: new entry for %s is %S" + id + entry) + (gnus-registry-insert db id entry))))) ;; Function for nn{mail|imap}-split-fancy: look up all references in ;; the cache and if a match is found, return that group. @@ -846,7 +855,8 @@ gnus-registry-find-keywords (defun gnus-registry-register-message-ids () "Register the Message-ID of every article in the group." - (unless (gnus-parameter-registry-ignore gnus-newsgroup-name) + (unless (or (gnus-parameter-registry-ignore gnus-newsgroup-name) + (null gnus-registry-register-all)) (dolist (article gnus-newsgroup-articles) (let* ((id (gnus-registry-fetch-message-id-fast article)) (groups (gnus-registry-get-id-key id 'group))) @@ -1082,12 +1092,15 @@ gnus-registry-group-count "Get the number of groups of a message, based on the message ID." (length (gnus-registry-get-id-key id 'group))) -(defun gnus-registry-get-or-make-entry (id) +(defun gnus-registry-get-or-make-entry (id &optional no-create) + "Return registry entry for ID. +If entry is not found, create a new one, unless NO-create is +non-nil." (let* ((db gnus-registry-db) ;; safe if not found (entries (registry-lookup db (list id)))) - (when (null entries) + (unless (or entries no-create) (gnus-registry-insert db id (list (list 'creation-time (current-time)) '(group) '(sender) '(subject))) (setq entries (registry-lookup db (list id)))) @@ -1098,7 +1111,8 @@ gnus-registry-delete-entries (registry-delete gnus-registry-db idlist nil)) (defun gnus-registry-get-id-key (id key) - (cdr-safe (assq key (gnus-registry-get-or-make-entry id)))) + (cdr-safe (assq key (gnus-registry-get-or-make-entry + id (null gnus-registry-register-all))))) (defun gnus-registry-set-id-key (id key vals) (let* ((db gnus-registry-db) -- 2.29.2 --=-=-=--