about summary refs log tree commit diff stats
path: root/commands/msg
diff options
context:
space:
mode:
authorinwit <inwit@sindominio.net>2021-12-13 11:28:01 +0100
committerRobin Jarry <robin@jarry.cc>2021-12-13 14:56:39 +0100
commitbc593ac7cdb20621aba685987f2a92c9bd880358 (patch)
tree26af73a75c3f5d5b44e299b8f9e29acb12ee1c95 /commands/msg
parentbc087d9b3099ec8215bfb111c9abeb1571407a28 (diff)
downloadaerc-bc593ac7cdb20621aba685987f2a92c9bd880358.tar.gz
recall: allow recalling messages from any folder
Recall fails when called outside of the "postpone" folder (usually
"Drafts"). This makes sense for postponed messages. However, sometimes
the user would like to re-edit and re-send an old, possibly sent,
message, which would serve as a basis for the new one.

This patch allows recall to work outside the postpone folder, thus
allowing for re-edition of any message.

In the original recall function, if the recalled message is found in the
"postpone" folder, once the message has been recalled, re-edited and
sent, the original draft is deleted. With this patch, when the message
is not in the "postpone" folder, the original message is not deleted.

Signed-off-by: inwit <inwit@sindominio.net>
Diffstat (limited to 'commands/msg')
-rw-r--r--commands/msg/recall.go26
1 files changed, 21 insertions, 5 deletions
diff --git a/commands/msg/recall.go b/commands/msg/recall.go
index 61c4c39..b6b850c 100644
--- a/commands/msg/recall.go
+++ b/commands/msg/recall.go
@@ -12,6 +12,7 @@ import (
 	"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 Recall struct{}
@@ -29,8 +30,21 @@ func (Recall) Complete(aerc *widgets.Aerc, args []string) []string {
 }
 
 func (Recall) Execute(aerc *widgets.Aerc, args []string) error {
-	if len(args) != 1 {
-		return errors.New("Usage: recall")
+	force := false
+
+	opts, optind, err := getopt.Getopts(args, "f")
+	if err != nil {
+		return err
+	}
+	for _, opt := range opts {
+		switch opt.Option {
+		case 'f':
+			force = true
+		}
+	}
+
+	if len(args) != optind {
+		return errors.New("Usage: recall [-f]")
 	}
 
 	widget := aerc.SelectedTab().(widgets.ProvidesMessage)
@@ -38,7 +52,7 @@ func (Recall) Execute(aerc *widgets.Aerc, args []string) error {
 	if acct == nil {
 		return errors.New("No account selected")
 	}
-	if acct.SelectedDirectory() != acct.AccountConfig().Postpone {
+	if acct.SelectedDirectory() != acct.AccountConfig().Postpone && !force {
 		return errors.New("Can only recall from the postpone directory: " +
 			acct.AccountConfig().Postpone)
 	}
@@ -81,6 +95,10 @@ func (Recall) Execute(aerc *widgets.Aerc, args []string) error {
 			worker := composer.Worker()
 			uids := []uint32{msgInfo.Uid}
 
+			if acct.SelectedDirectory() != acct.AccountConfig().Postpone {
+				return
+			}
+
 			worker.PostAction(&types.DeleteMessages{
 				Uids: uids,
 			}, func(msg types.WorkerMessage) {
@@ -90,8 +108,6 @@ func (Recall) Execute(aerc *widgets.Aerc, args []string) error {
 					composer.Close()
 				}
 			})
-
-			return
 		})
 	}