From c95961fc74585b4284441863c2ebc77a31ea7332 Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Wed, 12 Oct 2022 00:55:49 +0200 Subject: [PATCH] filters: append well known dirs to exec PATH To allow referencing built-in filters without hard coding a path during installation, append the following folders to the exec PATH when running the filter commands: ~/.config/aerc/filters ~/.local/share/aerc/filters $PREFIX/share/aerc/filters /usr/share/aerc/filters If a filter script has the same name than a command in the default exec PATH, it will not shadow it. In that edge case, the absolute path to the filter script must be specified. Suggested-by: Teo Luppi Signed-off-by: Robin Jarry Acked-by: Moritz Poldrack --- CHANGELOG.md | 4 ++++ config/aerc.conf | 8 ++++++++ config/config.go | 6 +++--- doc/aerc-config.5.scd | 10 ++++++++++ widgets/msgviewer.go | 6 ++++++ 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e897e4b..0fed1e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). history. - Embedded terminal backend (libvterm was replaced by a pure go implementation). - Use event driven loop instead of Tick based +- Filter commands are now executed with + `:~/.config/aerc/filters:~/.local/share/aerc/filters:$PREFIX/share/aerc/filters:/usr/share/aerc/filters` + appended to the exec `PATH`. This allows referencing aerc's built-in filter + scripts from their name only. ### Fixed diff --git a/config/aerc.conf b/config/aerc.conf index 1f9c802..dda983a 100644 --- a/config/aerc.conf +++ b/config/aerc.conf @@ -302,6 +302,14 @@ reply-to-self=true # Filters allow you to pipe an email body through a shell command to render # certain emails differently, e.g. highlighting them with ANSI escape codes. # +# The commands are invoked with sh -c. The following folders are appended to +# the system $PATH to allow referencing filters from their name only: +# +# ${XDG_CONFIG_HOME:-~/.config}/aerc/filters +# ${XDG_DATA_HOME:-~/.local/share}/aerc/filters +# $PREFIX/share/aerc/filters +# /usr/share/aerc/filters +# # The first filter which matches the email's mimetype will be used, so order # them from most to least specific. # diff --git a/config/config.go b/config/config.go index faaab61..e40d964 100644 --- a/config/config.go +++ b/config/config.go @@ -426,7 +426,7 @@ func buildDefaultDirs() []string { return defaultDirs } -var searchDirs = buildDefaultDirs() +var SearchDirs = buildDefaultDirs() func installTemplate(root, name string) error { var err error @@ -437,7 +437,7 @@ func installTemplate(root, name string) error { } } var data []byte - for _, dir := range searchDirs { + for _, dir := range SearchDirs { data, err = os.ReadFile(path.Join(dir, name)) if err == nil { break @@ -597,7 +597,7 @@ func (config *AercConfig) LoadConfig(file *ini.File) error { } // append default paths to template-dirs and styleset-dirs - for _, dir := range searchDirs { + for _, dir := range SearchDirs { config.Ui.StyleSetDirs = append( config.Ui.StyleSetDirs, path.Join(dir, "stylesets"), ) diff --git a/doc/aerc-config.5.scd b/doc/aerc-config.5.scd index 78a39e3..9be0cb2 100644 --- a/doc/aerc-config.5.scd +++ b/doc/aerc-config.5.scd @@ -510,6 +510,16 @@ aerc ships with some default filters installed in the share directory (usually _/usr/share/aerc/filters_). Note that these may have additional dependencies that aerc does not have alone. +The filter commands are invoked with sh -c [command]. The following folders are +appended to the system $PATH to allow referencing filters from their name only. + +``` +${XDG_CONFIG_HOME:-~/.config}/aerc/filters +${XDG_DATA_HOME:-~/.local/share}/aerc/filters +$PREFIX/share/aerc/filters +/usr/share/aerc/filters +``` + Note that said email body is converted into UTF-8 before being passed to filters. diff --git a/widgets/msgviewer.go b/widgets/msgviewer.go index 8904758..19a28f0 100644 --- a/widgets/msgviewer.go +++ b/widgets/msgviewer.go @@ -577,6 +577,12 @@ func NewPartViewer(acct *AccountView, conf *config.AercConfig, } } if filter != nil { + path, _ := os.LookupEnv("PATH") + for _, dir := range config.SearchDirs { + path += fmt.Sprintf(":%s/filters", dir) + } + filter.Env = os.Environ() + filter.Env = append(filter.Env, fmt.Sprintf("PATH=%s", path)) if pipe, err = filter.StdinPipe(); err != nil { return nil, err }