maildir: defer the count of recent messages

Since commit 01c96e78df ("Update DirectoryInfo handling for maildir"),
flags are checked for every message of a folder when entering it.
Iterating over all messages of a folder takes a long time for large
collections of emails.

Only count the number of messages and state that the directory info
counts are not accurate. Defer the parsing of message flags in
a goroutine to have a more responsive UI.

Fixes: https://todo.sr.ht/~rjarry/aerc/16
Suggested-by: Koni Marti <koni.marti@gmail.com>
Signed-off-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
Robin Jarry 2022-01-28 13:23:25 +01:00
parent a5c046efe3
commit 622802d3a5
1 changed files with 32 additions and 25 deletions

View File

@ -132,7 +132,7 @@ func (w *Worker) getDirectoryInfo(name string) *models.DirectoryInfo {
// total unread // total unread
Unseen: 0, Unseen: 0,
AccurateCounts: true, AccurateCounts: false,
} }
dir := w.c.Dir(name) dir := w.c.Dir(name)
@ -143,32 +143,39 @@ func (w *Worker) getDirectoryInfo(name string) *models.DirectoryInfo {
return dirInfo return dirInfo
} }
for _, uid := range uids { dirInfo.Exists = len(uids)
message, err := w.c.Message(dir, uid)
if err != nil { go func() {
w.worker.Logger.Printf("could not get message: %v", err) info := dirInfo
continue for _, uid := range uids {
} message, err := w.c.Message(dir, uid)
flags, err := message.Flags() if err != nil {
if err != nil { w.worker.Logger.Printf("could not get message: %v", err)
w.worker.Logger.Printf("could not get flags: %v", err) continue
continue }
} flags, err := message.Flags()
seen := false if err != nil {
for _, flag := range flags { w.worker.Logger.Printf("could not get flags: %v", err)
if flag == maildir.FlagSeen { continue
seen = true }
seen := false
for _, flag := range flags {
if flag == maildir.FlagSeen {
seen = true
}
}
if !seen {
info.Unseen++
}
if w.c.IsRecent(uid) {
info.Recent++
} }
} }
if !seen { info.Unseen += info.Recent
dirInfo.Unseen++ info.Exists += info.Recent
} info.AccurateCounts = true
if w.c.IsRecent(uid) { }()
dirInfo.Recent++
}
}
dirInfo.Unseen += dirInfo.Recent
dirInfo.Exists = len(uids) + dirInfo.Recent
return dirInfo return dirInfo
} }