//go:build mage package main import ( "fmt" "os" "path/filepath" "slices" "codeflow.dananglin.me.uk/linux-home/manager/magefiles/internal/config" "codeflow.dananglin.me.uk/linux-home/manager/magefiles/internal/utilities" ) // Directories ensure that the specified home directories are present. func Directories() error { cfg, err := config.NewConfig() if err != nil { return fmt.Errorf("unable to load the configuration: %w", err) } userHome, err := os.UserHomeDir() if err != nil { return fmt.Errorf("unable to get the user's home directory: %w", err) } directories := make([]string, 0) if cfg.Directories.UseDefaultDirectories{ defaultHomeDirs := homeDirectories(userHome, defaultDirectories()) directories = append(directories, defaultHomeDirs...) } if cfg.Directories.IncludeXDGDirectories{ directories = append(directories, xdgDirectories()...) } if len(cfg.Directories.AdditionalDirectories) != 0 { additionalHomeDirs := homeDirectories(userHome, cfg.Directories.AdditionalDirectories) directories = append(directories, additionalHomeDirs...) } for _, dir := range slices.All(directories) { if err := utilities.EnsureDirectory(dir); err != nil { return fmt.Errorf("unable to ensure that %s is present: %w", dir, err) } fmt.Printf("Successfully ensured %s is present.\n", dir) } return nil } func defaultDirectories() []string { return []string{ ".local", ".local/bin", "Applications", "Desktop", "Documents", "Downloads", "Games", "Git", "Music", "Pictures", "Templates", "Videos", } } func homeDirectories(userHome string, directories []string) []string{ absolutePaths := make([]string, len(directories)) for ind := range slices.All(directories) { absolutePaths[ind] = filepath.Join(userHome, directories[ind]) } return absolutePaths } func xdgDirectories() []string { xdgEnvVars := []string{ "XDG_DATA_HOME", "XDG_CONFIG_HOME", "XDG_CACHE_HOME", "XDG_STATE_HOME", } directories := make([]string, 0) for _, envVar := range slices.All(xdgEnvVars) { directory := os.Getenv(envVar) if directory != "" { directories = append(directories, directory) } } return directories }