aboutsummaryrefslogtreecommitdiff
path: root/worker
diff options
context:
space:
mode:
authorMoritz Poldrack <git@moritz.sh>2023-12-22 21:12:55 +0100
committerRobin Jarry <robin@jarry.cc>2023-12-30 15:42:09 +0100
commit087b331d2e97411b945b95e4f0bb379f0ad7d1ae (patch)
tree8d3e7f26546e19d53c89f51b00627c423a56b68f /worker
parent49a8cf10935f2792e1ce825e4fc31d1878b3d08c (diff)
downloadaerc-087b331d2e97411b945b95e4f0bb379f0ad7d1ae.tar.gz
aerc-087b331d2e97411b945b95e4f0bb379f0ad7d1ae.zip
imap: show parseable messages on error
Currently if there are mails aerc can not properly handle, listing the mailbox is aborted. This is especially bothersome if the message one is looking for would be parseable without issue. Show an error if parsing of a message fails, but handle all other messages as normal. This leads to those messages showing up as still loading. Signed-off-by: Moritz Poldrack <git@moritz.sh> Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'worker')
-rw-r--r--worker/imap/fetch.go25
1 files changed, 13 insertions, 12 deletions
diff --git a/worker/imap/fetch.go b/worker/imap/fetch.go
index 0c923bf0..12e2fbdd 100644
--- a/worker/imap/fetch.go
+++ b/worker/imap/fetch.go
@@ -239,22 +239,19 @@ func (imapw *IMAPWorker) handleFetchMessages(
msg types.WorkerMessage, uids []uint32, items []imap.FetchItem,
procFunc func(*imap.Message) error,
) {
+ var err error
messages := make(chan *imap.Message)
- done := make(chan error)
+ done := make(chan []error)
go func() {
defer log.PanicHandler()
- var reterr error
- for _msg := range messages {
- err := procFunc(_msg)
+ var reterr []error
+ for msg := range messages {
+ err := procFunc(msg)
if err != nil {
- if reterr == nil {
- reterr = err
- }
- // drain the channel upon error
- for range messages {
- }
+ log.Errorf("failed to process message <%d>: %v", msg.Uid, err)
+ reterr = append(reterr, err)
}
}
done <- reterr
@@ -268,11 +265,15 @@ func (imapw *IMAPWorker) handleFetchMessages(
}
set := toSeqSet(uids)
- if err := imapw.client.UidFetch(set, items, messages); err != nil {
+ if err = imapw.client.UidFetch(set, items, messages); err != nil {
emitErr(err)
return
}
- if err := <-done; err != nil {
+ if errs := <-done; len(errs) != 0 {
+ err = errs[0]
+ if len(errs) > 1 {
+ err = fmt.Errorf("parsing of %d messages failed", len(errs))
+ }
emitErr(err)
return
}