File: config.go

package info (click to toggle)
gitbatch 0.6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 644 kB
  • sloc: makefile: 5; sh: 1
file content (115 lines) | stat: -rw-r--r-- 2,856 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package app

import (
	"os"
	"path/filepath"
	"runtime"

	"github.com/spf13/viper"
)

// config file stuff
var (
	configFileName = "config"
	configFileExt  = ".yml"
	configType     = "yaml"
	appName        = "gitbatch"

	configurationDirectory = filepath.Join(osConfigDirectory(runtime.GOOS), appName)
	configFileAbsPath      = filepath.Join(configurationDirectory, configFileName)
)

// configuration items
var (
	modeKey             = "mode"
	modeKeyDefault      = "fetch"
	pathsKey            = "paths"
	quickKey            = "quick"
	quickKeyDefault     = false
	recursionKey        = "recursion"
	recursionKeyDefault = 1
)

// loadConfiguration returns a Config struct is filled
func loadConfiguration() (*Config, 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 := &Config{
		Directories: directories,
		Depth:       viper.GetInt(recursionKey),
		QuickMode:   viper.GetBool(quickKey),
		Mode:        viper.GetString(modeKey),
	}
	return config, nil
}

// set default configuration parameters
func setDefaults() error {
	viper.SetDefault(quickKey, quickKeyDefault)
	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) {
			if err = os.MkdirAll(configurationDirectory, 0755); err != nil {
				return err
			}
			f, err := os.Create(configFileAbsPath + configFileExt)
			if err != nil {
				return err
			}
			defer f.Close()
		} else {
			return err
		}
		// let's write defaults
		if err := viper.WriteConfig(); err != nil {
			return err
		}
	}
	return nil
}

// 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(osName string) (osConfigDirectory string) {
	switch osName {
	case "windows":
		osConfigDirectory = os.Getenv("APPDATA")
	case "darwin":
		osConfigDirectory = os.Getenv("HOME") + "/Library/Application Support"
	case "linux":
		osConfigDirectory = os.Getenv("HOME") + "/.config"
	}
	return osConfigDirectory
}