summaryrefslogtreecommitdiff
path: root/app/config.go
diff options
context:
space:
mode:
authorIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2019-01-04 18:22:50 +0300
committerGitHub <noreply@github.com>2019-01-04 18:22:50 +0300
commit8a7a258de22432c5927ccfd2c9d5c41fea275b19 (patch)
tree1bd6738d5016aecbc944f04f0391197541cbd7c3 /app/config.go
parentMinor checks and changes throughout files (#53) (diff)
parentcleanup before version increase (diff)
downloadgitbatch-8a7a258de22432c5927ccfd2c9d5c41fea275b19.tar.gz
Merge pull request #54 from isacikgoz/develop
Develop (0.3.0)
Diffstat (limited to 'app/config.go')
-rw-r--r--app/config.go123
1 files changed, 123 insertions, 0 deletions
diff --git a/app/config.go b/app/config.go
new file mode 100644
index 0000000..57c2e6e
--- /dev/null
+++ b/app/config.go
@@ -0,0 +1,123 @@
+package app
+
+import (
+ "os"
+ "path/filepath"
+ "runtime"
+
+ log "github.com/sirupsen/logrus"
+ "github.com/spf13/viper"
+)
+
+// config file stuff
+var (
+ configFileName = "config"
+ configFileExt = ".yml"
+ configType = "yaml"
+ appName = "gitbatch"
+
+ configurationDirectory = filepath.Join(osConfigDirectory(), appName)
+ configFileAbsPath = filepath.Join(configurationDirectory, configFileName)
+)
+
+// configuration items
+var (
+ modeKey = "mode"
+ modeKeyDefault = "fetch"
+ pathsKey = "paths"
+ pathsKeyDefault = []string{"."}
+ logLevelKey = "loglevel"
+ logLevelKeyDefault = "error"
+ qucikKey = "quick"
+ qucikKeyDefault = false
+ recursionKey = "recursion"
+ recursionKeyDefault = 1
+)
+
+// LoadConfiguration returns a Config struct is filled
+func LoadConfiguration() (*SetupConfig, error) {
+ if err := initializeConfigurationManager(); err != nil {
+ return nil, err
+ }
+ if err := setDefaults(); err != nil {
+ return nil, err
+ }
+ if err := readConfiguration(); err != nil {
+ return nil, err
+ }
+ var directories []string
+ if len(viper.GetStringSlice(pathsKey)) <= 0 {
+ d, _ := os.Getwd()
+ directories = []string{d}
+ } else {
+ directories = viper.GetStringSlice(pathsKey)
+ }
+ config := &SetupConfig{
+ Directories: directories,
+ LogLevel: viper.GetString(logLevelKey),
+ Depth: viper.GetInt(recursionKey),
+ QuickMode: viper.GetBool(qucikKey),
+ Mode: viper.GetString(modeKey),
+ }
+ return config, nil
+}
+
+// set default configuration parameters
+func setDefaults() error {
+ viper.SetDefault(logLevelKey, logLevelKeyDefault)
+ viper.SetDefault(qucikKey, qucikKeyDefault)
+ viper.SetDefault(recursionKey, recursionKeyDefault)
+ viper.SetDefault(modeKey, modeKeyDefault)
+ // viper.SetDefault(pathsKey, pathsKeyDefault)
+ return nil
+}
+
+// read configuration from file
+func readConfiguration() error {
+ err := viper.ReadInConfig() // Find and read the config file
+ if err != nil { // Handle errors reading the config file
+ // if file does not exist, simply create one
+ if _, err := os.Stat(configFileAbsPath + configFileExt); os.IsNotExist(err) {
+ os.MkdirAll(configurationDirectory, 0755)
+ os.Create(configFileAbsPath + configFileExt)
+ } else {
+ return err
+ }
+ // let's write defaults
+ if err := viper.WriteConfig(); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// write configuration to a file
+func writeConfiguration() error {
+ err := viper.WriteConfig()
+ return err
+}
+
+// initialize the configuration manager
+func initializeConfigurationManager() error {
+ // config viper
+ viper.AddConfigPath(configurationDirectory)
+ viper.SetConfigName(configFileName)
+ viper.SetConfigType(configType)
+
+ return nil
+}
+
+// returns OS dependent config directory
+func osConfigDirectory() (osConfigDirectory string) {
+ switch osname := runtime.GOOS; osname {
+ case "windows":
+ osConfigDirectory = os.Getenv("APPDATA")
+ case "darwin":
+ osConfigDirectory = os.Getenv("HOME") + "/Library/Application Support"
+ case "linux":
+ osConfigDirectory = os.Getenv("HOME") + "/.config"
+ default:
+ log.Warn("Operating system couldn't be recognized")
+ }
+ return osConfigDirectory
+}