//go:build mage package main import ( "fmt" "io/fs" "os" "path/filepath" "slices" "strings" "github.com/magefile/mage/sh" ) // Files ensure that the configuration files in the managed directory is up to date and // ensures that they are symlinked correctly to the files in the user's home configuration // directory. func Files() error { homeConfigDirectory, err := os.UserConfigDir() if err != nil { return fmt.Errorf("unable to get the user's home configuration directory: %w", err) } config, err := newConfig() if err != nil { return fmt.Errorf("unable to load the configuration: %w", err) } managedConfig := managedConfigSet(config.ManagedConfigurations) if err = filepath.WalkDir(rootFilesDir, manageFilesFunc(homeConfigDirectory, managedConfig)); err != nil { return fmt.Errorf("received an error while processing the files: %w", err) } return nil } func manageFilesFunc(homeConfigDirectory string, managedConfig map[string]struct{}) fs.WalkDirFunc { return func(path string, d fs.DirEntry, err error) error { if err != nil { return err } if path == rootFilesDir { return nil } relativePath := strings.TrimPrefix(path, rootFilesDir+"/") appConfigName := strings.SplitN(relativePath, "/", 2)[0] if _, exists := managedConfig[appConfigName]; !exists { return nil } managedPath := filepath.Join(rootManagedDir, relativePath) configPath := filepath.Join(homeConfigDirectory, relativePath) if d.IsDir() { dirs := []string{managedPath, configPath} for _, dir := range slices.All(dirs) { if err := ensureDirectory(dir); err != nil { return fmt.Errorf("unable to ensure the existence of the directory %q: %w", dir, err) } } return nil } fmt.Println("Processing file:", relativePath) if err := sh.Copy(managedPath, path); err != nil { return fmt.Errorf("unable to copy %s to %s: %w", path, managedPath, err) } if err := ensureSymlink(managedPath, configPath); err != nil { return err } return nil } }