From ea2646fc039a572491ba8cc8e2879b7bf61c25dd Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 9 May 2020 11:50:31 +0200 Subject: Change MarkedMessages to return uids Especially if one tries to interact with all marked messages there could be the case that not all headers are fetched yet, hence the messageInfo is still nil. This segfaults a lot of commands which in principle only need the uid to complete. If we switch to uids, this issue can be alleviated for those commands. --- commands/msg/utils.go | 17 ++++++++++------- commands/util.go | 17 +++++++++++++++-- 2 files changed, 25 insertions(+), 9 deletions(-) (limited to 'commands') diff --git a/commands/msg/utils.go b/commands/msg/utils.go index ae255351..cad0f82e 100644 --- a/commands/msg/utils.go +++ b/commands/msg/utils.go @@ -18,12 +18,7 @@ func newHelper(aerc *widgets.Aerc) *helper { } func (h *helper) markedOrSelectedUids() ([]uint32, error) { - msgs, err := commands.MarkedOrSelected(h.msgProvider) - if err != nil { - return nil, err - } - uids := commands.UidsFromMessageInfos(msgs) - return uids, nil + return commands.MarkedOrSelected(h.msgProvider) } func (h *helper) store() (*lib.MessageStore, error) { @@ -43,5 +38,13 @@ func (h *helper) account() (*widgets.AccountView, error) { } func (h *helper) messages() ([]*models.MessageInfo, error) { - return commands.MarkedOrSelected(h.msgProvider) + uid, err := commands.MarkedOrSelected(h.msgProvider) + if err != nil { + return nil, err + } + store, err := h.store() + if err != nil { + return nil, err + } + return commands.MsgInfoFromUids(store, uid) } diff --git a/commands/util.go b/commands/util.go index 5529edb0..e3395fdd 100644 --- a/commands/util.go +++ b/commands/util.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "git.sr.ht/~sircmpwn/aerc/lib" "git.sr.ht/~sircmpwn/aerc/models" "git.sr.ht/~sircmpwn/aerc/widgets" "github.com/gdamore/tcell" @@ -152,7 +153,7 @@ func listDir(path string, hidden bool) []string { // MarkedOrSelected returns either all marked messages if any are marked or the // selected message instead -func MarkedOrSelected(pm widgets.ProvidesMessages) ([]*models.MessageInfo, error) { +func MarkedOrSelected(pm widgets.ProvidesMessages) ([]uint32, error) { // marked has priority over the selected message marked, err := pm.MarkedMessages() if err != nil { @@ -165,7 +166,7 @@ func MarkedOrSelected(pm widgets.ProvidesMessages) ([]*models.MessageInfo, error if err != nil { return nil, err } - return []*models.MessageInfo{msg}, nil + return []uint32{msg.Uid}, nil } // UidsFromMessageInfos extracts a uid slice from a slice of MessageInfos @@ -178,3 +179,15 @@ func UidsFromMessageInfos(msgs []*models.MessageInfo) []uint32 { } return uids } + +func MsgInfoFromUids(store *lib.MessageStore, uids []uint32) ([]*models.MessageInfo, error) { + infos := make([]*models.MessageInfo, len(uids)) + for i, uid := range uids { + var ok bool + infos[i], ok = store.Messages[uid] + if !ok { + return nil, fmt.Errorf("uid not found") + } + } + return infos, nil +} -- cgit