From 715fd6ccc9b2aea2fbe63c5f0cc8a767e55420bc Mon Sep 17 00:00:00 2001 From: Arsen Musayelyan Date: Wed, 30 Nov 2022 11:45:13 -0800 Subject: [PATCH] Begin moving repository operations into separate package --- config.go | 3 +- install.go | 4 +- internal/config/config.go | 17 ++---- internal/config/version.go | 6 ++ internal/repos/pull.go | 99 +++++++++++++++++++++++++++++++++ internal/types/config.go | 11 ++++ internal/types/repo.go | 7 +++ main.go | 5 +- repo.go | 111 ++----------------------------------- upgrade.go | 6 +- 10 files changed, 144 insertions(+), 125 deletions(-) create mode 100644 internal/config/version.go create mode 100644 internal/repos/pull.go create mode 100644 internal/types/config.go create mode 100644 internal/types/repo.go diff --git a/config.go b/config.go index 1009020..3ad1de8 100644 --- a/config.go +++ b/config.go @@ -21,10 +21,11 @@ package main import ( "go.arsenm.dev/logger/log" "go.arsenm.dev/lure/internal/config" + "go.arsenm.dev/lure/internal/types" "go.arsenm.dev/lure/manager" ) -var cfg config.Config +var cfg types.Config func init() { err := config.Decode(&cfg) diff --git a/install.go b/install.go index 496ce02..f0f4295 100644 --- a/install.go +++ b/install.go @@ -20,9 +20,11 @@ package main import ( "context" + "go.arsenm.dev/logger/log" "github.com/urfave/cli/v2" + "go.arsenm.dev/lure/internal/repos" "go.arsenm.dev/lure/manager" ) @@ -44,7 +46,7 @@ func installCmd(c *cli.Context) error { func installPkgs(ctx context.Context, pkgs []string, mgr manager.Manager, pull bool) { if pull { - err := pullRepos(ctx) + err := repos.Pull(ctx, cfg.Repos) if err != nil { log.Fatal("Error pulling repositories").Err(err).Send() } diff --git a/internal/config/config.go b/internal/config/config.go index a533912..5548c73 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -4,21 +4,12 @@ import ( "os" "github.com/pelletier/go-toml/v2" + "go.arsenm.dev/lure/internal/types" ) -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{ +var defaultConfig = types.Config{ RootCmd: "sudo", - Repos: []Repo{ + Repos: []types.Repo{ { Name: "default", URL: "https://github.com/Arsen6331/lure-repo.git", @@ -26,7 +17,7 @@ var defaultConfig = Config{ }, } -func Decode(cfg *Config) error { +func Decode(cfg *types.Config) error { cfgFl, err := os.Open(ConfigPath) if err != nil { return err diff --git a/internal/config/version.go b/internal/config/version.go new file mode 100644 index 0000000..5d27b80 --- /dev/null +++ b/internal/config/version.go @@ -0,0 +1,6 @@ +package config + +import _ "embed" + +//go:embed version.txt +var Version string diff --git a/internal/repos/pull.go b/internal/repos/pull.go new file mode 100644 index 0000000..a2cadac --- /dev/null +++ b/internal/repos/pull.go @@ -0,0 +1,99 @@ +package repos + +import ( + "context" + "net/url" + "os" + "path/filepath" + "strings" + + "github.com/go-git/go-billy/v5" + "github.com/go-git/go-billy/v5/osfs" + "github.com/go-git/go-git/v5" + "github.com/pelletier/go-toml/v2" + "go.arsenm.dev/logger/log" + "go.arsenm.dev/lure/download" + "go.arsenm.dev/lure/internal/config" + "go.arsenm.dev/lure/internal/types" + "go.arsenm.dev/lure/vercmp" +) + +func Pull(ctx context.Context, repos []types.Repo) error { + for _, repo := range repos { + repoURL, err := url.Parse(repo.URL) + if err != nil { + return err + } + + log.Info("Pulling repository").Str("name", repo.Name).Send() + repoDir := filepath.Join(config.RepoDir, repo.Name) + + var repoFS billy.Filesystem + gitDir := filepath.Join(repoDir, ".git") + // Only pull repos that contain valid git repos + if fi, err := os.Stat(gitDir); err == nil && fi.IsDir() { + r, err := git.PlainOpen(repoDir) + if err != nil { + return err + } + + w, err := r.Worktree() + if err != nil { + return err + } + + err = w.PullContext(ctx, &git.PullOptions{Progress: os.Stderr}) + if err == git.NoErrAlreadyUpToDate { + log.Info("Repository up to date").Str("name", repo.Name).Send() + } else if err != nil { + return err + } + + repoFS = w.Filesystem + } else { + err = os.RemoveAll(repoDir) + if err != nil { + return err + } + + err = os.MkdirAll(repoDir, 0o755) + if err != nil { + return err + } + + if !strings.HasPrefix(repoURL.Scheme, "git+") { + repoURL.Scheme = "git+" + repoURL.Scheme + } + + err = download.Get(ctx, download.GetOptions{ + SourceURL: repoURL.String(), + Destination: repoDir, + }) + if err != nil { + return err + } + + repoFS = osfs.New(repoDir) + } + + fl, err := repoFS.Open("lure-repo.toml") + if err != nil { + log.Warn("Git repository does not appear to be a valid LURE repo").Str("repo", repo.Name).Send() + continue + } + + var repoCfg types.RepoConfig + err = toml.NewDecoder(fl).Decode(&repoCfg) + if err != nil { + return err + } + fl.Close() + + currentVer, _, _ := strings.Cut(config.Version, "-") + if vercmp.Compare(currentVer, repoCfg.Repo.MinVersion) == -1 { + log.Warn("LURE repo's minumum LURE version is greater than the current version. Try updating LURE if something doesn't work.").Str("repo", repo.Name).Send() + } + } + + return nil +} diff --git a/internal/types/config.go b/internal/types/config.go new file mode 100644 index 0000000..663da7a --- /dev/null +++ b/internal/types/config.go @@ -0,0 +1,11 @@ +package types + +type Config struct { + RootCmd string `toml:"rootCmd"` + Repos []Repo `toml:"repo"` +} + +type Repo struct { + Name string `toml:"name"` + URL string `toml:"url"` +} diff --git a/internal/types/repo.go b/internal/types/repo.go new file mode 100644 index 0000000..2052417 --- /dev/null +++ b/internal/types/repo.go @@ -0,0 +1,7 @@ +package types + +type RepoConfig struct { + Repo struct { + MinVersion string `toml:"minVersion"` + } +} diff --git a/main.go b/main.go index 7e5160a..6bedc58 100644 --- a/main.go +++ b/main.go @@ -28,8 +28,11 @@ import ( "github.com/urfave/cli/v2" "go.arsenm.dev/logger" "go.arsenm.dev/logger/log" + "go.arsenm.dev/lure/internal/config" ) +//go:generate scripts/gen-version.sh + func init() { log.Logger = logger.NewPretty(os.Stderr) } @@ -146,6 +149,6 @@ func main() { } func displayVersion(c *cli.Context) error { - print(version) + print(config.Version) return nil } diff --git a/repo.go b/repo.go index f56b090..5ce50b6 100644 --- a/repo.go +++ b/repo.go @@ -19,19 +19,16 @@ package main import ( - "context" - "net/url" "os" "path/filepath" - "strings" "github.com/AlecAivazis/survey/v2" - "github.com/go-git/go-git/v5" "github.com/pelletier/go-toml/v2" "github.com/urfave/cli/v2" "go.arsenm.dev/logger/log" - "go.arsenm.dev/lure/download" "go.arsenm.dev/lure/internal/config" + "go.arsenm.dev/lure/internal/repos" + "go.arsenm.dev/lure/internal/types" "golang.org/x/exp/slices" ) @@ -43,12 +40,6 @@ func (p PkgNotFoundError) Error() string { return "package '" + p.pkgName + "' could not be found in any repository" } -type RepoConfig struct { - Repo struct { - MinVersion string `toml:"minVersion"` - } -} - func addrepoCmd(c *cli.Context) error { name := c.String("name") repoURL := c.String("url") @@ -59,7 +50,7 @@ func addrepoCmd(c *cli.Context) error { } } - cfg.Repos = append(cfg.Repos, config.Repo{ + cfg.Repos = append(cfg.Repos, types.Repo{ Name: name, URL: repoURL, }) @@ -113,7 +104,7 @@ func removerepoCmd(c *cli.Context) error { } func refreshCmd(c *cli.Context) error { - err := pullRepos(c.Context) + err := repos.Pull(c.Context, cfg.Repos) if err != nil { log.Fatal("Error pulling repos").Err(err).Send() } @@ -197,97 +188,3 @@ func findPkgs(pkgs []string) (scripts, notFound []string) { } return } - -func pullRepos(ctx context.Context) error { - 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(config.RepoDir, repo.Name) - - gitDir := filepath.Join(repoDir, ".git") - if fi, err := os.Stat(gitDir); err == nil && fi.IsDir() { - r, err := git.PlainOpen(repoDir) - if err != nil { - return err - } - - w, err := r.Worktree() - if err != nil { - return err - } - - err = w.PullContext(ctx, &git.PullOptions{Progress: os.Stderr}) - if err == git.NoErrAlreadyUpToDate { - log.Info("Repository up to date").Str("name", repo.Name).Send() - continue - } else if err != nil { - return err - } - - fl, err := w.Filesystem.Open("lure-repo.toml") - if err != nil { - log.Warn("Git repository does not appear to be a valid LURE repo").Str("repo", repo.Name).Send() - continue - } - - var repoCfg RepoConfig - err = toml.NewDecoder(fl).Decode(&repoCfg) - if err != nil { - return err - } - fl.Close() - - currentVer, _, _ := strings.Cut(version, "-") - if vercmp(currentVer, repoCfg.Repo.MinVersion) == -1 { - log.Warn("LURE repo's minumum LURE version is greater than the current version. Try updating LURE if something doesn't work.").Str("repo", repo.Name).Send() - } - - continue - } - - err = os.RemoveAll(repoDir) - if err != nil { - return err - } - - err = os.MkdirAll(repoDir, 0o755) - if err != nil { - return err - } - - if !strings.HasPrefix(repoURL.Scheme, "git+") { - repoURL.Scheme = "git+" + repoURL.Scheme - } - - err = download.Get(ctx, download.GetOptions{ - SourceURL: repoURL.String(), - Destination: repoDir, - }) - if err != nil { - return err - } - - fl, err := os.Open(filepath.Join(repoDir, "lure-repo.toml")) - if err != nil { - log.Warn("Git repository does not appear to be a valid LURE repo").Str("repo", repo.Name).Send() - } - - var repoCfg RepoConfig - err = toml.NewDecoder(fl).Decode(&repoCfg) - if err != nil { - return err - } - fl.Close() - - currentVer, _, _ := strings.Cut(version, "-") - if vercmp(currentVer, repoCfg.Repo.MinVersion) == -1 { - log.Warn("LURE repo's minumum LURE version is greater than the current version. Try updating LURE if something doesn't work.").Str("repo", repo.Name).Send() - } - } - - return nil -} diff --git a/upgrade.go b/upgrade.go index b23ddd0..13ad8de 100644 --- a/upgrade.go +++ b/upgrade.go @@ -25,7 +25,9 @@ import ( "github.com/urfave/cli/v2" "go.arsenm.dev/logger/log" "go.arsenm.dev/lure/distro" + "go.arsenm.dev/lure/internal/repos" "go.arsenm.dev/lure/manager" + "go.arsenm.dev/lure/vercmp" ) func upgradeCmd(c *cli.Context) error { @@ -39,7 +41,7 @@ func upgradeCmd(c *cli.Context) error { log.Fatal("Unable to detect supported package manager on system").Send() } - err = pullRepos(c.Context) + err = repos.Pull(c.Context, cfg.Repos) if err != nil { log.Fatal("Error pulling repos").Err(err).Send() } @@ -86,7 +88,7 @@ func checkForUpdates(ctx context.Context, mgr manager.Manager, info *distro.OSRe repoVer = fmt.Sprintf("%d:%s-%d", vars.Epoch, vars.Version, vars.Release) } - c := vercmp(repoVer, version) + c := vercmp.Compare(repoVer, version) if c == 0 || c == -1 { continue } else if c == 1 {