about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorReto Brunner <reto@labrat.space>2020-05-09 11:50:31 +0200
committerDrew DeVault <sir@cmpwn.com>2020-05-11 09:47:34 -0400
commitea2646fc039a572491ba8cc8e2879b7bf61c25dd (patch)
tree3608b8064e4f67f1f53e177ddad2e5f5ae9a49d5
parent381c1fc05f6de95accbb520769d0cc9196955cf4 (diff)
downloadaerc-ea2646fc039a572491ba8cc8e2879b7bf61c25dd.tar.gz
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.
-rw-r--r--commands/msg/utils.go17
-rw-r--r--commands/util.go17
-rw-r--r--widgets/account.go4
-rw-r--r--widgets/msgviewer.go4
-rw-r--r--widgets/providesmessage.go2
5 files changed, 30 insertions, 14 deletions
diff --git a/commands/msg/utils.go b/commands/msg/utils.go
index ae25535..cad0f82 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 5529edb..e3395fd 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
+}
diff --git a/widgets/account.go b/widgets/account.go
index 31384a5..20ed345 100644
--- a/widgets/account.go
+++ b/widgets/account.go
@@ -215,9 +215,9 @@ func (acct *AccountView) SelectedMessage() (*models.MessageInfo, error) {
 	return msg, nil
 }
 
-func (acct *AccountView) MarkedMessages() ([]*models.MessageInfo, error) {
+func (acct *AccountView) MarkedMessages() ([]uint32, error) {
 	store := acct.Store()
-	return msgInfoFromUids(store, store.Marked())
+	return store.Marked(), nil
 }
 
 func (acct *AccountView) SelectedMessagePart() *PartInfo {
diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go
index e192ae6..0cfabd7 100644
--- a/widgets/msgviewer.go
+++ b/widgets/msgviewer.go
@@ -262,9 +262,9 @@ func (mv *MessageViewer) SelectedMessage() (*models.MessageInfo, error) {
 	return mv.msg.MessageInfo(), nil
 }
 
-func (mv *MessageViewer) MarkedMessages() ([]*models.MessageInfo, error) {
+func (mv *MessageViewer) MarkedMessages() ([]uint32, error) {
 	store := mv.Store()
-	return msgInfoFromUids(store, store.Marked())
+	return store.Marked(), nil
 }
 
 func (mv *MessageViewer) ToggleHeaders() {
diff --git a/widgets/providesmessage.go b/widgets/providesmessage.go
index b06825f..6e00b1c 100644
--- a/widgets/providesmessage.go
+++ b/widgets/providesmessage.go
@@ -25,5 +25,5 @@ type ProvidesMessages interface {
 	Store() *lib.MessageStore
 	SelectedAccount() *AccountView
 	SelectedMessage() (*models.MessageInfo, error)
-	MarkedMessages() ([]*models.MessageInfo, error)
+	MarkedMessages() ([]uint32, error)
 }