It's useful to delete folders other than the current one. If a folder is
specified, delete that one; otherwise, delete the current one.
Changelog-added: Allow specifying the folder to delete with `:rmdir`.
Signed-off-by: Jason Cox <me@jasoncarloscox.com>
---
v2 -> v3: Check if the directory to be removed is empty, not the current
directory.
v1 -> v2: Leave the logic to find a new directory to open as-is instead
of refactoring it into a separate function. This tweak
significantly reduces the diff size as requested by Moritz.
Also move the remove function out of the Execute function to
reduce indentation.
commands/account/rmdir.go | 68 +++++++++++++++++++++++++++------------
doc/aerc.1.scd | 4 +--
2 files changed, 49 insertions(+), 23 deletions(-)
diff --git a/commands/account/rmdir.go b/commands/account/rmdir.go
index 22e78a69..c0a5990d 100644
--- a/commands/account/rmdir.go
+++ b/commands/account/rmdir.go
@@ -2,16 +2,19 @@ package account
import (
"errors"
+ "fmt"
"time"
"git.sr.ht/~rjarry/aerc/app"
"git.sr.ht/~rjarry/aerc/commands"
"git.sr.ht/~rjarry/aerc/models"
"git.sr.ht/~rjarry/aerc/worker/types"
+ "git.sr.ht/~rjarry/go-opt"
)
type RemoveDir struct {
- Force bool `opt:"-f"`
+ Force bool `opt:"-f"`
+ Folder string `opt:"folder" complete:"CompleteFolder" required:"false"`
}
func init() {
@@ -26,19 +29,33 @@ func (RemoveDir) Aliases() []string {
return []string{"rmdir"}
}
+func (RemoveDir) CompleteFolder(arg string) []string {
+ acct := app.SelectedAccount()
+ if acct == nil {
+ return nil
+ }
+ return commands.FilterList(acct.Directories().List(), arg, opt.QuoteArg)
+}
+
func (r RemoveDir) Execute(args []string) error {
acct := app.SelectedAccount()
if acct == nil {
return errors.New("No account selected")
}
- var role models.Role
- if d := acct.Directories().SelectedDirectory(); d != nil {
- role = d.Role
+ current := acct.Directories().SelectedDirectory()
+ toRemove := current
+ if r.Folder != "" {
+ toRemove = acct.Directories().Directory(r.Folder)
+ if toRemove == nil {
+ return fmt.Errorf("No such directory: %s", r.Folder)
+ }
}
+ role := toRemove.Role
+
// Check for any messages in the directory.
- if role != models.QueryRole && !acct.Messages().Empty() && !r.Force {
+ if role != models.QueryRole && toRemove.Exists > 0 && !r.Force {
return errors.New("Refusing to remove non-empty directory; use -f")
}
@@ -46,7 +63,12 @@ func (r RemoveDir) Execute(args []string) error {
return errors.New("Cannot remove a virtual node")
}
- curDir := acct.SelectedDirectory()
+ if toRemove != current {
+ r.remove(acct, toRemove, func() {})
+ return nil
+ }
+
+ curDir := current.Name
var newDir string
dirFound := false
@@ -102,22 +124,26 @@ func (r RemoveDir) Execute(args []string) error {
default:
return
}
- acct.Worker().PostAction(&types.RemoveDirectory{
- Directory: curDir,
- Quiet: r.Force,
- }, func(msg types.WorkerMessage) {
- switch msg := msg.(type) {
- case *types.Done:
- app.PushStatus("Directory removed.", 10*time.Second)
- case *types.Error:
- app.PushError(msg.Error.Error())
- reopenCurrentDir()
- case *types.Unsupported:
- app.PushError(":rmdir is not supported by the backend.")
- reopenCurrentDir()
- }
- })
+ r.remove(acct, toRemove, reopenCurrentDir)
})
return nil
}
+
+func (r RemoveDir) remove(acct *app.AccountView, dir *models.Directory, onErr func()) {
+ acct.Worker().PostAction(&types.RemoveDirectory{
+ Directory: dir.Name,
+ Quiet: r.Force,
+ }, func(msg types.WorkerMessage) {
+ switch msg := msg.(type) {
+ case *types.Done:
+ app.PushStatus("Directory removed.", 10*time.Second)
+ case *types.Error:
+ app.PushError(msg.Error.Error())
+ onErr()
+ case *types.Unsupported:
+ app.PushError(":rmdir is not supported by the backend.")
+ onErr()
+ }
+ })
+}
diff --git a/doc/aerc.1.scd b/doc/aerc.1.scd
index 62129bff..8d489fb9 100644
--- a/doc/aerc.1.scd
+++ b/doc/aerc.1.scd
@@ -577,8 +577,8 @@ message list, the message in the message viewer, etc).
*:mkdir* _<name>_
Creates a new folder for this account and changes to that folder.
-*:rmdir* [*-f*]
- Removes the current folder.
+*:rmdir* [*-f*] [_<folder>_]
+ Removes the folder _<folder>_, or the current folder if not specified.
By default, it will fail if the directory is non-empty (see *-f*).
--
2.45.2
On Sun Jun 16, 2024 at 3:34 PM CEST, Jason Cox wrote:
> It's useful to delete folders other than the current one. If a folder is
> specified, delete that one; otherwise, delete the current one.
>
> Changelog-added: Allow specifying the folder to delete with `:rmdir`.
> Signed-off-by: Jason Cox <me@jasoncarloscox.com>
> ---
>
> v2 -> v3: Check if the directory to be removed is empty, not the current
> directory.
>
> v1 -> v2: Leave the logic to find a new directory to open as-is instead
> of refactoring it into a separate function. This tweak
> significantly reduces the diff size as requested by Moritz.
> Also move the remove function out of the Execute function to
> reduce indentation.
>
Tested-by: Koni Marti <koni.marti@gmail.com>
Jason Cox <me@jasoncarloscox.com> wrote:
> It's useful to delete folders other than the current one. If a folder is
> specified, delete that one; otherwise, delete the current one.
>
> Changelog-added: Allow specifying the folder to delete with `:rmdir`.
> Signed-off-by: Jason Cox <me@jasoncarloscox.com>
> ---
>
> v2 -> v3: Check if the directory to be removed is empty, not the current
> directory.
>
> v1 -> v2: Leave the logic to find a new directory to open as-is instead
> of refactoring it into a separate function. This tweak
> significantly reduces the diff size as requested by Moritz.
> Also move the remove function out of the Execute function to
> reduce indentation.
Acked-by: Robin Jarry <robin@jarry.cc>
Applied, thanks.
To git@git.sr.ht:~rjarry/aerc
e2a9cd088159..2c06df8720cc master -> master