diff options
author | Moritz Poldrack <git@moritz.sh> | 2022-08-30 22:16:30 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2022-08-30 22:23:24 +0200 |
commit | af9390d38befb9c227bfb90bfb7a49abb40ba411 (patch) | |
tree | e3b97799f61c66838cb20ba5deaf631394f0991a | |
parent | e9c4e250cace13b6eb35a472d7b4110fbec31ed5 (diff) | |
download | aerc-af9390d38befb9c227bfb90bfb7a49abb40ba411.tar.gz aerc-af9390d38befb9c227bfb90bfb7a49abb40ba411.zip |
attach: enable path globbing
Enable path globbing using Go's standard library globbing capabilities,
which allows for attaching multiple files at once.
Suggested-by: Anderson John Njahi <johnjahi55@gmail.com>
Signed-off-by: Moritz Poldrack <git@moritz.sh>
Acked-by: Robin Jarry <robin@jarry.cc>
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | commands/compose/attach.go | 42 | ||||
-rw-r--r-- | doc/aerc.1.scd | 3 |
3 files changed, 35 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d861c01..aee28198 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). BSD. - `outgoing-cred-cmd` execution is now deferred until a message needs to be sent. - `next-message-on-delete` now also applies to `:archive`. +- `:attach` now supports path globbing (`:attach *.log`) ### Fixed diff --git a/commands/compose/attach.go b/commands/compose/attach.go index 60809736..99898d5d 100644 --- a/commands/compose/attach.go +++ b/commands/compose/attach.go @@ -1,11 +1,14 @@ package compose import ( + "errors" "fmt" "os" + "path/filepath" "strings" "git.sr.ht/~rjarry/aerc/commands" + "git.sr.ht/~rjarry/aerc/logging" "git.sr.ht/~rjarry/aerc/widgets" "github.com/mitchellh/go-homedir" ) @@ -31,26 +34,45 @@ func (Attach) Execute(aerc *widgets.Aerc, args []string) error { } path := strings.Join(args[1:], " ") - path, err := homedir.Expand(path) if err != nil { + logging.Errorf("failed to expand path '%s': %v", path, err) aerc.PushError(err.Error()) return err } - pathinfo, err := os.Stat(path) - if err != nil { - aerc.PushError(err.Error()) - return err - } else if pathinfo.IsDir() { - aerc.PushError("Attachment must be a file, not a directory") - return nil + logging.Debugf("attaching %s", path) + + attachments, err := filepath.Glob(path) + if err != nil && errors.Is(err, filepath.ErrBadPattern) { + logging.Warnf("failed to parse as globbing pattern: %v", err) + attachments = []string{path} } + logging.Debugf("filenames: %v", attachments) + composer, _ := aerc.SelectedTabContent().(*widgets.Composer) - composer.AddAttachment(path) + for _, attach := range attachments { + logging.Debugf("attaching '%s'", attach) + + pathinfo, err := os.Stat(attach) + if err != nil { + logging.Errorf("failed to stat file: %v", err) + aerc.PushError(err.Error()) + return err + } else if pathinfo.IsDir() && len(attachments) == 1 { + aerc.PushError("Attachment must be a file, not a directory") + return nil + } - aerc.PushSuccess(fmt.Sprintf("Attached %s", pathinfo.Name())) + composer.AddAttachment(attach) + } + + if len(attachments) == 1 { + aerc.PushSuccess(fmt.Sprintf("Attached %s", path)) + } else { + aerc.PushSuccess(fmt.Sprintf("Attached %d files", len(attachments))) + } return nil } diff --git a/doc/aerc.1.scd b/doc/aerc.1.scd index 2224374d..8ceed4dd 100644 --- a/doc/aerc.1.scd +++ b/doc/aerc.1.scd @@ -437,7 +437,8 @@ message list, the message in the message viewer, etc). Close the composer without sending, discarding the message in progress. *attach* <path> - Attaches the file at the given path to the email. + Attaches the file at the given path to the email. The path can contain + globbing syntax described at https://godocs.io/path/filepath#Match. *attach-key* Attaches the public key for the configured account to the email. |