99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
package scw
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
const (
|
|
// XDG wiki: https://wiki.archlinux.org/index.php/XDG_Base_Directory
|
|
xdgConfigDirEnv = "XDG_CONFIG_HOME"
|
|
xdgCacheDirEnv = "XDG_CACHE_HOME"
|
|
|
|
unixHomeDirEnv = "HOME"
|
|
windowsHomeDirEnv = "USERPROFILE"
|
|
|
|
defaultConfigFileName = "config.yaml"
|
|
)
|
|
|
|
var (
|
|
// ErrNoHomeDir errors when no user directory is found
|
|
ErrNoHomeDir = errors.New("user home directory not found")
|
|
)
|
|
|
|
// GetCacheDirectory returns the default cache directory.
|
|
// Cache directory is based on the following priority order:
|
|
// - $SCW_CACHE_DIR
|
|
// - $XDG_CACHE_HOME/scw
|
|
// - $HOME/.cache/scw
|
|
// - $USERPROFILE/.cache/scw
|
|
func GetCacheDirectory() string {
|
|
cacheDir := ""
|
|
switch {
|
|
case os.Getenv(ScwCacheDirEnv) != "":
|
|
cacheDir = os.Getenv(ScwCacheDirEnv)
|
|
case os.Getenv(xdgCacheDirEnv) != "":
|
|
cacheDir = filepath.Join(os.Getenv(xdgCacheDirEnv), "scw")
|
|
case os.Getenv(unixHomeDirEnv) != "":
|
|
cacheDir = filepath.Join(os.Getenv(unixHomeDirEnv), ".cache", "scw")
|
|
case os.Getenv(windowsHomeDirEnv) != "":
|
|
cacheDir = filepath.Join(os.Getenv(windowsHomeDirEnv), ".cache", "scw")
|
|
default:
|
|
// TODO: fallback on local folder?
|
|
}
|
|
|
|
// Clean the cache directory path when exiting the function
|
|
return filepath.Clean(cacheDir)
|
|
}
|
|
|
|
// GetConfigPath returns the default path.
|
|
// Default path is based on the following priority order:
|
|
// - $SCW_CONFIG_PATH
|
|
// - $XDG_CONFIG_HOME/scw/config.yaml
|
|
// - $HOME/.config/scw/config.yaml
|
|
// - $USERPROFILE/.config/scw/config.yaml
|
|
func GetConfigPath() string {
|
|
configPath := os.Getenv(ScwConfigPathEnv)
|
|
if configPath == "" {
|
|
configPath, _ = getConfigV2FilePath()
|
|
}
|
|
return filepath.Clean(configPath)
|
|
}
|
|
|
|
// getConfigV2FilePath returns the path to the v2 config file
|
|
func getConfigV2FilePath() (string, bool) {
|
|
configDir, err := GetScwConfigDir()
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
return filepath.Clean(filepath.Join(configDir, defaultConfigFileName)), true
|
|
}
|
|
|
|
// getConfigV1FilePath returns the path to the v1 config file
|
|
func getConfigV1FilePath() (string, bool) {
|
|
path, err := os.UserHomeDir()
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
return filepath.Clean(filepath.Join(path, ".scwrc")), true
|
|
}
|
|
|
|
// GetScwConfigDir returns the path to scw config folder
|
|
func GetScwConfigDir() (string, error) {
|
|
if xdgPath := os.Getenv(xdgConfigDirEnv); xdgPath != "" {
|
|
return filepath.Join(xdgPath, "scw"), nil
|
|
}
|
|
|
|
homeDir, err := os.UserHomeDir()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return filepath.Join(homeDir, ".config", "scw"), nil
|
|
}
|
|
|
|
func fileExist(name string) bool {
|
|
_, err := os.Stat(name)
|
|
return err == nil
|
|
}
|