2024-09-12 16:35:06 +01:00
|
|
|
//go:build mage
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"slices"
|
2024-09-14 05:58:43 +01:00
|
|
|
|
|
|
|
"codeflow.dananglin.me.uk/linux-home/manager/magefiles/internal/config"
|
|
|
|
"codeflow.dananglin.me.uk/linux-home/manager/magefiles/internal/utilities"
|
2024-09-12 16:35:06 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
// Directories ensure that the specified home directories are present.
|
|
|
|
func Directories() error {
|
2024-09-14 05:58:43 +01:00
|
|
|
cfg, err := config.NewConfig()
|
2024-09-12 16:35:06 +01:00
|
|
|
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)
|
|
|
|
|
2024-09-14 05:58:43 +01:00
|
|
|
if cfg.Directories.UseDefaultDirectories{
|
2024-09-12 16:35:06 +01:00
|
|
|
defaultHomeDirs := homeDirectories(userHome, defaultDirectories())
|
|
|
|
directories = append(directories, defaultHomeDirs...)
|
|
|
|
}
|
|
|
|
|
2024-09-14 05:58:43 +01:00
|
|
|
if cfg.Directories.IncludeXDGDirectories{
|
2024-09-12 16:35:06 +01:00
|
|
|
directories = append(directories, xdgDirectories()...)
|
|
|
|
}
|
|
|
|
|
2024-09-14 05:58:43 +01:00
|
|
|
if len(cfg.Directories.AdditionalDirectories) != 0 {
|
|
|
|
additionalHomeDirs := homeDirectories(userHome, cfg.Directories.AdditionalDirectories)
|
2024-09-12 16:35:06 +01:00
|
|
|
directories = append(directories, additionalHomeDirs...)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, dir := range slices.All(directories) {
|
2024-09-14 05:58:43 +01:00
|
|
|
if err := utilities.EnsureDirectory(dir); err != nil {
|
2024-09-12 16:35:06 +01:00
|
|
|
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
|
|
|
|
}
|