package recipe import ( "fmt" "os" "path" "text/template" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/git" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) var recipeNewCommand = &cli.Command{ Name: "new", Usage: "Create a new recipe", Aliases: []string{"n"}, ArgsUsage: "", Action: func(c *cli.Context) error { recipe := internal.ValidateRecipe(c) directory := path.Join(config.APPS_DIR, recipe.Name) if _, err := os.Stat(directory); !os.IsNotExist(err) { logrus.Fatalf("'%s' recipe directory already exists?", directory) return nil } url := fmt.Sprintf("%s/example.git", config.REPOS_BASE_URL) if err := git.Clone(directory, url); err != nil { return err } gitRepo := path.Join(config.APPS_DIR, recipe.Name, ".git") if err := os.RemoveAll(gitRepo); err != nil { logrus.Fatal(err) return nil } logrus.Debugf("removed git repo in '%s'", gitRepo) toParse := []string{ path.Join(config.APPS_DIR, recipe.Name, "README.md"), path.Join(config.APPS_DIR, recipe.Name, ".env.sample"), path.Join(config.APPS_DIR, recipe.Name, ".drone.yml"), } for _, path := range toParse { file, err := os.OpenFile(path, os.O_RDWR, 0755) if err != nil { logrus.Fatal(err) return nil } tpl, err := template.ParseFiles(path) if err != nil { logrus.Fatal(err) return nil } // TODO: ask for description and probably other things so that the // template repository is more "ready" to go than the current best-guess // mode of templating if err := tpl.Execute(file, struct { Name string Description string }{recipe.Name, "TODO"}); err != nil { logrus.Fatal(err) return nil } } logrus.Infof( "new recipe '%s' created in %s, happy hacking!\n", recipe.Name, path.Join(config.APPS_DIR, recipe.Name), ) return nil }, }