Implementation of xdg spec about config files (#152)

* First proposition of implementing xdg spec about config files

* Rollback auto-format of table in README.md

* Fix all issues with linter and remove unnecessary fmt.Println()
This commit is contained in:
Kacper Betański 2019-02-04 04:11:32 +01:00 committed by Alex Goodman
parent 142e1c1a40
commit 91d3721737
2 changed files with 55 additions and 32 deletions

View File

@ -228,6 +228,7 @@ layer:
```
dive will search for configs in the following locations:
- `$XDG_CONFIG_HOME/dive/*.yaml`
- `$XDG_CONFIG_DIRS/dive/*.yaml`
- `~/.config/dive/*.yaml`
- `~/.dive.yaml`
- `$XDG_CONFIG_HOME/dive.yaml`
- `~/.config/dive.yaml`

View File

@ -4,6 +4,8 @@ import (
"fmt"
"io/ioutil"
"os"
"path"
"strings"
"github.com/k0kubun/go-ansi"
"github.com/mitchellh/go-homedir"
@ -14,6 +16,8 @@ import (
"github.com/wagoodman/dive/utils"
)
const pathSep = string(os.PathSeparator)
var cfgFile string
var exportFile string
var ciConfigFile string
@ -52,36 +56,8 @@ func init() {
// initConfig reads in config file and ENV variables if set.
func initConfig() {
if cfgFile != "" {
// Use config file from the flag.
viper.SetConfigFile(cfgFile)
} else {
// Find home directory.
home, err := homedir.Dir()
if err != nil {
fmt.Println(err)
utils.Exit(1)
}
// allow for:
// ~/.dive.yaml
// $XDG_CONFIG_HOME/dive.yaml
// ~/.config/dive.yaml
hiddenHomeCfg := home + string(os.PathSeparator) + ".dive.yaml"
if _, err := os.Stat(hiddenHomeCfg); os.IsNotExist(err) {
viper.SetConfigName("dive")
xdgHome := os.Getenv("XDG_CONFIG_HOME")
if len(xdgHome) > 0 {
viper.AddConfigPath(xdgHome)
}
viper.AddConfigPath(home + string(os.PathSeparator) + ".config")
} else {
viper.SetConfigFile(hiddenHomeCfg)
}
}
filepathToCfg := getCfgFile(cfgFile)
viper.SetConfigFile(filepathToCfg)
viper.SetDefault("log.level", log.InfoLevel.String())
viper.SetDefault("log.path", "./dive.log")
@ -148,3 +124,49 @@ func initLogging() {
log.SetOutput(logFileObj)
log.Debug("Starting Dive...")
}
// getCfgFile checks for config file in paths from xdg specs
// and in $HOME/.config/dive/ directory
// defaults to $HOME/.dive.yaml
func getCfgFile(fromFlag string) string {
if fromFlag != "" {
return fromFlag
}
home, err := homedir.Dir()
if err != nil {
fmt.Println(err)
utils.Exit(0)
}
xdgHome := os.Getenv("XDG_CONFIG_HOME")
xdgDirs := os.Getenv("XDG_CONFIG_DIRS")
xdgPaths := append([]string{xdgHome}, strings.Split(xdgDirs, ":")...)
allDirs := append(xdgPaths, home+pathSep+".config")
for _, val := range allDirs {
file := findInPath(val)
if len(file) > 0 {
return file
}
}
return home + pathSep + "dive.yaml"
}
// findInPath returns first "*.yaml" file in path's subdirectory "dive"
// if not found returns empty string
func findInPath(pathTo string) string {
directory := pathTo + pathSep + "dive"
files, err := ioutil.ReadDir(directory)
if err != nil {
return ""
}
for _, file := range files {
filename := file.Name()
if path.Ext(filename) == ".yaml" {
return directory + pathSep + filename
}
}
return ""
}