aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--worker/notmuch/worker.go87
1 files changed, 61 insertions, 26 deletions
diff --git a/worker/notmuch/worker.go b/worker/notmuch/worker.go
index 59624b3..3d48d8c 100644
--- a/worker/notmuch/worker.go
+++ b/worker/notmuch/worker.go
@@ -90,6 +90,8 @@ func (w *worker) handleMessage(msg types.WorkerMessage) error {
return w.handleReadMessages(msg)
case *types.SearchDirectory:
return w.handleSearchDirectory(msg)
+ case *types.ModifyLabels:
+ return w.handleModifyLabels(msg)
// not implemented, they are generally not used
// in a notmuch based workflow
@@ -159,7 +161,6 @@ func (w *worker) handleOpenDirectory(msg *types.OpenDirectory) error {
if err != nil {
return err
}
- //TODO: why does this need to be sent twice??
info := &types.DirectoryInfo{
Info: &models.DirectoryInfo{
Name: msg.Directory,
@@ -173,6 +174,7 @@ func (w *worker) handleOpenDirectory(msg *types.OpenDirectory) error {
Unseen: count.Unread,
},
}
+ //TODO: why does this need to be sent twice??
w.w.PostMessage(info, nil)
w.w.PostMessage(info, nil)
w.done(msg)
@@ -181,15 +183,10 @@ func (w *worker) handleOpenDirectory(msg *types.OpenDirectory) error {
func (w *worker) handleFetchDirectoryContents(
msg *types.FetchDirectoryContents) error {
- uids, err := w.uidsFromQuery(w.query)
+ err := w.emitDirectoryContents(msg)
if err != nil {
- w.w.Logger.Printf("error scanning uids: %v", err)
return err
}
- w.w.PostMessage(&types.DirectoryContents{
- Message: types.RespondTo(msg),
- Uids: uids,
- }, nil)
w.done(msg)
return nil
}
@@ -203,16 +200,12 @@ func (w *worker) handleFetchMessageHeaders(
w.err(msg, err)
continue
}
- info, err := m.MessageInfo()
+ err = w.emitMessageInfo(m, msg)
if err != nil {
- w.w.Logger.Printf("could not get message info: %v", err)
+ w.w.Logger.Printf(err.Error())
w.err(msg, err)
continue
}
- w.w.PostMessage(&types.MessageInfo{
- Message: types.RespondTo(msg),
- Info: info,
- }, nil)
}
w.done(msg)
return nil
@@ -274,15 +267,11 @@ func (w *worker) handleFetchMessageBodyPart(
}
// send updated flags to ui
- info, err := m.MessageInfo()
+ err = w.emitMessageInfo(m, msg)
if err != nil {
- w.w.Logger.Printf("could not fetch message info: %v", err)
- return err
+ w.w.Logger.Printf(err.Error())
+ w.err(msg, err)
}
- w.w.PostMessage(&types.MessageInfo{
- Message: types.RespondTo(msg),
- Info: info,
- }, nil)
w.done(msg)
return nil
}
@@ -324,16 +313,12 @@ func (w *worker) handleReadMessages(msg *types.ReadMessages) error {
w.err(msg, err)
continue
}
- info, err := m.MessageInfo()
+ err = w.emitMessageInfo(m, msg)
if err != nil {
- w.w.Logger.Printf("could not get message info: %v", err)
+ w.w.Logger.Printf(err.Error())
w.err(msg, err)
continue
}
- w.w.PostMessage(&types.MessageInfo{
- Message: types.RespondTo(msg),
- Info: info,
- }, nil)
}
w.done(msg)
return nil
@@ -355,6 +340,31 @@ func (w *worker) handleSearchDirectory(msg *types.SearchDirectory) error {
return nil
}
+func (w *worker) handleModifyLabels(msg *types.ModifyLabels) error {
+ for _, uid := range msg.Uids {
+ m, err := w.msgFromUid(uid)
+ if err != nil {
+ return fmt.Errorf("could not get message from uid %v: %v", uid, err)
+ }
+ err = m.ModifyTags(msg.Add, msg.Remove)
+ if err != nil {
+ return fmt.Errorf("could not modify message tags: %v", err)
+ }
+ err = w.emitMessageInfo(m, msg)
+ if err != nil {
+ return err
+ }
+ }
+ // tags changed, most probably some messages shifted to other folders
+ // so we need to re-enumerate the query content
+ err := w.emitDirectoryContents(msg)
+ if err != nil {
+ return err
+ }
+ w.done(msg)
+ return nil
+}
+
func (w *worker) loadQueryMap(acctConfig *config.AccountConfig) error {
raw, ok := acctConfig.Params["query-map"]
if !ok {
@@ -393,3 +403,28 @@ func (w *worker) loadExcludeTags(
excludedTags := strings.Split(raw, ",")
return excludedTags
}
+
+func (w *worker) emitDirectoryContents(parent types.WorkerMessage) error {
+ uids, err := w.uidsFromQuery(w.query)
+ if err != nil {
+ return fmt.Errorf("could not fetch uids: %v", err)
+ }
+ w.w.PostMessage(&types.DirectoryContents{
+ Message: types.RespondTo(parent),
+ Uids: uids,
+ }, nil)
+ return nil
+}
+
+func (w *worker) emitMessageInfo(m *Message,
+ parent types.WorkerMessage) error {
+ info, err := m.MessageInfo()
+ if err != nil {
+ return fmt.Errorf("could not get MessageInfo: %v", err)
+ }
+ w.w.PostMessage(&types.MessageInfo{
+ Message: types.RespondTo(parent),
+ Info: info,
+ }, nil)
+ return nil
+}