mirror of
https://git.sr.ht/~rjarry/aerc
synced 2026-03-02 18:23:33 +01:00
mod: update go-maildir
Update to the latest version of go-maildir and update the code to use the new methods. Signed-off-by: Moritz Poldrack <git@moritz.sh> Acked-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
committed by
Robin Jarry
parent
f2641cd989
commit
730624ce47
2
go.mod
2
go.mod
@@ -11,7 +11,7 @@ require (
|
||||
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964
|
||||
github.com/emersion/go-imap v1.2.1
|
||||
github.com/emersion/go-imap-sortthread v1.2.0
|
||||
github.com/emersion/go-maildir v0.5.0
|
||||
github.com/emersion/go-maildir v0.6.0
|
||||
github.com/emersion/go-mbox v1.0.3
|
||||
github.com/emersion/go-message v0.18.2
|
||||
github.com/emersion/go-msgauth v0.6.8
|
||||
|
||||
4
go.sum
4
go.sum
@@ -31,8 +31,8 @@ github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjT
|
||||
github.com/emersion/go-imap v1.2.1/go.mod h1:Qlx1FSx2FTxjnjWpIlVNEuX+ylerZQNFE5NsmKFSejY=
|
||||
github.com/emersion/go-imap-sortthread v1.2.0 h1:EMVEJXPWAhXMWECjR82Rn/tza6MddcvTwGAdTu1vJKU=
|
||||
github.com/emersion/go-imap-sortthread v1.2.0/go.mod h1:UhenCBupR+vSYRnqJkpjSq84INUCsyAK1MLpogv14pE=
|
||||
github.com/emersion/go-maildir v0.5.0 h1:RhmSIKAvdSbKCicpe8lrlihjS/xLx0CzWIWJZQQyG4k=
|
||||
github.com/emersion/go-maildir v0.5.0/go.mod h1:Wpgtt9EOIJWe++WKa+JRvDwv+qIV7MeFdvZu/VbsXN4=
|
||||
github.com/emersion/go-maildir v0.6.0 h1:MPx2RSS1Xq8j1cNOzfq7YyF+5Leoeif1XqSeuytdET8=
|
||||
github.com/emersion/go-maildir v0.6.0/go.mod h1:Wpgtt9EOIJWe++WKa+JRvDwv+qIV7MeFdvZu/VbsXN4=
|
||||
github.com/emersion/go-mbox v1.0.3 h1:Kac75r/EGi6KZAz48HXal9q7EiaXNl+U5HZfyDz0LKM=
|
||||
github.com/emersion/go-mbox v1.0.3/go.mod h1:Yp9IVuuOYLEuMv4yjgDHvhb5mHOcYH6x92Oas3QqEZI=
|
||||
github.com/emersion/go-message v0.11.1/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
|
||||
|
||||
@@ -2,8 +2,6 @@ package maildir
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
|
||||
"github.com/emersion/go-maildir"
|
||||
@@ -34,12 +32,12 @@ func NewContainer(dir string, maildirpp bool) (*Container, error) {
|
||||
|
||||
// SyncNewMail adds emails from new to cur, tracking them
|
||||
func (c *Container) SyncNewMail(dir maildir.Dir) error {
|
||||
keys, err := dir.Unseen()
|
||||
unseen, err := dir.Unseen()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, key := range keys {
|
||||
c.recentUIDS[models.UID(key)] = struct{}{}
|
||||
for _, msg := range unseen {
|
||||
c.recentUIDS[models.UID(msg.Key())] = struct{}{}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -67,16 +65,21 @@ func (c *Container) ClearRecentFlag(uid models.UID) {
|
||||
|
||||
// UIDs fetches the unique message identifiers for the maildir
|
||||
func (c *Container) UIDs(d maildir.Dir) ([]models.UID, error) {
|
||||
keys, err := d.Keys()
|
||||
if err != nil && len(keys) == 0 {
|
||||
// messages, err := d.Keys()
|
||||
messages, err := d.Messages()
|
||||
if err != nil && len(messages) == 0 {
|
||||
return nil, fmt.Errorf("could not get keys for %s: %w", d, err)
|
||||
}
|
||||
if err != nil {
|
||||
log.Errorf("could not get all keys for %s: %s", d, err.Error())
|
||||
}
|
||||
sort.Strings(keys)
|
||||
var keyList []string
|
||||
for _, msg := range messages {
|
||||
keyList = append(keyList, msg.Key())
|
||||
}
|
||||
sort.Strings(keyList)
|
||||
var uids []models.UID
|
||||
for _, key := range keys {
|
||||
for _, key := range keyList {
|
||||
uids = append(uids, models.UID(key))
|
||||
}
|
||||
return uids, err
|
||||
@@ -122,7 +125,11 @@ func (c *Container) CopyAll(
|
||||
func (c *Container) copyMessage(
|
||||
dest maildir.Dir, src maildir.Dir, uid models.UID,
|
||||
) error {
|
||||
_, err := src.Copy(dest, string(uid))
|
||||
msg, err := src.MessageByKey(string(uid))
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to retrieve message %q: %w", uid, err)
|
||||
}
|
||||
_, err = msg.CopyTo(dest)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -138,12 +145,9 @@ func (c *Container) MoveAll(dest maildir.Dir, src maildir.Dir, uids []models.UID
|
||||
}
|
||||
|
||||
func (c *Container) moveMessage(dest maildir.Dir, src maildir.Dir, uid models.UID) error {
|
||||
path, err := src.Filename(string(uid))
|
||||
msg, err := src.MessageByKey(string(uid))
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not find path for message id %s: %w", uid, err)
|
||||
return fmt.Errorf("failed to retrieve message %q: %w", uid, err)
|
||||
}
|
||||
// Remove encoded UID information from the key to prevent sync issues
|
||||
name := lib.StripUIDFromMessageFilename(filepath.Base(path))
|
||||
destPath := filepath.Join(string(dest), "cur", name)
|
||||
return os.Rename(path, destPath)
|
||||
return msg.MoveTo(dest)
|
||||
}
|
||||
|
||||
@@ -21,26 +21,38 @@ type Message struct {
|
||||
|
||||
// NewReader reads a message into memory and returns an io.Reader for it.
|
||||
func (m Message) NewReader() (io.ReadCloser, error) {
|
||||
return m.dir.Open(m.key)
|
||||
msg, err := m.dir.MessageByKey(m.key)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to find message with key %q: %w", m.key, err)
|
||||
}
|
||||
return msg.Open()
|
||||
}
|
||||
|
||||
// Flags fetches the set of flags currently applied to the message.
|
||||
func (m Message) Flags() ([]maildir.Flag, error) {
|
||||
return m.dir.Flags(m.key)
|
||||
msg, err := m.dir.MessageByKey(m.key)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to find message with key %q: %w", m.key, err)
|
||||
}
|
||||
return msg.Flags(), nil
|
||||
}
|
||||
|
||||
// ModelFlags fetches the set of models.flags currently applied to the message.
|
||||
func (m Message) ModelFlags() (models.Flags, error) {
|
||||
flags, err := m.dir.Flags(m.key)
|
||||
msg, err := m.dir.MessageByKey(m.key)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
return 0, fmt.Errorf("failed to find message with key %q: %w", m.key, err)
|
||||
}
|
||||
return lib.FromMaildirFlags(flags), nil
|
||||
return lib.FromMaildirFlags(msg.Flags()), nil
|
||||
}
|
||||
|
||||
// SetFlags replaces the message's flags with a new set.
|
||||
func (m Message) SetFlags(flags []maildir.Flag) error {
|
||||
return m.dir.SetFlags(m.key, flags)
|
||||
msg, err := m.dir.MessageByKey(m.key)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to find message with key %q: %w", m.key, err)
|
||||
}
|
||||
return msg.SetFlags(flags)
|
||||
}
|
||||
|
||||
// SetOneFlag enables or disables a single message flag on the message.
|
||||
@@ -76,7 +88,11 @@ func (m Message) MarkReplied(answered bool) error {
|
||||
|
||||
// Remove deletes the email immediately.
|
||||
func (m Message) Remove() error {
|
||||
return m.dir.Remove(m.key)
|
||||
msg, err := m.dir.MessageByKey(m.key)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to find message with key %q: %w", m.key, err)
|
||||
}
|
||||
return msg.Remove()
|
||||
}
|
||||
|
||||
// MessageInfo populates a models.MessageInfo struct for the message.
|
||||
@@ -94,11 +110,11 @@ func (m Message) MessageInfo() (*models.MessageInfo, error) {
|
||||
}
|
||||
|
||||
func (m Message) Size() (uint32, error) {
|
||||
name, err := m.dir.Filename(m.key)
|
||||
msg, err := m.dir.MessageByKey(m.key)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("failed to get filename: %w", err)
|
||||
return 0, fmt.Errorf("failed to find message with key %q: %w", m.key, err)
|
||||
}
|
||||
size, err := lib.FileSize(name)
|
||||
size, err := lib.FileSize(msg.Filename())
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("failed to get filesize: %w", err)
|
||||
}
|
||||
@@ -123,7 +139,11 @@ func (m Message) MessageHeaders() (*models.MessageInfo, error) {
|
||||
// NewBodyPartReader creates a new io.Reader for the requested body part(s) of
|
||||
// the message.
|
||||
func (m Message) NewBodyPartReader(requestedParts []int) (io.Reader, error) {
|
||||
f, err := m.dir.Open(m.key)
|
||||
msgWrapper, err := m.dir.MessageByKey(m.key)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to find message with key %q: %w", m.key, err)
|
||||
}
|
||||
f, err := msgWrapper.Open()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -914,11 +914,11 @@ func (w *Worker) msgInfoFromUid(uid models.UID) (*models.MessageInfo, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
name, err := m.dir.Filename(m.key)
|
||||
msg, err := m.dir.MessageByKey(m.key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
info.Filenames = []string{name}
|
||||
info.Filenames = []string{msg.Filename()}
|
||||
if w.c.IsRecent(uid) {
|
||||
info.Flags |= models.RecentFlag
|
||||
}
|
||||
|
||||
@@ -200,15 +200,15 @@ func (m *Message) Copy(curDir, destDir maildir.Dir, mfs types.MultiFileStrategy)
|
||||
return fmt.Errorf("failed to parse message filename: %s", filename)
|
||||
}
|
||||
|
||||
newKey, err := source.Copy(destDir, key)
|
||||
msg, err := source.MessageByKey(key)
|
||||
if err != nil {
|
||||
return err
|
||||
return fmt.Errorf("failed to retrieve %q: %w", key, err)
|
||||
}
|
||||
newFilename, err := destDir.Filename(newKey)
|
||||
msg, err = msg.CopyTo(destDir)
|
||||
if err != nil {
|
||||
return err
|
||||
return fmt.Errorf("failed to copy %q: %w", key, err)
|
||||
}
|
||||
_, err = m.db.IndexFile(newFilename)
|
||||
_, err = m.db.IndexFile(msg.Filename())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -920,16 +920,12 @@ func (w *worker) handleAppendMessage(msg *types.AppendMessage) error {
|
||||
if !ok {
|
||||
return fmt.Errorf("Can only create file in a maildir folder")
|
||||
}
|
||||
key, writer, err := dest.Create(lib.ToMaildirFlags(msg.Flags))
|
||||
newMsg, writer, err := dest.Create(lib.ToMaildirFlags(msg.Flags))
|
||||
if err != nil {
|
||||
w.w.Errorf("could not create message at %s: %v", msg.Destination, err)
|
||||
return err
|
||||
}
|
||||
filename, err := dest.Filename(key)
|
||||
if err != nil {
|
||||
writer.Close()
|
||||
return err
|
||||
}
|
||||
filename := newMsg.Filename()
|
||||
if _, err := io.Copy(writer, msg.Reader); err != nil {
|
||||
w.w.Errorf("could not write message to destination: %v", err)
|
||||
writer.Close()
|
||||
|
||||
Reference in New Issue
Block a user