Review configuration file parsing logic

Luet support now these priorities on read configuration file:
- command line option (if available)
- $PWD/.luet.yaml
- $HOME/.luet.yaml
- /etc/luet/luet.yaml
This commit is contained in:
Daniele Rondina
2020-05-30 10:08:41 +02:00
parent 8c4f5b2911
commit 9e7c7e69f8
2 changed files with 43 additions and 11 deletions

View File

@@ -185,23 +185,39 @@ func init() {
// initConfig reads in config file and ENV variables if set. // initConfig reads in config file and ENV variables if set.
func initConfig() { func initConfig() {
// Luet support these priorities on read configuration file:
// - command line option (if available)
// - $PWD/.luet.yaml
// - $HOME/.luet.yaml
// - /etc/luet/luet.yaml
//
// Note: currently a single viper instance support only one config name.
dir, err := filepath.Abs(filepath.Dir(os.Args[0])) viper.SetEnvPrefix(LuetEnvPrefix)
viper.SetConfigType("yaml")
if cfgFile != "" { // enable ability to specify config file via flag
viper.SetConfigFile(cfgFile)
} else {
// Retrieve pwd directory
pwdDir, err := os.Getwd()
if err != nil { if err != nil {
Error(err) Error(err)
os.Exit(1) os.Exit(1)
} }
viper.SetEnvPrefix(LuetEnvPrefix) homeDir := helpers.GetHomeDir()
viper.SetConfigType("yaml")
viper.SetConfigName(".luet") // name of config file (without extension) if helpers.Exists(filepath.Join(pwdDir, ".luet.yaml")) || (homeDir != "" && helpers.Exists(filepath.Join(homeDir, ".luet.yaml"))) {
if cfgFile != "" { // enable ability to specify config file via flag
viper.SetConfigFile(cfgFile)
} else {
viper.AddConfigPath(dir)
viper.AddConfigPath(".") viper.AddConfigPath(".")
viper.AddConfigPath("$HOME") if homeDir != "" {
viper.AddConfigPath(homeDir)
}
viper.SetConfigName(".luet")
} else {
viper.SetConfigName("luet")
viper.AddConfigPath("/etc/luet") viper.AddConfigPath("/etc/luet")
} }
}
viper.AutomaticEnv() // read in environment variables that match viper.AutomaticEnv() // read in environment variables that match

View File

@@ -16,7 +16,9 @@
package helpers package helpers
import ( import (
"os"
"os/exec" "os/exec"
"os/user"
"syscall" "syscall"
"github.com/pkg/errors" "github.com/pkg/errors"
@@ -30,3 +32,17 @@ func Exec(cmd string, args []string, env []string) error {
} }
return syscall.Exec(path, args, env) return syscall.Exec(path, args, env)
} }
func GetHomeDir() (ans string) {
// os/user doesn't work in from scratch environments
u, err := user.Current()
if err == nil {
ans = u.HomeDir
} else {
ans = ""
}
if os.Getenv("HOME") != "" {
ans = os.Getenv("HOME")
}
return ans
}