From 12269c757d9ffcf93ba23a39c8e12cd222c5ae82 Mon Sep 17 00:00:00 2001 From: Ben Burwell Date: Sat, 12 Oct 2019 22:17:29 -0400 Subject: Add threading support for maildir --- worker/maildir/container.go | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'worker/maildir/container.go') diff --git a/worker/maildir/container.go b/worker/maildir/container.go index 85e892a..a7acfb7 100644 --- a/worker/maildir/container.go +++ b/worker/maildir/container.go @@ -10,6 +10,7 @@ import ( "github.com/emersion/go-maildir" "git.sr.ht/~sircmpwn/aerc/lib/uidstore" + "git.sr.ht/~sircmpwn/aerc/worker/types" ) // A Container is a directory which contains other directories which adhere to @@ -123,3 +124,48 @@ func (c *Container) copyMessage( _, err := src.Copy(dest, key) return err } + +func (c *Container) ScanThreads(d maildir.Dir) ([]*types.Thread, error) { + uids, err := c.UIDs(d) + if err != nil { + return nil, err + } + + // a map from message-id to the Thread that represents it + threads := make(map[string]*types.Thread) + + for _, uid := range uids { + m, err := c.Message(d, uid) + if err != nil { + return nil, err + } + hs, err := m.Headers() + if err != nil { + return nil, err + } + msgID, err := hs.Text("message-id") + if err != nil { + return nil, err + } + irt, err := hs.Text("in-reply-to") + if err != nil { + return nil, err + } + + t := &types.Thread{Uid: uid} + threads[msgID] = t + + if p, ok := threads[irt]; ok { + p.Children = append(p.Children, t) + t.Parent = p + } + } + + var threadSlice []*types.Thread + for _, t := range threads { + if t.Parent == nil { + threadSlice = append(threadSlice, t) + } + } + return threadSlice, nil +} -- cgit v1.2.3