Skip to content

Commit

Permalink
fix maildir after changes in package version 0.6.0
Browse files Browse the repository at this point in the history
  • Loading branch information
creativeprojects committed Sep 25, 2024
1 parent 71805b1 commit 5004358
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 37 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ require (
github.com/emersion/go-imap v1.2.1
github.com/emersion/go-imap-compress v0.0.0-20201103190257-14809af1d1b9
github.com/emersion/go-imap-uidplus v0.0.0-20200503180755-e75854c361e9
github.com/emersion/go-maildir v0.5.0
github.com/emersion/go-maildir v0.6.0
github.com/pterm/pterm v0.12.79
github.com/spf13/cobra v1.8.1
github.com/stretchr/testify v1.9.0
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ github.com/emersion/go-imap-uidplus v0.0.0-20200503180755-e75854c361e9 h1:2Kbw3i
github.com/emersion/go-imap-uidplus v0.0.0-20200503180755-e75854c361e9/go.mod h1:GfiSiw/du0221I3Cf4F0DqX3Bv5Xe580gIIATrQtnJg=
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-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4=
github.com/emersion/go-message v0.18.1 h1:tfTxIoXFSFRwWaZsgnqS1DSZuGpYGzSmCZD8SK3QA2E=
github.com/emersion/go-message v0.18.1/go.mod h1:XpJyL70LwRvq2a8rVbHXikPgKj8+aI0kGdHlg16ibYA=
Expand Down
58 changes: 22 additions & 36 deletions storage/mdir/maildir.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,24 +141,20 @@ func (m *Maildir) SelectMailbox(info mailbox.Info) (*mailbox.Status, error) {
func (m *Maildir) PutMessage(info mailbox.Info, props mailbox.MessageProperties, body io.Reader) (mailbox.MessageID, error) {
name := lib.VerifyDelimiter(info.Name, info.Delimiter, Delimiter)
mbox := maildir.Dir(filepath.Join(m.root, name))
key, copied, err := m.createFromStream(mbox, props.Flags, body)
msg, copied, err := m.createFromStream(mbox, props.Flags, body)
if err != nil {
return mailbox.EmptyMessageID, err
}
if props.Size > 0 && copied != int64(props.Size) {
// delete the message
filename, err := mbox.Filename(key)
if err == nil {
_ = os.Remove(filename)
}
filename := msg.Filename()
_ = os.Remove(filename)
return mailbox.EmptyMessageID, fmt.Errorf("message body size advertised as %d bytes but read %d bytes from buffer", props.Size, copied)
}
m.log.Printf("Message saved: mailbox=%q key=%q size=%d flags=%v date=%q", name, key, copied, props.Flags, props.InternalDate)
m.log.Printf("Message saved: mailbox=%q key=%q size=%d flags=%v date=%q", name, msg, copied, props.Flags, props.InternalDate)

filename, err := mbox.Filename(key)
if err == nil {
_ = os.Chtimes(filename, time.Now(), props.InternalDate)
}
filename := msg.Filename()
_ = os.Chtimes(filename, time.Now(), props.InternalDate)

status, err := m.getMailboxStatus(name)
if err != nil {
Expand All @@ -169,20 +165,20 @@ func (m *Maildir) PutMessage(info mailbox.Info, props mailbox.MessageProperties,
if err != nil {
return mailbox.EmptyMessageID, err
}
return mailbox.NewMessageIDFromString(key), nil
return mailbox.NewMessageIDFromString(msg.Key()), nil
}

func (m *Maildir) createFromStream(mbox maildir.Dir, flags []string, body io.Reader) (string, int64, error) {
key, writer, err := mbox.Create(toFlags(flags))
func (m *Maildir) createFromStream(mbox maildir.Dir, flags []string, body io.Reader) (*maildir.Message, int64, error) {
msg, writer, err := mbox.Create(toFlags(flags))
if err != nil {
return key, 0, err
return msg, 0, err
}
defer writer.Close()
copied, err := io.Copy(writer, body)
if err != nil {
return key, copied, err
return msg, copied, err
}
return key, copied, nil
return msg, copied, nil
}

func (m *Maildir) FetchMessages(ctx context.Context, since time.Time, messages chan *mailbox.Message) error {
Expand All @@ -197,23 +193,17 @@ func (m *Maildir) FetchMessages(ctx context.Context, since time.Time, messages c

name := m.selected
mbox := maildir.Dir(filepath.Join(m.root, name))
keys, err := mbox.Keys()
msgs, err := mbox.Messages()
if err != nil {
return err
}

for _, key := range keys {
for _, msg := range msgs {
if ctx.Err() != nil {
return ctx.Err()
}
flags, err := mbox.Flags(key)
if err != nil {
return fmt.Errorf("cannot read flags for key %q: %w", key, err)
}
filename, err := mbox.Filename(key)
if err != nil {
return fmt.Errorf("cannot find filename for key %q: %w", key, err)
}
flags := msg.Flags()
filename := msg.Filename()
info, err := os.Stat(filename)
if err != nil {
return fmt.Errorf("cannot stat %q: %w", filename, err)
Expand All @@ -222,17 +212,17 @@ func (m *Maildir) FetchMessages(ctx context.Context, since time.Time, messages c
// skip this message
continue
}
file, err := mbox.Open(key)
file, err := msg.Open()
if err != nil {
return fmt.Errorf("cannot open key %q: %w", key, err)
return fmt.Errorf("cannot open key %q: %w", msg, err)
}
messages <- &mailbox.Message{
MessageProperties: mailbox.MessageProperties{
Flags: flagsToStrings(flags),
InternalDate: info.ModTime(),
Size: uint32(info.Size()),
},
Uid: mailbox.NewMessageIDFromString(key),
Uid: mailbox.NewMessageIDFromString(msg.Key()),
Body: file,
}
}
Expand All @@ -248,20 +238,16 @@ func (m *Maildir) LatestDate(ctx context.Context) (time.Time, error) {
}

mbox := maildir.Dir(filepath.Join(m.root, m.selected))
keys, err := mbox.Keys()
msgs, err := mbox.Messages()
if err != nil {
return latest, err
}

for _, key := range keys {
for _, msg := range msgs {
if ctx.Err() != nil {
return latest, ctx.Err()
}
filename, err := mbox.Filename(key)
if err != nil {
// should we keep going after an error?
return latest, fmt.Errorf("cannot find filename for key %q: %w", key, err)
}
filename := msg.Filename()
info, err := os.Stat(filename)
if err != nil {
// should we keep going after an error?
Expand Down

0 comments on commit 5004358

Please sign in to comment.