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:
parent
a5c046efe3
commit
622802d3a5
1 changed files with 32 additions and 25 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue