From 16dbb9422120a2f229524f1cbee55f09e455b1d7 Mon Sep 17 00:00:00 2001 From: Koni Marti Date: Mon, 8 Aug 2022 22:21:43 +0200 Subject: [PATCH] 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 Acked-by: Robin Jarry --- commands/msg/utils.go | 11 +++++++++-- commands/util.go | 21 +++++++++++++++++++-- lib/marker/marker.go | 2 -- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/commands/msg/utils.go b/commands/msg/utils.go index 4ce82a7..8a00a35 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 1c4a8c9..b14e969 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 } diff --git a/lib/marker/marker.go b/lib/marker/marker.go index 1b89fc8..46400f1 100644 --- a/lib/marker/marker.go +++ b/lib/marker/marker.go @@ -1,7 +1,5 @@ package marker -// TODO: fix headers for message that are nil - // Marker provides the interface for the marking behavior of messages type Marker interface { Mark(uint32)