summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoritz Poldrack <git@moritz.sh>2022-08-30 22:16:30 +0200
committerRobin Jarry <robin@jarry.cc>2022-08-30 22:23:24 +0200
commitaf9390d38befb9c227bfb90bfb7a49abb40ba411 (patch)
treee3b97799f61c66838cb20ba5deaf631394f0991a
parente9c4e250cace13b6eb35a472d7b4110fbec31ed5 (diff)
downloadaerc-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.md1
-rw-r--r--commands/compose/attach.go42
-rw-r--r--doc/aerc.1.scd3
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.