aboutsummaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorKoni Marti <koni.marti@gmail.com>2022-08-08 22:21:43 +0200
committerRobin Jarry <robin@jarry.cc>2022-08-22 09:30:37 +0200
commit16dbb9422120a2f229524f1cbee55f09e455b1d7 (patch)
tree6ee55215802e3993a4c628c3bbcde6d7a5068881 /commands
parent22e6c9e4fac70c9542d10464f88553c1f20ce577 (diff)
downloadaerc-16dbb9422120a2f229524f1cbee55f09e455b1d7.tar.gz
util: fetch message headers for nil messages
Fix large archive operations that covers messages in the store with unfetched headers. Commit e5ad877af562 ("msgstore: fetch missing headers in visual mode") fixed this for the visual selection mode but omitted the case when 'mark -a' is used to mark all messages. Signed-off-by: Koni Marti <koni.marti@gmail.com> Acked-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'commands')
-rw-r--r--commands/msg/utils.go11
-rw-r--r--commands/util.go21
2 files changed, 28 insertions, 4 deletions
diff --git a/commands/msg/utils.go b/commands/msg/utils.go
index 4ce82a74..8a00a35e 100644
--- a/commands/msg/utils.go
+++ b/commands/msg/utils.go
@@ -2,6 +2,7 @@ package msg
import (
"errors"
+ "time"
"git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib"
@@ -11,10 +12,16 @@ import (
type helper struct {
msgProvider widgets.ProvidesMessages
+ statusInfo func(string)
}
func newHelper(aerc *widgets.Aerc) *helper {
- return &helper{aerc.SelectedTabContent().(widgets.ProvidesMessages)}
+ return &helper{
+ msgProvider: aerc.SelectedTabContent().(widgets.ProvidesMessages),
+ statusInfo: func(s string) {
+ aerc.PushStatus(s, 10*time.Second)
+ },
+ }
}
func (h *helper) markedOrSelectedUids() ([]uint32, error) {
@@ -46,5 +53,5 @@ func (h *helper) messages() ([]*models.MessageInfo, error) {
if err != nil {
return nil, err
}
- return commands.MsgInfoFromUids(store, uid)
+ return commands.MsgInfoFromUids(store, uid, h.statusInfo)
}
diff --git a/commands/util.go b/commands/util.go
index 1c4a8c9a..b14e9690 100644
--- a/commands/util.go
+++ b/commands/util.go
@@ -16,6 +16,7 @@ import (
"git.sr.ht/~rjarry/aerc/logging"
"git.sr.ht/~rjarry/aerc/models"
"git.sr.ht/~rjarry/aerc/widgets"
+ "git.sr.ht/~rjarry/aerc/worker/types"
"github.com/gdamore/tcell/v2"
"github.com/mitchellh/go-homedir"
)
@@ -185,8 +186,9 @@ func UidsFromMessageInfos(msgs []*models.MessageInfo) []uint32 {
return uids
}
-func MsgInfoFromUids(store *lib.MessageStore, uids []uint32) ([]*models.MessageInfo, error) {
+func MsgInfoFromUids(store *lib.MessageStore, uids []uint32, statusInfo func(string)) ([]*models.MessageInfo, error) {
infos := make([]*models.MessageInfo, len(uids))
+ needHeaders := make([]uint32, 0)
for i, uid := range uids {
var ok bool
infos[i], ok = store.Messages[uid]
@@ -194,9 +196,24 @@ func MsgInfoFromUids(store *lib.MessageStore, uids []uint32) ([]*models.MessageI
return nil, fmt.Errorf("uid not found")
}
if infos[i] == nil {
- return nil, fmt.Errorf("message store not ready yet")
+ needHeaders = append(needHeaders, uid)
}
}
+ if len(needHeaders) > 0 {
+ store.FetchHeaders(needHeaders, func(msg types.WorkerMessage) {
+ var info string
+ switch m := msg.(type) {
+ case *types.Done:
+ info = "All headers fetched. Please repeat command."
+ case *types.Error:
+ info = fmt.Sprintf("Encountered error while fetching headers: %v", m.Error)
+ }
+ if statusInfo != nil {
+ statusInfo(info)
+ }
+ })
+ return nil, fmt.Errorf("Fetching missing message headers. Please wait.")
+ }
return infos, nil
}