diff --git a/build.go b/build.go index 6a3573b..9882a3f 100644 --- a/build.go +++ b/build.go @@ -42,6 +42,7 @@ import ( "go.arsenm.dev/logger/log" "go.arsenm.dev/lure/distro" "go.arsenm.dev/lure/download" + "go.arsenm.dev/lure/internal/config" "go.arsenm.dev/lure/internal/cpu" "go.arsenm.dev/lure/internal/shutils" "go.arsenm.dev/lure/internal/shutils/decoder" @@ -187,7 +188,7 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st log.Info("Building package").Str("name", vars.Name).Str("version", vars.Version).Send() - baseDir := filepath.Join(cacheDir, "pkgs", vars.Name) + baseDir := filepath.Join(config.PkgsDir, vars.Name) srcdir := filepath.Join(baseDir, "src") pkgdir := filepath.Join(baseDir, "pkg") diff --git a/config.go b/config.go index 93263f8..1009020 100644 --- a/config.go +++ b/config.go @@ -19,108 +19,17 @@ package main import ( - "os" - "path/filepath" - - "github.com/pelletier/go-toml/v2" "go.arsenm.dev/logger/log" + "go.arsenm.dev/lure/internal/config" "go.arsenm.dev/lure/manager" ) -var ( - cacheDir string - cfgPath string - config Config -) - -type Config struct { - RootCmd string `toml:"rootCmd"` - Repos []Repo `toml:"repo"` -} - -type Repo struct { - Name string `toml:"name"` - URL string `toml:"url"` -} - -var defaultConfig = Config{ - RootCmd: "sudo", - Repos: []Repo{ - { - Name: "default", - URL: "https://github.com/Arsen6331/lure-repo.git", - }, - }, -} +var cfg config.Config func init() { - cfg, cache, err := makeDirs() - if err != nil { - log.Fatal("Error creating directories").Err(err).Send() - } - cacheDir = cache - - cfgPath = filepath.Join(cfg, "lure.toml") - - cfgFl, err := os.Open(cfgPath) - if err != nil { - log.Fatal("Error opening config file").Err(err).Send() - } - defer cfgFl.Close() - - err = toml.NewDecoder(cfgFl).Decode(&config) + err := config.Decode(&cfg) if err != nil { log.Fatal("Error decoding config file").Err(err).Send() } - - manager.DefaultRootCmd = config.RootCmd -} - -func makeDirs() (string, string, error) { - cfgDir, err := os.UserConfigDir() - if err != nil { - return "", "", err - } - - baseCfgPath := filepath.Join(cfgDir, "lure") - - err = os.MkdirAll(baseCfgPath, 0o755) - if err != nil { - return "", "", err - } - - cfgPath := filepath.Join(baseCfgPath, "lure.toml") - - if _, err := os.Stat(cfgPath); err != nil { - cfgFl, err := os.Create(cfgPath) - if err != nil { - return "", "", err - } - - err = toml.NewEncoder(cfgFl).Encode(&defaultConfig) - if err != nil { - return "", "", err - } - - cfgFl.Close() - } - - cacheDir, err := os.UserCacheDir() - if err != nil { - return "", "", err - } - - baseCachePath := filepath.Join(cacheDir, "lure") - - err = os.MkdirAll(filepath.Join(baseCachePath, "repo"), 0o755) - if err != nil { - return "", "", err - } - - err = os.MkdirAll(filepath.Join(baseCachePath, "pkgs"), 0o755) - if err != nil { - return "", "", err - } - - return baseCfgPath, baseCachePath, nil + manager.DefaultRootCmd = cfg.RootCmd } diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..a533912 --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,37 @@ +package config + +import ( + "os" + + "github.com/pelletier/go-toml/v2" +) + +type Config struct { + RootCmd string `toml:"rootCmd"` + Repos []Repo `toml:"repo"` +} + +type Repo struct { + Name string `toml:"name"` + URL string `toml:"url"` +} + +var defaultConfig = Config{ + RootCmd: "sudo", + Repos: []Repo{ + { + Name: "default", + URL: "https://github.com/Arsen6331/lure-repo.git", + }, + }, +} + +func Decode(cfg *Config) error { + cfgFl, err := os.Open(ConfigPath) + if err != nil { + return err + } + defer cfgFl.Close() + + return toml.NewDecoder(cfgFl).Decode(cfg) +} diff --git a/internal/config/dirs.go b/internal/config/dirs.go new file mode 100644 index 0000000..685b87d --- /dev/null +++ b/internal/config/dirs.go @@ -0,0 +1,66 @@ +package config + +import ( + "os" + "path/filepath" + + "github.com/pelletier/go-toml/v2" + "go.arsenm.dev/logger/log" +) + +var ( + ConfigDir string + ConfigPath string + CacheDir string + RepoDir string + PkgsDir string +) + +func init() { + cfgDir, err := os.UserConfigDir() + if err != nil { + log.Fatal("Unable to detect user config directory").Err(err).Send() + } + + ConfigDir = filepath.Join(cfgDir, "lure") + + err = os.MkdirAll(ConfigDir, 0o755) + if err != nil { + log.Fatal("Unable to create LURE config directory").Err(err).Send() + } + + ConfigPath = filepath.Join(ConfigDir, "lure.toml") + + if _, err := os.Stat(ConfigPath); err != nil { + cfgFl, err := os.Create(ConfigPath) + if err != nil { + log.Fatal("Unable to create LURE config file").Err(err).Send() + } + + err = toml.NewEncoder(cfgFl).Encode(&defaultConfig) + if err != nil { + log.Fatal("Error encoding default configuration").Err(err).Send() + } + + cfgFl.Close() + } + + cacheDir, err := os.UserCacheDir() + if err != nil { + log.Fatal("Unable to detect cache directory").Err(err).Send() + } + + CacheDir = filepath.Join(cacheDir, "lure") + RepoDir = filepath.Join(CacheDir, "repo") + PkgsDir = filepath.Join(CacheDir, "pkgs") + + err = os.MkdirAll(RepoDir, 0o755) + if err != nil { + log.Fatal("Unable to create repo cache directory").Err(err).Send() + } + + err = os.MkdirAll(PkgsDir, 0o755) + if err != nil { + log.Fatal("Unable to create package cache directory").Err(err).Send() + } +} diff --git a/repo.go b/repo.go index d3e4924..f56b090 100644 --- a/repo.go +++ b/repo.go @@ -31,6 +31,7 @@ import ( "github.com/urfave/cli/v2" "go.arsenm.dev/logger/log" "go.arsenm.dev/lure/download" + "go.arsenm.dev/lure/internal/config" "golang.org/x/exp/slices" ) @@ -52,23 +53,23 @@ func addrepoCmd(c *cli.Context) error { name := c.String("name") repoURL := c.String("url") - for _, repo := range config.Repos { + for _, repo := range cfg.Repos { if repo.URL == repoURL { log.Fatal("Repo already exists").Str("name", repo.Name).Send() } } - config.Repos = append(config.Repos, Repo{ + cfg.Repos = append(cfg.Repos, config.Repo{ Name: name, URL: repoURL, }) - cfgFl, err := os.Create(cfgPath) + cfgFl, err := os.Create(config.ConfigPath) if err != nil { log.Fatal("Error opening config file").Err(err).Send() } - err = toml.NewEncoder(cfgFl).Encode(&config) + err = toml.NewEncoder(cfgFl).Encode(&cfg) if err != nil { log.Fatal("Error encoding config").Err(err).Send() } @@ -81,7 +82,7 @@ func removerepoCmd(c *cli.Context) error { found := false index := 0 - for i, repo := range config.Repos { + for i, repo := range cfg.Repos { if repo.Name == name { index = i found = true @@ -91,19 +92,19 @@ func removerepoCmd(c *cli.Context) error { log.Fatal("Repo does not exist").Str("name", name).Send() } - config.Repos = slices.Delete(config.Repos, index, index+1) + cfg.Repos = slices.Delete(cfg.Repos, index, index+1) - cfgFl, err := os.Create(cfgPath) + cfgFl, err := os.Create(config.ConfigPath) if err != nil { log.Fatal("Error opening config file").Err(err).Send() } - err = toml.NewEncoder(cfgFl).Encode(&config) + err = toml.NewEncoder(cfgFl).Encode(&cfg) if err != nil { log.Fatal("Error encoding config").Err(err).Send() } - err = os.RemoveAll(filepath.Join(cacheDir, "repo", name)) + err = os.RemoveAll(filepath.Join(config.RepoDir, name)) if err != nil { log.Fatal("Error removing repo directory").Err(err).Send() } @@ -120,11 +121,9 @@ func refreshCmd(c *cli.Context) error { } func findPkg(pkg string) ([]string, error) { - baseRepoDir := filepath.Join(cacheDir, "repo") - var out []string - for _, repo := range config.Repos { - repoDir := filepath.Join(baseRepoDir, repo.Name) + for _, repo := range cfg.Repos { + repoDir := filepath.Join(config.RepoDir, repo.Name) err := os.MkdirAll(repoDir, 0o755) if err != nil { return nil, err @@ -200,16 +199,14 @@ func findPkgs(pkgs []string) (scripts, notFound []string) { } func pullRepos(ctx context.Context) error { - baseRepoDir := filepath.Join(cacheDir, "repo") - - for _, repo := range config.Repos { + for _, repo := range cfg.Repos { repoURL, err := url.Parse(repo.URL) if err != nil { return err } log.Info("Pulling repository").Str("name", repo.Name).Send() - repoDir := filepath.Join(baseRepoDir, repo.Name) + repoDir := filepath.Join(config.RepoDir, repo.Name) gitDir := filepath.Join(repoDir, ".git") if fi, err := os.Stat(gitDir); err == nil && fi.IsDir() {