feat(config): Set platform-appropriate default data directory in configuration
- Introduce getDefaultDataDir function to determine the default data directory based on the environment. - Update Load function to set the default data_dir using the new method, enhancing compatibility for rootless environments.
- commit
- 0bd81a6edbe9bcb6897f43306cb2c33fe0a12079
- author
- bamen · · 2025-06-07 08:53 UTC
- parent
- 69d0d4b
- signature
- unsigned
1 file · +20 -1
M internal/config/config.go +20 -1
| @@ -2,6 +2,8 @@ package config | |||
| 2 | 2 | ||
| 3 | 3 | import ( | |
| 4 | 4 | "fmt" | |
| 5 | + | "os" | |
| 6 | + | "path/filepath" | |
| 5 | 7 | "strings" | |
| 6 | 8 | ||
| 7 | 9 | "github.com/spf13/viper" | |
| @@ -43,7 +45,10 @@ func Load() (*Config, error) { | |||
| 43 | 45 | viper.SetDefault("server.registry_port", 5000) | |
| 44 | 46 | viper.SetDefault("server.runtime", "auto") | |
| 45 | 47 | viper.SetDefault("server.socket_path", "") | |
| 46 | - | viper.SetDefault("server.data_dir", "./data") | |
| 48 | + | ||
| 49 | + | // Set data_dir default based on environment | |
| 50 | + | defaultDataDir := getDefaultDataDir() | |
| 51 | + | viper.SetDefault("server.data_dir", defaultDataDir) | |
| 47 | 52 | viper.SetDefault("registry_auth.enabled", true) | |
| 48 | 53 | ||
| 49 | 54 | // Handle the routes manually since Viper struggles with domain names | |
| @@ -127,4 +132,18 @@ func (c *Config) GetRoutes() []Route { | |||
| 127 | 132 | } | |
| 128 | 133 | ||
| 129 | 134 | return routes | |
| 135 | + | } | |
| 136 | + | ||
| 137 | + | // getDefaultDataDir returns a platform-appropriate default data directory | |
| 138 | + | func getDefaultDataDir() string { | |
| 139 | + | // Check if we're running in a rootless environment | |
| 140 | + | if os.Getuid() != 0 { | |
| 141 | + | // For rootless environments, use user's home directory or current directory | |
| 142 | + | if homeDir, err := os.UserHomeDir(); err == nil { | |
| 143 | + | return filepath.Join(homeDir, ".local/share/gordon") | |
| 144 | + | } | |
| 145 | + | } | |
| 146 | + | ||
| 147 | + | // For root or when home directory is not available, use relative path | |
| 148 | + | return "./data" | |
| 130 | 149 | }⏎̸ | |
| @@ -2,6 +2,8 @@ package config | |||||
| 2 | 2 | ||||
| 3 | import ( | 3 | import ( | ||
| 4 | "fmt" | 4 | "fmt" | ||
| 5 | + | "os" | |||
| 6 | + | "path/filepath" | |||
| 5 | "strings" | 7 | "strings" | ||
| 6 | 8 | ||||
| 7 | "github.com/spf13/viper" | 9 | "github.com/spf13/viper" | ||
| @@ -43,7 +45,10 @@ func Load() (*Config, error) { | |||||
| 43 | viper.SetDefault("server.registry_port", 5000) | 45 | viper.SetDefault("server.registry_port", 5000) | ||
| 44 | viper.SetDefault("server.runtime", "auto") | 46 | viper.SetDefault("server.runtime", "auto") | ||
| 45 | viper.SetDefault("server.socket_path", "") | 47 | viper.SetDefault("server.socket_path", "") | ||
| 46 | - | viper.SetDefault("server.data_dir", "./data") | 48 | + | |
| 49 | + | // Set data_dir default based on environment | |||
| 50 | + | defaultDataDir := getDefaultDataDir() | |||
| 51 | + | viper.SetDefault("server.data_dir", defaultDataDir) | |||
| 47 | viper.SetDefault("registry_auth.enabled", true) | 52 | viper.SetDefault("registry_auth.enabled", true) | ||
| 48 | 53 | ||||
| 49 | // Handle the routes manually since Viper struggles with domain names | 54 | // Handle the routes manually since Viper struggles with domain names | ||
| @@ -127,4 +132,18 @@ func (c *Config) GetRoutes() []Route { | |||||
| 127 | } | 132 | } | ||
| 128 | 133 | ||||
| 129 | return routes | 134 | return routes | ||
| 135 | + | } | |||
| 136 | + | ||||
| 137 | + | // getDefaultDataDir returns a platform-appropriate default data directory | |||
| 138 | + | func getDefaultDataDir() string { | |||
| 139 | + | // Check if we're running in a rootless environment | |||
| 140 | + | if os.Getuid() != 0 { | |||
| 141 | + | // For rootless environments, use user's home directory or current directory | |||
| 142 | + | if homeDir, err := os.UserHomeDir(); err == nil { | |||
| 143 | + | return filepath.Join(homeDir, ".local/share/gordon") | |||
| 144 | + | } | |||
| 145 | + | } | |||
| 146 | + | ||||
| 147 | + | // For root or when home directory is not available, use relative path | |||
| 148 | + | return "./data" | |||
| 130 | }⏎̸ | 149 | }⏎̸ | ||