diff options
author | Koni Marti <koni.marti@gmail.com> | 2022-05-27 10:04:20 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2022-05-31 14:32:45 +0200 |
commit | 30d57889741cfa8284eec9b32b29144fe01002a2 (patch) | |
tree | d1a48432056e01b77cab75f6a774a2dc04cba7a8 /lib/msgstore.go | |
parent | 461726802ef10ff3a33f6f118816c2c355df55a5 (diff) | |
download | aerc-30d57889741cfa8284eec9b32b29144fe01002a2.tar.gz |
store: clean marked messages
Clean marked messages after new uids are fetched.
Commit 5c5158b3 ("store: remove callbacks on error") removed side
effects in the message store after a longer suspend period but neglected
to remove marked zombie messages.
References: https://todo.sr.ht/~rjarry/aerc/28
Co-authored-by: inwit <inwit@sindominio.net>
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'lib/msgstore.go')
-rw-r--r-- | lib/msgstore.go | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/msgstore.go b/lib/msgstore.go index 908f125e..dc18137f 100644 --- a/lib/msgstore.go +++ b/lib/msgstore.go @@ -208,6 +208,7 @@ func (store *MessageStore) Update(msg types.WorkerMessage) { store.Messages = newMap store.uids = msg.Uids sort.SortBy(store.filtered, store.uids) + store.checkMark() update = true case *types.DirectoryThreaded: var uids []uint32 @@ -228,6 +229,7 @@ func (store *MessageStore) Update(msg types.WorkerMessage) { } store.Messages = newMap store.uids = uids + store.checkMark() store.Threads = msg.Threads update = true case *types.MessageInfo: @@ -572,6 +574,22 @@ func (store *MessageStore) resetMark() { store.marked = make(map[uint32]struct{}) } +// checkMark checks that no stale uids remain marked +func (store *MessageStore) checkMark() { + for mark := range store.marked { + present := false + for _, uid := range store.uids { + if mark == uid { + present = true + break + } + } + if !present { + delete(store.marked, mark) + } + } +} + //IsMarked checks whether a MessageInfo has been marked func (store *MessageStore) IsMarked(uid uint32) bool { _, marked := store.marked[uid] |