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>
This commit is contained in:
parent
e9c4e250ca
commit
af9390d38b
3 changed files with 35 additions and 11 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
aerc.PushSuccess(fmt.Sprintf("Attached %s", pathinfo.Name()))
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue