forked from toolshed/abra
feat: teach catalogue generate to use git
This commit is contained in:
@ -8,10 +8,13 @@ import (
|
||||
"path"
|
||||
|
||||
"coopcloud.tech/abra/cli/formatter"
|
||||
"coopcloud.tech/abra/cli/internal"
|
||||
"coopcloud.tech/abra/pkg/catalogue"
|
||||
"coopcloud.tech/abra/pkg/config"
|
||||
"coopcloud.tech/abra/pkg/git"
|
||||
gitPkg "coopcloud.tech/abra/pkg/git"
|
||||
"coopcloud.tech/abra/pkg/limit"
|
||||
"github.com/AlecAivazis/survey/v2"
|
||||
"github.com/go-git/go-git/v5"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/urfave/cli/v2"
|
||||
)
|
||||
@ -48,26 +51,52 @@ var CatalogueSkipList = map[string]bool{
|
||||
"tyop": true,
|
||||
}
|
||||
|
||||
var commit bool
|
||||
var commitFlag = &cli.BoolFlag{
|
||||
Name: "commit",
|
||||
Usage: "Commits new generated catalogue changes",
|
||||
Value: false,
|
||||
Aliases: []string{"c"},
|
||||
Destination: &commit,
|
||||
}
|
||||
|
||||
var catalogueGenerateCommand = &cli.Command{
|
||||
Name: "generate",
|
||||
Aliases: []string{"g"},
|
||||
Usage: "Generate a new copy of the catalogue",
|
||||
ArgsUsage: "[<recipe>]",
|
||||
BashComplete: func(c *cli.Context) {
|
||||
catl, err := catalogue.ReadRecipeCatalogue()
|
||||
if err != nil {
|
||||
logrus.Warn(err)
|
||||
}
|
||||
if c.NArg() > 0 {
|
||||
return
|
||||
}
|
||||
for name := range catl {
|
||||
fmt.Println(name)
|
||||
}
|
||||
Name: "generate",
|
||||
Aliases: []string{"g"},
|
||||
Usage: "Generate a new copy of the catalogue",
|
||||
Flags: []cli.Flag{
|
||||
internal.PushFlag,
|
||||
commitFlag,
|
||||
internal.CommitMessageFlag,
|
||||
},
|
||||
Description: `
|
||||
This command generates a new copy of the recipe catalogue which can be found on:
|
||||
|
||||
https://recipes.coopcloud.tech
|
||||
|
||||
It polls the entire git.coopcloud.tech/coop-cloud/... recipe repository
|
||||
listing, parses README and tags to produce recipe metadata and produces a
|
||||
apps.json file which is placed in your ~/.abra/catalogue/recipes.json.
|
||||
|
||||
It is possible to generate new metadata for a single recipe by passing
|
||||
<recipe>. The existing local catalogue will be updated, not overwritten.
|
||||
|
||||
A new catalogue copy can be published to the recipes repository by passing the
|
||||
"--commit" and "--push" flags. The recipes repository is available here:
|
||||
|
||||
https://git.coopcloud.tech/coop-cloud/recipes
|
||||
|
||||
`,
|
||||
ArgsUsage: "[<recipe>]",
|
||||
Action: func(c *cli.Context) error {
|
||||
recipeName := c.Args().First()
|
||||
|
||||
catalogueDir := path.Join(config.ABRA_DIR, "catalogue")
|
||||
url := fmt.Sprintf("%s/%s.git", config.REPOS_BASE_URL, "recipes")
|
||||
if err := gitPkg.Clone(catalogueDir, url); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
repos, err := catalogue.ReadReposMetadata()
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
@ -96,11 +125,11 @@ var catalogueGenerateCommand = &cli.Command{
|
||||
|
||||
recipeDir := path.Join(config.ABRA_DIR, "apps", rm.Name)
|
||||
|
||||
if err := git.Clone(recipeDir, rm.SSHURL); err != nil {
|
||||
if err := gitPkg.Clone(recipeDir, rm.SSHURL); err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
|
||||
if err := git.EnsureUpToDate(recipeDir); err != nil {
|
||||
if err := gitPkg.EnsureUpToDate(recipeDir); err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
|
||||
@ -172,8 +201,61 @@ var catalogueGenerateCommand = &cli.Command{
|
||||
}
|
||||
}
|
||||
|
||||
logrus.Infof("generated new recipe catalogue in '%s'", config.APPS_JSON)
|
||||
cataloguePath := path.Join(config.ABRA_DIR, "catalogue", "recipes.json")
|
||||
logrus.Infof("generated new recipe catalogue in %s", cataloguePath)
|
||||
|
||||
if commit {
|
||||
repoPath := path.Join(config.ABRA_DIR, "catalogue")
|
||||
commitRepo, err := git.PlainOpen(repoPath)
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
|
||||
commitWorktree, err := commitRepo.Worktree()
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
|
||||
if internal.CommitMessage == "" {
|
||||
prompt := &survey.Input{
|
||||
Message: "commit message",
|
||||
Default: "chore: publish new catalogue changes",
|
||||
}
|
||||
if err := survey.AskOne(prompt, &internal.CommitMessage); err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
err = commitWorktree.AddGlob("**.json")
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
logrus.Debug("staged **.json for commit")
|
||||
|
||||
_, err = commitWorktree.Commit(internal.CommitMessage, &git.CommitOptions{})
|
||||
if err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
logrus.Info("changes commited")
|
||||
|
||||
if err := commitRepo.Push(&git.PushOptions{}); err != nil {
|
||||
logrus.Fatal(err)
|
||||
}
|
||||
logrus.Info("changes pushed")
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
BashComplete: func(c *cli.Context) {
|
||||
catl, err := catalogue.ReadRecipeCatalogue()
|
||||
if err != nil {
|
||||
logrus.Warn(err)
|
||||
}
|
||||
if c.NArg() > 0 {
|
||||
return
|
||||
}
|
||||
for name := range catl {
|
||||
fmt.Println(name)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
Reference in New Issue
Block a user