fix: XDG_CONFIG_HOME mishandling

Attempts to resolve an issue regarding automatic config file generation,
as referenced in #501. This issue is believed occur when
`XDG_CONFIG_HOME` is unset.
This commit is contained in:
Chris Lane 2020-01-30 19:59:35 -05:00
parent 408e944eea
commit 506fb8be15
2 changed files with 54 additions and 4 deletions

View File

@ -11,7 +11,7 @@ import (
// system // system
func Paths(sys string, envvars map[string]string) ([]string, error) { func Paths(sys string, envvars map[string]string) ([]string, error) {
// if CHEAT_CONFIG_PATH is set, expand ~ and return it // if `CHEAT_CONFIG_PATH` is set, expand ~ and return it
if confpath, ok := envvars["CHEAT_CONFIG_PATH"]; ok { if confpath, ok := envvars["CHEAT_CONFIG_PATH"]; ok {
// expand ~ // expand ~
@ -25,11 +25,20 @@ func Paths(sys string, envvars map[string]string) ([]string, error) {
switch sys { switch sys {
case "darwin", "linux", "freebsd": case "darwin", "linux", "freebsd":
return []string{ paths := []string{}
path.Join(envvars["XDG_CONFIG_HOME"], "/cheat/conf.yml"),
// don't include the `XDG_CONFIG_HOME` path if that envvar is not set
if xdgpath, ok := envvars["XDG_CONFIG_HOME"]; ok {
paths = append(paths, path.Join(xdgpath, "/cheat/conf.yml"))
}
// `HOME` will always be set on a POSIX-compliant system, though
paths = append(paths, []string{
path.Join(envvars["HOME"], ".config/cheat/conf.yml"), path.Join(envvars["HOME"], ".config/cheat/conf.yml"),
path.Join(envvars["HOME"], ".cheat/conf.yml"), path.Join(envvars["HOME"], ".cheat/conf.yml"),
}, nil }...)
return paths, nil
case "windows": case "windows":
return []string{ return []string{
path.Join(envvars["APPDATA"], "/cheat/conf.yml"), path.Join(envvars["APPDATA"], "/cheat/conf.yml"),

View File

@ -50,6 +50,47 @@ func TestValidatePathsNix(t *testing.T) {
} }
} }
// TestValidatePathsNixNoXDG asserts that the proper config paths are returned
// on *nix platforms when `XDG_CONFIG_HOME is not set
func TestValidatePathsNixNoXDG(t *testing.T) {
// mock some envvars
envvars := map[string]string{
"HOME": "/home/foo",
}
// specify the platforms to test
oses := []string{
"darwin",
"freebsd",
"linux",
}
// test each *nix os
for _, os := range oses {
// get the paths for the platform
paths, err := Paths(os, envvars)
if err != nil {
t.Errorf("paths returned an error: %v", err)
}
// specify the expected output
want := []string{
"/home/foo/.config/cheat/conf.yml",
"/home/foo/.cheat/conf.yml",
}
// assert that output matches expectations
if !reflect.DeepEqual(paths, want) {
t.Errorf(
"failed to return expected paths: want:\n%s, got:\n%s",
spew.Sdump(want),
spew.Sdump(paths),
)
}
}
}
// TestValidatePathsWindows asserts that the proper config paths are returned // TestValidatePathsWindows asserts that the proper config paths are returned
// on Windows platforms // on Windows platforms
func TestValidatePathsWindows(t *testing.T) { func TestValidatePathsWindows(t *testing.T) {