config: do not hardcode sharedir
Instead of using a static SHAREDIR at compile time, use a list of standard paths to use at runtime for templates, config files and stylesets. This implies removing all default filters in the default configuration. Replace them with basic commands. New users can configure the filters as they wish. Signed-off-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
parent
05ad96a30c
commit
bb0f180140
7 changed files with 102 additions and 51 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -4,7 +4,6 @@
|
||||||
/aerc.debug
|
/aerc.debug
|
||||||
log
|
log
|
||||||
raw.log
|
raw.log
|
||||||
aerc.conf
|
|
||||||
*.1
|
*.1
|
||||||
*.5
|
*.5
|
||||||
*.7
|
*.7
|
||||||
|
|
13
Makefile
13
Makefile
|
@ -10,8 +10,6 @@ SHAREDIR?=$(PREFIX)/share/aerc
|
||||||
MANDIR?=$(PREFIX)/share/man
|
MANDIR?=$(PREFIX)/share/man
|
||||||
GO?=go
|
GO?=go
|
||||||
GOFLAGS?=
|
GOFLAGS?=
|
||||||
LDFLAGS:=-X main.Prefix=$(PREFIX)
|
|
||||||
LDFLAGS+=-X main.ShareDir=$(SHAREDIR)
|
|
||||||
LDFLAGS+=-X main.Version=$(VERSION)
|
LDFLAGS+=-X main.Version=$(VERSION)
|
||||||
|
|
||||||
GOSRC:=$(shell find * -name '*.go')
|
GOSRC:=$(shell find * -name '*.go')
|
||||||
|
@ -30,7 +28,7 @@ DOCS := \
|
||||||
aerc-templates.7 \
|
aerc-templates.7 \
|
||||||
aerc-stylesets.7
|
aerc-stylesets.7
|
||||||
|
|
||||||
all: aerc aerc.conf $(DOCS)
|
all: aerc $(DOCS)
|
||||||
|
|
||||||
aerc: $(GOSRC)
|
aerc: $(GOSRC)
|
||||||
$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $@
|
$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $@
|
||||||
|
@ -47,9 +45,6 @@ checkfmt:
|
||||||
exit 1; \
|
exit 1; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
aerc.conf: config/aerc.conf.in
|
|
||||||
sed -e 's:@SHAREDIR@:$(SHAREDIR):g' > $@ < config/aerc.conf.in
|
|
||||||
|
|
||||||
.PHONY: debug
|
.PHONY: debug
|
||||||
debug: aerc.debug
|
debug: aerc.debug
|
||||||
@echo 'Run `./aerc.debug` and use this command in another terminal to attach a debugger:'
|
@echo 'Run `./aerc.debug` and use this command in another terminal to attach a debugger:'
|
||||||
|
@ -73,9 +68,9 @@ doc: $(DOCS)
|
||||||
RM?=rm -f
|
RM?=rm -f
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) $(DOCS) aerc.conf aerc
|
$(RM) $(DOCS) aerc
|
||||||
|
|
||||||
install: $(DOCS) aerc aerc.conf
|
install: $(DOCS) aerc
|
||||||
mkdir -m755 -p $(DESTDIR)$(BINDIR) $(DESTDIR)$(MANDIR)/man1 $(DESTDIR)$(MANDIR)/man5 $(DESTDIR)$(MANDIR)/man7 \
|
mkdir -m755 -p $(DESTDIR)$(BINDIR) $(DESTDIR)$(MANDIR)/man1 $(DESTDIR)$(MANDIR)/man5 $(DESTDIR)$(MANDIR)/man7 \
|
||||||
$(DESTDIR)$(SHAREDIR) $(DESTDIR)$(SHAREDIR)/filters $(DESTDIR)$(SHAREDIR)/templates $(DESTDIR)$(SHAREDIR)/stylesets
|
$(DESTDIR)$(SHAREDIR) $(DESTDIR)$(SHAREDIR)/filters $(DESTDIR)$(SHAREDIR)/templates $(DESTDIR)$(SHAREDIR)/stylesets
|
||||||
install -m755 aerc $(DESTDIR)$(BINDIR)/aerc
|
install -m755 aerc $(DESTDIR)$(BINDIR)/aerc
|
||||||
|
@ -91,7 +86,7 @@ install: $(DOCS) aerc aerc.conf
|
||||||
install -m644 aerc-templates.7 $(DESTDIR)$(MANDIR)/man7/aerc-templates.7
|
install -m644 aerc-templates.7 $(DESTDIR)$(MANDIR)/man7/aerc-templates.7
|
||||||
install -m644 aerc-stylesets.7 $(DESTDIR)$(MANDIR)/man7/aerc-stylesets.7
|
install -m644 aerc-stylesets.7 $(DESTDIR)$(MANDIR)/man7/aerc-stylesets.7
|
||||||
install -m644 config/accounts.conf $(DESTDIR)$(SHAREDIR)/accounts.conf
|
install -m644 config/accounts.conf $(DESTDIR)$(SHAREDIR)/accounts.conf
|
||||||
install -m644 aerc.conf $(DESTDIR)$(SHAREDIR)/aerc.conf
|
install -m644 config/aerc.conf $(DESTDIR)$(SHAREDIR)/aerc.conf
|
||||||
install -m644 config/binds.conf $(DESTDIR)$(SHAREDIR)/binds.conf
|
install -m644 config/binds.conf $(DESTDIR)$(SHAREDIR)/binds.conf
|
||||||
install -m755 filters/hldiff $(DESTDIR)$(SHAREDIR)/filters/hldiff
|
install -m755 filters/hldiff $(DESTDIR)$(SHAREDIR)/filters/hldiff
|
||||||
install -m755 filters/html $(DESTDIR)$(SHAREDIR)/filters/html
|
install -m755 filters/html $(DESTDIR)$(SHAREDIR)/filters/html
|
||||||
|
|
8
aerc.go
8
aerc.go
|
@ -86,10 +86,8 @@ func getCompletions(aerc *widgets.Aerc, cmd string) []string {
|
||||||
return completions
|
return completions
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
// set at build time
|
||||||
ShareDir string
|
var Version string
|
||||||
Version string
|
|
||||||
)
|
|
||||||
|
|
||||||
func usage() {
|
func usage() {
|
||||||
log.Fatal("Usage: aerc [-v] [mailto:...]")
|
log.Fatal("Usage: aerc [-v] [mailto:...]")
|
||||||
|
@ -152,7 +150,7 @@ func main() {
|
||||||
logger = log.New(logOut, "", log.LstdFlags)
|
logger = log.New(logOut, "", log.LstdFlags)
|
||||||
logger.Println("Starting up aerc")
|
logger.Println("Starting up aerc")
|
||||||
|
|
||||||
conf, err := config.LoadConfigFromFile(nil, ShareDir, logger)
|
conf, err := config.LoadConfigFromFile(nil, logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "Failed to load config: %v\n", err)
|
fmt.Fprintf(os.Stderr, "Failed to load config: %v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
|
@ -96,10 +96,16 @@ sort=
|
||||||
next-message-on-delete=true
|
next-message-on-delete=true
|
||||||
|
|
||||||
# The directories where the stylesets are stored. It takes a colon-separated
|
# The directories where the stylesets are stored. It takes a colon-separated
|
||||||
# list of directories.
|
# list of directories. If this is unset or if a styleset cannot be found, the
|
||||||
|
# following paths will be used as a fallback in that order:
|
||||||
#
|
#
|
||||||
# default: @SHAREDIR@/stylesets/
|
# ~/.config/aerc/stylesets
|
||||||
stylesets-dirs=@SHAREDIR@/stylesets/
|
# ~/.local/share/aerc/stylesets
|
||||||
|
# /usr/local/share/aerc/stylesets
|
||||||
|
# /usr/share/aerc/stylesets
|
||||||
|
#
|
||||||
|
# default: ""
|
||||||
|
stylesets-dirs=
|
||||||
|
|
||||||
# Uncomment to use box-drawing characters for vertical and horizontal borders.
|
# Uncomment to use box-drawing characters for vertical and horizontal borders.
|
||||||
#
|
#
|
||||||
|
@ -215,9 +221,8 @@ reply-to-self=true
|
||||||
# You can also match on non-mimetypes, by prefixing with the header to match
|
# You can also match on non-mimetypes, by prefixing with the header to match
|
||||||
# against (non-case-sensitive) and a comma, e.g. subject,text will match a
|
# against (non-case-sensitive) and a comma, e.g. subject,text will match a
|
||||||
# subject which contains "text". Use header,~regex to match against a regex.
|
# subject which contains "text". Use header,~regex to match against a regex.
|
||||||
subject,~^\[PATCH=awk -f @SHAREDIR@/filters/hldiff
|
#subject,~^\[PATCH=colordiff
|
||||||
#text/html=@SHAREDIR@/filters/html
|
#text/html=pandoc -f html -t plain
|
||||||
text/*=awk -f @SHAREDIR@/filters/plaintext
|
|
||||||
#image/*=catimg -w $(tput cols) -
|
#image/*=catimg -w $(tput cols) -
|
||||||
|
|
||||||
[triggers]
|
[triggers]
|
||||||
|
@ -236,10 +241,16 @@ new-email=
|
||||||
#
|
#
|
||||||
|
|
||||||
# The directories where the templates are stored. It takes a colon-separated
|
# The directories where the templates are stored. It takes a colon-separated
|
||||||
# list of directories.
|
# list of directories. If this is unset or if a template cannot be found, the
|
||||||
|
# following paths will be used as a fallback in that order:
|
||||||
#
|
#
|
||||||
# default: @SHAREDIR@/templates/
|
# ~/.config/aerc/templates
|
||||||
template-dirs=@SHAREDIR@/templates/
|
# ~/.local/share/aerc/templates
|
||||||
|
# /usr/local/share/aerc/templates
|
||||||
|
# /usr/share/aerc/templates
|
||||||
|
#
|
||||||
|
# default: ""
|
||||||
|
template-dirs=
|
||||||
|
|
||||||
# The default template to be used for new messages.
|
# The default template to be used for new messages.
|
||||||
#
|
#
|
|
@ -296,14 +296,28 @@ func parseCredential(cred, command string) (string, error) {
|
||||||
return u.String(), nil
|
return u.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func installTemplate(root, sharedir, name string) error {
|
var defaultDirs []string = []string{
|
||||||
if _, err := os.Stat(root); os.IsNotExist(err) {
|
path.Join(xdg.ConfigHome(), "aerc"),
|
||||||
err := os.MkdirAll(root, 0755)
|
path.Join(xdg.DataHome(), "aerc"),
|
||||||
|
"/usr/local/share/aerc",
|
||||||
|
"/usr/share/aerc",
|
||||||
|
}
|
||||||
|
|
||||||
|
func installTemplate(root, name string) error {
|
||||||
|
var err error
|
||||||
|
if _, err = os.Stat(root); os.IsNotExist(err) {
|
||||||
|
err = os.MkdirAll(root, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data, err := ioutil.ReadFile(path.Join(sharedir, name))
|
var data []byte
|
||||||
|
for _, dir := range defaultDirs {
|
||||||
|
data, err = ioutil.ReadFile(path.Join(dir, name))
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -446,20 +460,30 @@ func (config *AercConfig) LoadConfig(file *ini.File) error {
|
||||||
if templateDirs != "" {
|
if templateDirs != "" {
|
||||||
config.Templates.TemplateDirs = strings.Split(templateDirs, ":")
|
config.Templates.TemplateDirs = strings.Split(templateDirs, ":")
|
||||||
}
|
}
|
||||||
for key, val := range templatesSec.KeysHash() {
|
|
||||||
if key == "template-dirs" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// we want to fail during startup if the templates are not ok
|
|
||||||
// hence we do a dummy execute here
|
|
||||||
_, err := templates.ParseTemplateFromFile(
|
|
||||||
val, config.Templates.TemplateDirs, templates.DummyData())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// append default paths to template-dirs and styleset-dirs
|
||||||
|
for _, dir := range defaultDirs {
|
||||||
|
config.Ui.StyleSetDirs = append(
|
||||||
|
config.Ui.StyleSetDirs, path.Join(dir, "stylesets"),
|
||||||
|
)
|
||||||
|
config.Templates.TemplateDirs = append(
|
||||||
|
config.Templates.TemplateDirs, path.Join(dir, "templates"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// we want to fail during startup if the templates are not ok
|
||||||
|
// hence we do dummy executes here
|
||||||
|
t := config.Templates
|
||||||
|
if err := templates.CheckTemplate(t.NewMessage, t.TemplateDirs); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := templates.CheckTemplate(t.QuotedReply, t.TemplateDirs); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := templates.CheckTemplate(t.Forwards, t.TemplateDirs); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if err := config.Ui.loadStyleSet(
|
if err := config.Ui.loadStyleSet(
|
||||||
config.Ui.StyleSetDirs); err != nil {
|
config.Ui.StyleSetDirs); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -506,7 +530,7 @@ func validateBorderChars(section *ini.Section, config *UIConfig) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadConfigFromFile(root *string, sharedir string, logger *log.Logger) (*AercConfig, error) {
|
func LoadConfigFromFile(root *string, logger *log.Logger) (*AercConfig, error) {
|
||||||
if root == nil {
|
if root == nil {
|
||||||
_root := path.Join(xdg.ConfigHome(), "aerc")
|
_root := path.Join(xdg.ConfigHome(), "aerc")
|
||||||
root = &_root
|
root = &_root
|
||||||
|
@ -519,7 +543,7 @@ func LoadConfigFromFile(root *string, sharedir string, logger *log.Logger) (*Aer
|
||||||
|
|
||||||
// if it doesn't exist copy over the template, then load
|
// if it doesn't exist copy over the template, then load
|
||||||
if _, err := os.Stat(filename); errors.Is(err, os.ErrNotExist) {
|
if _, err := os.Stat(filename); errors.Is(err, os.ErrNotExist) {
|
||||||
if err := installTemplate(*root, sharedir, "aerc.conf"); err != nil {
|
if err := installTemplate(*root, "aerc.conf"); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -572,7 +596,7 @@ func LoadConfigFromFile(root *string, sharedir string, logger *log.Logger) (*Aer
|
||||||
NextMessageOnDelete: true,
|
NextMessageOnDelete: true,
|
||||||
CompletionDelay: 250 * time.Millisecond,
|
CompletionDelay: 250 * time.Millisecond,
|
||||||
CompletionPopovers: true,
|
CompletionPopovers: true,
|
||||||
StyleSetDirs: []string{path.Join(sharedir, "stylesets")},
|
StyleSetDirs: []string{},
|
||||||
StyleSetName: "default",
|
StyleSetName: "default",
|
||||||
// border defaults
|
// border defaults
|
||||||
BorderCharVertical: ' ',
|
BorderCharVertical: ' ',
|
||||||
|
@ -602,7 +626,7 @@ func LoadConfigFromFile(root *string, sharedir string, logger *log.Logger) (*Aer
|
||||||
},
|
},
|
||||||
|
|
||||||
Templates: TemplateConfig{
|
Templates: TemplateConfig{
|
||||||
TemplateDirs: []string{path.Join(sharedir, "templates")},
|
TemplateDirs: []string{},
|
||||||
NewMessage: "new_message",
|
NewMessage: "new_message",
|
||||||
QuotedReply: "quoted_reply",
|
QuotedReply: "quoted_reply",
|
||||||
Forwards: "forward_as_body",
|
Forwards: "forward_as_body",
|
||||||
|
@ -636,7 +660,7 @@ func LoadConfigFromFile(root *string, sharedir string, logger *log.Logger) (*Aer
|
||||||
filename = path.Join(*root, "binds.conf")
|
filename = path.Join(*root, "binds.conf")
|
||||||
binds, err := ini.Load(filename)
|
binds, err := ini.Load(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err := installTemplate(*root, sharedir, "binds.conf"); err != nil {
|
if err := installTemplate(*root, "binds.conf"); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if binds, err = ini.Load(filename); err != nil {
|
if binds, err = ini.Load(filename); err != nil {
|
||||||
|
|
|
@ -208,10 +208,18 @@ These options are configured in the *[ui]* section of aerc.conf.
|
||||||
Default: spaces
|
Default: spaces
|
||||||
|
|
||||||
*stylesets-dirs*
|
*stylesets-dirs*
|
||||||
The directories where the stylesets are stored. The config takes a
|
The directories where the stylesets are stored. The config takes
|
||||||
colon-separated list of dirs.
|
a colon-separated list of dirs. If this is unset or if a styleset cannot
|
||||||
|
be found, the following paths will be used as a fallback in that order:
|
||||||
|
|
||||||
Default: "/usr/share/aerc/stylesets"
|
```
|
||||||
|
~/.config/aerc/stylesets
|
||||||
|
~/.local/share/aerc/stylesets
|
||||||
|
/usr/local/share/aerc/stylesets
|
||||||
|
/usr/share/aerc/stylesets
|
||||||
|
```
|
||||||
|
|
||||||
|
Default: ""
|
||||||
|
|
||||||
*styleset-name*
|
*styleset-name*
|
||||||
The name of the styleset to be used to style the ui elements. The
|
The name of the styleset to be used to style the ui elements. The
|
||||||
|
@ -398,10 +406,18 @@ _/usr/share/aerc/templates_).
|
||||||
These options are configured in the *[templates]* section of aerc.conf.
|
These options are configured in the *[templates]* section of aerc.conf.
|
||||||
|
|
||||||
*template-dirs*
|
*template-dirs*
|
||||||
The directory where the templates are stored. The config takes a
|
The directory where the templates are stored. The config takes
|
||||||
colon-separated list of dirs.
|
a colon-separated list of dirs. If this is unset or if a template cannot
|
||||||
|
be found, the following paths will be used as a fallback in that order:
|
||||||
|
|
||||||
Default: "/usr/share/aerc/templates"
|
```
|
||||||
|
~/.config/aerc/templates
|
||||||
|
~/.local/share/aerc/templates
|
||||||
|
/usr/local/share/aerc/templates
|
||||||
|
/usr/share/aerc/templates
|
||||||
|
```
|
||||||
|
|
||||||
|
Default: ""
|
||||||
|
|
||||||
*new-message*
|
*new-message*
|
||||||
The default template to be used for new messages.
|
The default template to be used for new messages.
|
||||||
|
|
|
@ -227,3 +227,11 @@ func ParseTemplateFromFile(templateName string, templateDirs []string, data inte
|
||||||
}
|
}
|
||||||
return &body, nil
|
return &body, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CheckTemplate(templateName string, templateDirs []string) error {
|
||||||
|
if templateName != "" {
|
||||||
|
_, err := ParseTemplateFromFile(templateName, templateDirs, DummyData())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue