util: fetch message headers for nil messages

Fix large archive operations that covers messages in the store with
unfetched headers. Commit e5ad877af5 ("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>
This commit is contained in:
Koni Marti 2022-08-08 22:21:43 +02:00 committed by Robin Jarry
parent 22e6c9e4fa
commit 16dbb94221
3 changed files with 28 additions and 6 deletions

View file

@ -2,6 +2,7 @@ package msg
import ( import (
"errors" "errors"
"time"
"git.sr.ht/~rjarry/aerc/commands" "git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/lib" "git.sr.ht/~rjarry/aerc/lib"
@ -11,10 +12,16 @@ import (
type helper struct { type helper struct {
msgProvider widgets.ProvidesMessages msgProvider widgets.ProvidesMessages
statusInfo func(string)
} }
func newHelper(aerc *widgets.Aerc) *helper { 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) { func (h *helper) markedOrSelectedUids() ([]uint32, error) {
@ -46,5 +53,5 @@ func (h *helper) messages() ([]*models.MessageInfo, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return commands.MsgInfoFromUids(store, uid) return commands.MsgInfoFromUids(store, uid, h.statusInfo)
} }

View file

@ -16,6 +16,7 @@ import (
"git.sr.ht/~rjarry/aerc/logging" "git.sr.ht/~rjarry/aerc/logging"
"git.sr.ht/~rjarry/aerc/models" "git.sr.ht/~rjarry/aerc/models"
"git.sr.ht/~rjarry/aerc/widgets" "git.sr.ht/~rjarry/aerc/widgets"
"git.sr.ht/~rjarry/aerc/worker/types"
"github.com/gdamore/tcell/v2" "github.com/gdamore/tcell/v2"
"github.com/mitchellh/go-homedir" "github.com/mitchellh/go-homedir"
) )
@ -185,8 +186,9 @@ func UidsFromMessageInfos(msgs []*models.MessageInfo) []uint32 {
return uids 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)) infos := make([]*models.MessageInfo, len(uids))
needHeaders := make([]uint32, 0)
for i, uid := range uids { for i, uid := range uids {
var ok bool var ok bool
infos[i], ok = store.Messages[uid] 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") return nil, fmt.Errorf("uid not found")
} }
if infos[i] == nil { 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 return infos, nil
} }

View file

@ -1,7 +1,5 @@
package marker package marker
// TODO: fix headers for message that are nil
// Marker provides the interface for the marking behavior of messages // Marker provides the interface for the marking behavior of messages
type Marker interface { type Marker interface {
Mark(uint32) Mark(uint32)