59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
package budget
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
type paths struct {
|
|
config string
|
|
units string
|
|
state string
|
|
}
|
|
|
|
func homePaths(home string) paths {
|
|
return paths{
|
|
config: filepath.Join(home, ".config/budget/profiles.toml"),
|
|
units: filepath.Join(home, ".config/systemd/user"),
|
|
state: filepath.Join(home, ".local/state/budget"),
|
|
}
|
|
}
|
|
|
|
func writeFiles(p paths, files map[string]string) error {
|
|
if err := os.MkdirAll(p.state, 0755); err != nil {
|
|
return err
|
|
}
|
|
manifest := filepath.Join(p.state, "files.json")
|
|
previous := []string{}
|
|
data, err := os.ReadFile(manifest)
|
|
if err != nil && !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
if err == nil {
|
|
if err := json.Unmarshal(data, &previous); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
for _, relative := range previous {
|
|
if _, keep := files[relative]; !keep {
|
|
if err := os.Remove(filepath.Join(p.units, relative)); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
for _, relative := range keys(files) {
|
|
target := filepath.Join(p.units, relative)
|
|
if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil {
|
|
return err
|
|
}
|
|
if err := os.WriteFile(target, []byte(files[relative]), 0644); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
data, err = json.MarshalIndent(keys(files), "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return os.WriteFile(manifest, append(data, '\n'), 0644)
|
|
}
|