Begin moving repository operations into separate package
ci/woodpecker/push/woodpecker Pipeline was successful
Details
ci/woodpecker/push/woodpecker Pipeline was successful
Details
This commit is contained in:
parent
9a06894cfa
commit
715fd6ccc9
|
@ -21,10 +21,11 @@ package main
|
||||||
import (
|
import (
|
||||||
"go.arsenm.dev/logger/log"
|
"go.arsenm.dev/logger/log"
|
||||||
"go.arsenm.dev/lure/internal/config"
|
"go.arsenm.dev/lure/internal/config"
|
||||||
|
"go.arsenm.dev/lure/internal/types"
|
||||||
"go.arsenm.dev/lure/manager"
|
"go.arsenm.dev/lure/manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
var cfg config.Config
|
var cfg types.Config
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
err := config.Decode(&cfg)
|
err := config.Decode(&cfg)
|
||||||
|
|
|
@ -20,9 +20,11 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"go.arsenm.dev/logger/log"
|
"go.arsenm.dev/logger/log"
|
||||||
|
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
"go.arsenm.dev/lure/internal/repos"
|
||||||
"go.arsenm.dev/lure/manager"
|
"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) {
|
func installPkgs(ctx context.Context, pkgs []string, mgr manager.Manager, pull bool) {
|
||||||
if pull {
|
if pull {
|
||||||
err := pullRepos(ctx)
|
err := repos.Pull(ctx, cfg.Repos)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Error pulling repositories").Err(err).Send()
|
log.Fatal("Error pulling repositories").Err(err).Send()
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,21 +4,12 @@ import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/pelletier/go-toml/v2"
|
"github.com/pelletier/go-toml/v2"
|
||||||
|
"go.arsenm.dev/lure/internal/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
var defaultConfig = types.Config{
|
||||||
RootCmd string `toml:"rootCmd"`
|
|
||||||
Repos []Repo `toml:"repo"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Repo struct {
|
|
||||||
Name string `toml:"name"`
|
|
||||||
URL string `toml:"url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaultConfig = Config{
|
|
||||||
RootCmd: "sudo",
|
RootCmd: "sudo",
|
||||||
Repos: []Repo{
|
Repos: []types.Repo{
|
||||||
{
|
{
|
||||||
Name: "default",
|
Name: "default",
|
||||||
URL: "https://github.com/Arsen6331/lure-repo.git",
|
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)
|
cfgFl, err := os.Open(ConfigPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
import _ "embed"
|
||||||
|
|
||||||
|
//go:embed version.txt
|
||||||
|
var Version string
|
|
@ -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
|
||||||
|
}
|
|
@ -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"`
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
type RepoConfig struct {
|
||||||
|
Repo struct {
|
||||||
|
MinVersion string `toml:"minVersion"`
|
||||||
|
}
|
||||||
|
}
|
5
main.go
5
main.go
|
@ -28,8 +28,11 @@ import (
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"go.arsenm.dev/logger"
|
"go.arsenm.dev/logger"
|
||||||
"go.arsenm.dev/logger/log"
|
"go.arsenm.dev/logger/log"
|
||||||
|
"go.arsenm.dev/lure/internal/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//go:generate scripts/gen-version.sh
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
log.Logger = logger.NewPretty(os.Stderr)
|
log.Logger = logger.NewPretty(os.Stderr)
|
||||||
}
|
}
|
||||||
|
@ -146,6 +149,6 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func displayVersion(c *cli.Context) error {
|
func displayVersion(c *cli.Context) error {
|
||||||
print(version)
|
print(config.Version)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
111
repo.go
111
repo.go
|
@ -19,19 +19,16 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"net/url"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/AlecAivazis/survey/v2"
|
"github.com/AlecAivazis/survey/v2"
|
||||||
"github.com/go-git/go-git/v5"
|
|
||||||
"github.com/pelletier/go-toml/v2"
|
"github.com/pelletier/go-toml/v2"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"go.arsenm.dev/logger/log"
|
"go.arsenm.dev/logger/log"
|
||||||
"go.arsenm.dev/lure/download"
|
|
||||||
"go.arsenm.dev/lure/internal/config"
|
"go.arsenm.dev/lure/internal/config"
|
||||||
|
"go.arsenm.dev/lure/internal/repos"
|
||||||
|
"go.arsenm.dev/lure/internal/types"
|
||||||
"golang.org/x/exp/slices"
|
"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"
|
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 {
|
func addrepoCmd(c *cli.Context) error {
|
||||||
name := c.String("name")
|
name := c.String("name")
|
||||||
repoURL := c.String("url")
|
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,
|
Name: name,
|
||||||
URL: repoURL,
|
URL: repoURL,
|
||||||
})
|
})
|
||||||
|
@ -113,7 +104,7 @@ func removerepoCmd(c *cli.Context) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func refreshCmd(c *cli.Context) error {
|
func refreshCmd(c *cli.Context) error {
|
||||||
err := pullRepos(c.Context)
|
err := repos.Pull(c.Context, cfg.Repos)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Error pulling repos").Err(err).Send()
|
log.Fatal("Error pulling repos").Err(err).Send()
|
||||||
}
|
}
|
||||||
|
@ -197,97 +188,3 @@ func findPkgs(pkgs []string) (scripts, notFound []string) {
|
||||||
}
|
}
|
||||||
return
|
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
|
|
||||||
}
|
|
||||||
|
|
|
@ -25,7 +25,9 @@ import (
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
"go.arsenm.dev/logger/log"
|
"go.arsenm.dev/logger/log"
|
||||||
"go.arsenm.dev/lure/distro"
|
"go.arsenm.dev/lure/distro"
|
||||||
|
"go.arsenm.dev/lure/internal/repos"
|
||||||
"go.arsenm.dev/lure/manager"
|
"go.arsenm.dev/lure/manager"
|
||||||
|
"go.arsenm.dev/lure/vercmp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func upgradeCmd(c *cli.Context) error {
|
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()
|
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 {
|
if err != nil {
|
||||||
log.Fatal("Error pulling repos").Err(err).Send()
|
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)
|
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 {
|
if c == 0 || c == -1 {
|
||||||
continue
|
continue
|
||||||
} else if c == 1 {
|
} else if c == 1 {
|
||||||
|
|
Loading…
Reference in New Issue