From fe1cabb077cf6c6cb3de122b3f5532acbeba8c85 Mon Sep 17 00:00:00 2001 From: ARaspiK Date: Tue, 18 Aug 2020 20:27:23 +0000 Subject: Add support for :rmdir The `:rmdir` command removes the current directory (`-f` is required if the directory is not empty). This is not supported on the notmuch backend. An issue with the maildir backend is that some sync programs (e.g. offlineimap) may recover the directory after it is deleted. They need to specifically be configured to accept deletions, or special commands need to be executed (e.g. `offlineimap --delete-folder`) to properly delete folders. A danger of using this on the IMAP backend is that it is possible for a new message to be added to the directory and for aerc to not show it immediately (due to a slow connection) - using `:rmdir` at this moment (with `-f` if the directory already contains messages) would delete the directory and the new message that just arrived (and all other contents). This is documented in aerc(1) so that users are aware of possible risks. --- worker/imap/remove.go | 19 +++++++++++++++++++ worker/imap/worker.go | 2 ++ worker/maildir/worker.go | 12 ++++++++++++ worker/notmuch/worker.go | 2 ++ worker/types/messages.go | 6 ++++++ 5 files changed, 41 insertions(+) create mode 100644 worker/imap/remove.go (limited to 'worker') diff --git a/worker/imap/remove.go b/worker/imap/remove.go new file mode 100644 index 0000000..47b1f43 --- /dev/null +++ b/worker/imap/remove.go @@ -0,0 +1,19 @@ +package imap + +import ( + "git.sr.ht/~sircmpwn/aerc/worker/types" +) + +func (imapw *IMAPWorker) handleRemoveDirectory(msg *types.RemoveDirectory) { + if err := imapw.client.Delete(msg.Directory); err != nil { + if msg.Quiet { + return + } + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } else { + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } +} diff --git a/worker/imap/worker.go b/worker/imap/worker.go index 0be51d7..c016af6 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -165,6 +165,8 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { w.handleFetchDirectoryContents(msg) case *types.CreateDirectory: w.handleCreateDirectory(msg) + case *types.RemoveDirectory: + w.handleRemoveDirectory(msg) case *types.FetchMessageHeaders: w.handleFetchMessageHeaders(msg) case *types.FetchMessageBodyPart: diff --git a/worker/maildir/worker.go b/worker/maildir/worker.go index d1ff3c2..4a7ae51 100644 --- a/worker/maildir/worker.go +++ b/worker/maildir/worker.go @@ -186,6 +186,8 @@ func (w *Worker) handleMessage(msg types.WorkerMessage) error { return w.handleFetchDirectoryContents(msg) case *types.CreateDirectory: return w.handleCreateDirectory(msg) + case *types.RemoveDirectory: + return w.handleRemoveDirectory(msg) case *types.FetchMessageHeaders: return w.handleFetchMessageHeaders(msg) case *types.FetchMessageBodyPart: @@ -362,6 +364,16 @@ func (w *Worker) handleCreateDirectory(msg *types.CreateDirectory) error { return nil } +func (w *Worker) handleRemoveDirectory(msg *types.RemoveDirectory) error { + dir := w.c.Dir(msg.Directory) + if err := os.RemoveAll(string(dir)); err != nil { + w.worker.Logger.Printf("could not remove directory %s: %v", + msg.Directory, err) + return err + } + return nil +} + func (w *Worker) handleFetchMessageHeaders( msg *types.FetchMessageHeaders) error { for _, uid := range msg.Uids { diff --git a/worker/notmuch/worker.go b/worker/notmuch/worker.go index f14b7ff..66d1cd2 100644 --- a/worker/notmuch/worker.go +++ b/worker/notmuch/worker.go @@ -131,6 +131,8 @@ func (w *worker) handleMessage(msg types.WorkerMessage) error { // return w.handleAppendMessage(msg) // case *types.CreateDirectory: // return w.handleCreateDirectory(msg) + // case *types.RemoveDirectory: + // return w.handleRemoveDirectory(msg) } return errUnsupported } diff --git a/worker/types/messages.go b/worker/types/messages.go index 374db81..ab0e545 100644 --- a/worker/types/messages.go +++ b/worker/types/messages.go @@ -92,6 +92,12 @@ type CreateDirectory struct { Quiet bool } +type RemoveDirectory struct { + Message + Directory string + Quiet bool +} + type FetchMessageHeaders struct { Message Uids []uint32 -- cgit 1.4.1-2-gfad0