dirs.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package settings
  2. import (
  3. "os"
  4. "path/filepath"
  5. )
  6. const (
  7. configFileName string = "config.json" // configFileName holds the name of the config file.
  8. vcsFileName string = "vcs.json" // vcsFileName holds the name of the vcs file.
  9. completionFileName string = "completion.cache"
  10. systemdCache string = "/var/cache/yay" // systemd should handle cache creation
  11. )
  12. func getConfigPath() string {
  13. if configHome := os.Getenv("XDG_CONFIG_HOME"); configHome != "" {
  14. configDir := filepath.Join(configHome, "yay")
  15. if err := initDir(configDir); err == nil {
  16. return filepath.Join(configDir, configFileName)
  17. }
  18. }
  19. if configHome := os.Getenv("HOME"); configHome != "" {
  20. configDir := filepath.Join(configHome, ".config", "yay")
  21. if err := initDir(configDir); err == nil {
  22. return filepath.Join(configDir, configFileName)
  23. }
  24. }
  25. return ""
  26. }
  27. func getCacheHome() (string, error) {
  28. uid := os.Geteuid()
  29. if cacheHome := os.Getenv("XDG_CACHE_HOME"); cacheHome != "" && uid != 0 {
  30. cacheDir := filepath.Join(cacheHome, "yay")
  31. if err := initDir(cacheDir); err == nil {
  32. return cacheDir, nil
  33. }
  34. }
  35. if cacheHome := os.Getenv("HOME"); cacheHome != "" && uid != 0 {
  36. cacheDir := filepath.Join(cacheHome, ".cache", "yay")
  37. if err := initDir(cacheDir); err == nil {
  38. return cacheDir, nil
  39. }
  40. }
  41. if uid == 0 && os.Getenv("SUDO_USER") == "" && os.Getenv("DOAS_USER") == "" {
  42. return systemdCache, nil // Don't create directory if systemd-run takes care of it
  43. }
  44. tmpDir := filepath.Join(os.TempDir(), "yay")
  45. return tmpDir, initDir(tmpDir)
  46. }
  47. func initDir(dir string) error {
  48. if _, err := os.Stat(dir); os.IsNotExist(err) {
  49. if err = os.MkdirAll(dir, 0o755); err != nil {
  50. return &ErrRuntimeDir{inner: err, dir: dir}
  51. }
  52. } else if err != nil {
  53. return err
  54. }
  55. return nil
  56. }