Subject: bug#40974: 28.0.50; Prevent gnus registry from making entries when it shouldn't

From: Eric Abrahamsen <[email-masked]>
Date: Wed, 29 Apr 2020 18:31:19 -0700

The function `gnus-registry-handle-action' is meant to handle message
entries when messages are being moved/copied/deleted. Code comments
indicate that if a message is being "moved to nowhere" it's actually
being deleted, but the code doesn't actually delete the entry. In fact,
because it unilaterally creates an entry before checking what to do with
it, but then never deletes it, it will *create* entries for messages
being deleted, or moved into groups that should be ignored.

The attached patch confirms that registry information about the message
should actually be kept, before keeping it.

Eric

>From 110fe2e7e0db383d9d1782863324069bece60fd4 Mon Sep 17 00:00:00 2001
From: Eric Abrahamsen <[email-masked]>
Date: Wed, 29 Apr 2020 18:10:35 -0700
Subject: [PATCH] Prevent gnus-registry-handle-action from creating spurious
 entries

Thanks to Bob Newell for finding this.

* lisp/gnus/gnus-registry.el (gnus-registry-handle-action): If a
message entry ends up with no groups in its 'group key, that means the
entry should be deleted.
---
 lisp/gnus/gnus-registry.el | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/lisp/gnus/gnus-registry.el b/lisp/gnus/gnus-registry.el
index 480ed80ef8..f306889a7f 100644
--- a/lisp/gnus/gnus-registry.el
+++ b/lisp/gnus/gnus-registry.el
@@ -485,23 +485,25 @@ gnus-registry-handle-action
     (when from
       (setq entry (cons (delete from (assoc 'group entry))
                         (assq-delete-all '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)))
+    ;; 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.
-- 
2.26.2