aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBence Ferdinandy <bence@ferdinandy.com>2022-11-12 11:18:11 +0100
committerRobin Jarry <robin@jarry.cc>2022-11-13 17:14:04 +0100
commit5dfc1ff5df71a62d9e114a84ac036cf4c2cb8540 (patch)
tree967397513eef3a8241274c1ad78a2db071ce40b1
parent1352942056940afb58d4e25d8094c08251fd54de (diff)
downloadaerc-5dfc1ff5df71a62d9e114a84ac036cf4c2cb8540.tar.gz
move and archive: common code for common operation
The code of Archive and Move are slightly different, even though they essentially do the same thing sans the destination and archive always creating the destination if it doesn't exist. Extract common code into a function used by both. This will also result in Move now also respecting next-message-on-delete. Signed-off-by: Bence Ferdinandy <bence@ferdinandy.com> Acked-by: Koni Marti <koni.marti@gmail.com> Acked-by: Robin Jarry <robin@jarry.cc>
-rw-r--r--commands/msg/archive.go35
-rw-r--r--commands/msg/move.go65
-rw-r--r--doc/aerc-config.5.scd2
3 files changed, 58 insertions, 44 deletions
diff --git a/commands/msg/archive.go b/commands/msg/archive.go
index beba3a63..b0c7b038 100644
--- a/commands/msg/archive.go
+++ b/commands/msg/archive.go
@@ -5,11 +5,8 @@ import (
"fmt"
"path"
"sync"
- "time"
"git.sr.ht/~rjarry/aerc/commands"
- "git.sr.ht/~rjarry/aerc/lib"
- "git.sr.ht/~rjarry/aerc/lib/ui"
"git.sr.ht/~rjarry/aerc/logging"
"git.sr.ht/~rjarry/aerc/models"
"git.sr.ht/~rjarry/aerc/widgets"
@@ -108,37 +105,7 @@ func (Archive) Execute(aerc *widgets.Aerc, args []string) error {
wg.Wait()
if success {
- aerc.PushStatus("Messages archived.", 10*time.Second)
- mv, isMsgView := h.msgProvider.(*widgets.MessageViewer)
- if isMsgView {
- if !aerc.Config().Ui.NextMessageOnDelete {
- aerc.RemoveTab(h.msgProvider)
- } else {
- // no more messages in the list
- if next == nil {
- aerc.RemoveTab(h.msgProvider)
- acct.Messages().Select(-1)
- ui.Invalidate()
- return
- }
- lib.NewMessageStoreView(next, mv.MessageView().SeenFlagSet(),
- store, aerc.Crypto, aerc.DecryptKeys,
- func(view lib.MessageView, err error) {
- if err != nil {
- aerc.PushError(err.Error())
- return
- }
- nextMv := widgets.NewMessageViewer(acct, aerc.Config(), view)
- aerc.ReplaceTab(mv, nextMv, next.Envelope.Subject)
- })
- }
- } else {
- if next == nil {
- // We archived the last message, select the new last message
- // instead of the first message
- acct.Messages().Select(-1)
- }
- }
+ handleDone(aerc, acct, next, "Messages archived.", store)
}
}()
return nil
diff --git a/commands/msg/move.go b/commands/msg/move.go
index 13b1fb7b..15494364 100644
--- a/commands/msg/move.go
+++ b/commands/msg/move.go
@@ -5,11 +5,13 @@ import (
"strings"
"time"
- "git.sr.ht/~sircmpwn/getopt"
-
"git.sr.ht/~rjarry/aerc/commands"
+ "git.sr.ht/~rjarry/aerc/lib"
+ "git.sr.ht/~rjarry/aerc/lib/ui"
+ "git.sr.ht/~rjarry/aerc/models"
"git.sr.ht/~rjarry/aerc/widgets"
"git.sr.ht/~rjarry/aerc/worker/types"
+ "git.sr.ht/~sircmpwn/getopt"
)
type Move struct{}
@@ -42,32 +44,77 @@ func (Move) Execute(aerc *widgets.Aerc, args []string) error {
}
h := newHelper(aerc)
+ acct, err := h.account()
+ if err != nil {
+ return err
+ }
store, err := h.store()
if err != nil {
return err
}
- uids, err := h.markedOrSelectedUids()
+ msgs, err := h.messages()
if err != nil {
return err
}
- _, isMsgView := h.msgProvider.(*widgets.MessageViewer)
- if isMsgView {
- aerc.RemoveTab(h.msgProvider)
+ var uids []uint32
+ for _, msg := range msgs {
+ uids = append(uids, msg.Uid)
}
marker := store.Marker()
marker.ClearVisualMark()
- findNextNonDeleted(uids, store)
+ next := findNextNonDeleted(uids, store)
joinedArgs := strings.Join(args[optind:], " ")
+
store.Move(uids, joinedArgs, createParents, func(
msg types.WorkerMessage,
) {
switch msg := msg.(type) {
case *types.Done:
- aerc.PushStatus("Message moved to "+joinedArgs, 10*time.Second)
+ handleDone(aerc, acct, next, "Messages moved to "+joinedArgs, store)
case *types.Error:
- marker.Remark()
aerc.PushError(msg.Error.Error())
+ marker.Remark()
}
})
+
return nil
}
+
+func handleDone(
+ aerc *widgets.Aerc,
+ acct *widgets.AccountView,
+ next *models.MessageInfo,
+ message string,
+ store *lib.MessageStore,
+) {
+ h := newHelper(aerc)
+ aerc.PushStatus(message, 10*time.Second)
+ mv, isMsgView := h.msgProvider.(*widgets.MessageViewer)
+ switch {
+ case isMsgView && !aerc.Config().Ui.NextMessageOnDelete:
+ aerc.RemoveTab(h.msgProvider)
+ case isMsgView:
+ if next == nil {
+ aerc.RemoveTab(h.msgProvider)
+ acct.Messages().Select(-1)
+ ui.Invalidate()
+ return
+ }
+ lib.NewMessageStoreView(next, mv.MessageView().SeenFlagSet(),
+ store, aerc.Crypto, aerc.DecryptKeys,
+ func(view lib.MessageView, err error) {
+ if err != nil {
+ aerc.PushError(err.Error())
+ return
+ }
+ nextMv := widgets.NewMessageViewer(acct, aerc.Config(), view)
+ aerc.ReplaceTab(mv, nextMv, next.Envelope.Subject)
+ })
+ default:
+ if next == nil {
+ // We moved the last message, select the new last message
+ // instead of the first message
+ acct.Messages().Select(-1)
+ }
+ }
+}
diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd
index d943c18e..e40630bc 100644
--- a/doc/aerc-config.5.scd
+++ b/doc/aerc-config.5.scd
@@ -237,7 +237,7 @@ These options are configured in the *[ui]* section of aerc.conf.
Default: 0
*next-message-on-delete*
- Moves to next message when the current message is deleted
+ Moves to next message when the current message is deleted, archived, or moved.
Default: true