2024-03-11 20:23:36 -04:00
|
|
|
package env
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"regexp"
|
|
|
|
"runtime"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
// GetEditor gets the configured editor by checking environmental
|
|
|
|
// variables EDITOR and VISUAL
|
|
|
|
func GetEditor() string {
|
|
|
|
var editor string
|
|
|
|
if os.Getenv("EDITOR") != "" {
|
|
|
|
editor = os.Getenv("EDITOR")
|
|
|
|
} else if os.Getenv("VISUAL") != "" {
|
|
|
|
editor = os.Getenv("VISUAL")
|
|
|
|
} /* else {
|
|
|
|
// TODO: maybe pick something based on the OS
|
|
|
|
} */
|
|
|
|
|
|
|
|
return editor
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetConfigDir gets a config directory based from environmental variables + the app name
|
|
|
|
//
|
|
|
|
// On Windows, %APPDATA%\agedit is used
|
|
|
|
//
|
|
|
|
// On UNIX-like systems, $XDG_CONFIG_HOME/agedit is tried, if it isn't defined, $HOME/.config/agedit is used
|
|
|
|
func GetConfigDir(appname string) string {
|
|
|
|
var configdir string
|
|
|
|
switch runtime.GOOS {
|
|
|
|
case "windows":
|
|
|
|
configdir = os.Getenv("APPDATA")
|
|
|
|
default:
|
|
|
|
fallthrough
|
|
|
|
case "darwin":
|
|
|
|
// TODO: figure out the proper Mac OS local directories
|
|
|
|
fallthrough
|
|
|
|
case "linux":
|
|
|
|
if confighome := os.Getenv("XDG_CONFIG_HOME"); confighome != "" {
|
|
|
|
configdir = confighome
|
|
|
|
} else {
|
|
|
|
configdir = make_path(os.Getenv("HOME"), ".config")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return make_path(configdir, appname)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetConfigDir gets a config directory based from environmental variables + the app name
|
|
|
|
//
|
|
|
|
// On Windows, %LOCALAPPDATA%\agedit is used
|
|
|
|
//
|
|
|
|
// On UNIX-like systems, $XDG_DATA_HOME/agedit is tried, if it isn't defined, $HOME/.local/share/agedit is used
|
|
|
|
func GetDataDir(appname string) string {
|
|
|
|
var datadir string
|
|
|
|
switch runtime.GOOS {
|
|
|
|
case "windows":
|
|
|
|
datadir = os.Getenv("LOCALAPPDATA")
|
|
|
|
default:
|
|
|
|
fallthrough
|
|
|
|
case "darwin":
|
|
|
|
// TODO: also here
|
|
|
|
fallthrough
|
|
|
|
case "linux":
|
|
|
|
if datahome := os.Getenv("XDG_DATA_HOME"); datahome != "" {
|
|
|
|
datadir = datahome
|
|
|
|
} else {
|
2024-05-07 20:59:29 -04:00
|
|
|
datadir = make_path(os.Getenv("HOME"), ".local", "share")
|
2024-03-11 20:23:36 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return make_path(datadir, appname)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetTempDirectory returns the systems temporary directory
|
|
|
|
//
|
|
|
|
// returns %TEMP% on Windows, /tmp on UNIX-like systems
|
|
|
|
func GetTempDirectory() string {
|
2024-03-14 12:47:19 -04:00
|
|
|
var tmp string
|
2024-03-11 20:23:36 -04:00
|
|
|
switch runtime.GOOS {
|
|
|
|
case "windows":
|
2024-03-14 12:47:19 -04:00
|
|
|
tmp = os.Getenv("TEMP")
|
|
|
|
case "android":
|
|
|
|
if t := os.Getenv("TMPDIR"); t != "" {
|
|
|
|
tmp = t
|
|
|
|
} else if t = os.Getenv("PREFIX"); t != "" {
|
|
|
|
tmp = t + "/tmp"
|
|
|
|
}
|
2024-03-11 20:23:36 -04:00
|
|
|
default:
|
|
|
|
fallthrough
|
|
|
|
case "darwin":
|
|
|
|
fallthrough
|
|
|
|
case "linux":
|
2024-03-14 12:47:19 -04:00
|
|
|
tmp = "/tmp"
|
2024-03-11 20:23:36 -04:00
|
|
|
}
|
2024-03-14 12:47:19 -04:00
|
|
|
return tmp
|
2024-03-11 20:23:36 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
func make_path(paths ...string) string {
|
|
|
|
sep := string(os.PathSeparator)
|
|
|
|
output := strings.Builder{}
|
|
|
|
|
|
|
|
// add / to the start if it's not already there and we're not on Windows
|
|
|
|
if match, err := regexp.Match("^\\w", []byte(paths[0])); err == nil && match && runtime.GOOS != "windows" {
|
|
|
|
output.WriteString(sep)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, path := range paths {
|
2024-05-07 19:24:08 -04:00
|
|
|
// don't add / to the end if it's there
|
|
|
|
if strings.HasSuffix(path, sep) {
|
|
|
|
output.WriteString(path)
|
|
|
|
} else {
|
|
|
|
output.WriteString(path + sep)
|
|
|
|
}
|
2024-03-11 20:23:36 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return output.String()
|
|
|
|
}
|