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
|
package config
import (
"io/ioutil"
"os"
"path"
yaml "gopkg.in/yaml.v2"
)
const (
configFile = "config.yml"
logFile = "gitlab-shell.log"
)
type MigrationConfig struct {
Enabled bool `yaml:"enabled"`
Features []string `yaml:"features"`
}
type Config struct {
RootDir string
LogFile string `yaml:"log_file"`
LogFormat string `yaml:"log_format"`
Migration MigrationConfig `yaml:"migration"`
}
func New() (*Config, error) {
dir, err := os.Getwd()
if err != nil {
return nil, err
}
return NewFromDir(dir)
}
func NewFromDir(dir string) (*Config, error) {
return newFromFile(path.Join(dir, configFile))
}
func newFromFile(filename string) (*Config, error) {
cfg := &Config{RootDir: path.Dir(filename)}
configBytes, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
if err := parseConfig(configBytes, cfg); err != nil {
return nil, err
}
return cfg, nil
}
// parseConfig expects YAML data in configBytes and a Config instance with RootDir set.
func parseConfig(configBytes []byte, cfg *Config) error {
if err := yaml.Unmarshal(configBytes, cfg); err != nil {
return err
}
if cfg.LogFile == "" {
cfg.LogFile = logFile
}
if len(cfg.LogFile) > 0 && cfg.LogFile[0] != '/' {
cfg.LogFile = path.Join(cfg.RootDir, cfg.LogFile)
}
if cfg.LogFormat == "" {
cfg.LogFormat = "text"
}
return nil
}
|