diff --git a/dirs/dirs.go b/dirs/dirs.go new file mode 100644 index 0000000..966bd5b --- /dev/null +++ b/dirs/dirs.go @@ -0,0 +1,82 @@ +package dirs + +import "os" +import "strings" +import "path/filepath" + +var homeDirectory string +var configHome string +var configDirs []string +var dataHome string +var dataDirs []string +var cacheHome string + +func init () { + var err error + homeDirectory, err = os.UserHomeDir() + if err != nil { + panic("could not get user home directory: " + err.Error()) + } + + configHome = os.Getenv("XDG_CONFIG_HOME") + if configHome == "" { + configHome = filepath.Join(homeDirectory, "/.config/") + } + + configDirsString := os.Getenv("XDG_CONFIG_DIRS") + if configDirsString == "" { + configDirsString = "/etc/xdg/" + } + configDirs = append(strings.Split(configDirsString, ":"), configHome) + + dataHome = os.Getenv("XDG_DATA_HOME") + if dataHome == "" { + dataHome = filepath.Join(homeDirectory, "/.local/share/") + } + + dataDirsString := os.Getenv("XDG_CONFIG_DIRS") + if dataDirsString == "" { + dataDirsString = "/usr/local/share/:/usr/share/" + } + configDirs = append(strings.Split(configDirsString, ":"), configHome) + + cacheHome = os.Getenv("XDG_CACHE_HOME") + if cacheHome == "" { + cacheHome = filepath.Join(homeDirectory, "/.cache/") + } +} + +// ConfigHome returns the path to the directory where user configuration files +// should be stored. +func ConfigHome (name string) (home string) { + return filepath.Join(configHome, name) +} + +// ConfigDirs returns all paths where configuration files might exist. +func ConfigDirs (name string) (dirs []string) { + dirs = make([]string, len(configDirs)) + for index, dir := range configDirs { + dirs[index] = filepath.Join(dir, name) + } + return +} + +// DataHome returns the path to the directory where user data should be stored. +func DataHome (name string) (home string) { + return filepath.Join(dataHome, name) +} + +// DataDirs returns all paths where data files might exist. +func DataDirs (name string) (dirs []string) { + dirs = make([]string, len(dataDirs)) + for index, dir := range dataDirs { + dirs[index] = filepath.Join(dir, name) + } + return +} + +// CacheHome returns the path to the directory where user cache files should be +// stored. +func CacheHome (name string) (home string) { + return filepath.Join(cacheHome, name) +}