
Changes: - cmd/app.go - Удален Config за ненадобностью; - Добавлены флаги -n, -g, -f. Подробно в документации; - Теперь при запуске приложения создаются папка приложения и временная папка приложения; - Добавлено чтение из папки и чтение из git-репозитория; - blueprint: - слегка изменена логика проверки файла настроек; - в creator добавлена переменная projectName; - в template просто переименовал структуру; - modules/env: - добавлена проверка обязательных значений из настроек; - добавлена проверка значения переменной в Declaration; - поправлена периодическая ошибка с go get; - modules/logger; - удалена ненужная функция GetFunctions(); - добавлена проверка значения переменной messageType для Message; - поправлена периодическая ошибка с go get; - README.md: добавлена документация по приложению.
199 lines
4.3 KiB
Go
199 lines
4.3 KiB
Go
package cmd
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"os"
|
||
"os/exec"
|
||
"path/filepath"
|
||
"strings"
|
||
|
||
"github.com/rs/zerolog/log"
|
||
"penahub.gitlab.yandexcloud.net/pena-services/bluepint/blueprint"
|
||
)
|
||
|
||
type App struct {
|
||
Name string
|
||
Version string
|
||
Dir string
|
||
TempDir string
|
||
}
|
||
|
||
type StartFlags struct {
|
||
ProjectName string
|
||
Git string
|
||
Folder string
|
||
}
|
||
|
||
func NewApp() *App {
|
||
return &App{
|
||
Name: "blueprint",
|
||
Version: "0.0.1",
|
||
}
|
||
}
|
||
|
||
// Execute - Любой вызов приложения.
|
||
func (r *App) Execute() {
|
||
versionFlag := flag.Bool("v", false, "Show current version")
|
||
projectNameFlag := flag.String("n", "", "Set project name")
|
||
gitFlag := flag.String("g", "", "Get blueprint from git")
|
||
folderFlag := flag.String("f", "", "Get blueprint from ../<user>/blueprint/<folder>")
|
||
|
||
flag.Parse()
|
||
|
||
if *versionFlag {
|
||
if err := r.PrintVersion(); err != nil {
|
||
log.Error().Err(err).Msg("PrintVersion")
|
||
return
|
||
}
|
||
return
|
||
}
|
||
|
||
startFlags := StartFlags{
|
||
ProjectName: *projectNameFlag,
|
||
Git: *gitFlag,
|
||
Folder: *folderFlag,
|
||
}
|
||
|
||
log.Info().Str("version", r.Version).Msg("Blueprint started")
|
||
if err := r.Run(startFlags); err != nil {
|
||
log.Error().Err(err).Msg("Run app")
|
||
}
|
||
|
||
defer func() {
|
||
if err := r.Close(); err != nil {
|
||
log.Error().Err(err).Msg("Close app")
|
||
}
|
||
log.Info().Msg("Blueprint closed")
|
||
}()
|
||
}
|
||
|
||
// Run - Запуск приложения.
|
||
func (r *App) Run(flags StartFlags) error {
|
||
var err error
|
||
var blueprintPath, projectName string
|
||
|
||
// Create app directory and temporary directory
|
||
log.Info().Msg("Creating app directory")
|
||
if err = r.createDir(); err != nil {
|
||
return fmt.Errorf("cannot create app directory. %v", err)
|
||
}
|
||
|
||
log.Info().Msg("Creating temporary app directory")
|
||
if err = r.createTempDir(); err != nil {
|
||
return fmt.Errorf("cannot create temporary app directory. %v", err)
|
||
}
|
||
|
||
if flags.Folder != "" {
|
||
blueprintPath, err = r.getFromFolder(flags.Folder)
|
||
if err != nil {
|
||
return fmt.Errorf("cannot get from folder. %v", err)
|
||
}
|
||
}
|
||
|
||
if flags.Git != "" {
|
||
blueprintPath, err = r.getFromGit(flags.Git)
|
||
if err != nil {
|
||
return fmt.Errorf("cannot get from git. %v", err)
|
||
}
|
||
}
|
||
|
||
if flags.ProjectName != "" {
|
||
projectName = flags.ProjectName
|
||
}
|
||
|
||
blueprintCreator, err := blueprint.NewBlueprintCreator(blueprintPath, projectName)
|
||
if err != nil {
|
||
return fmt.Errorf("cannot create blueprint creator. %v", err)
|
||
}
|
||
|
||
if err = blueprintCreator.Create(); err != nil {
|
||
return fmt.Errorf("cannot create app. %v", err)
|
||
}
|
||
|
||
log.Info().Msg("Closing app")
|
||
|
||
return nil
|
||
}
|
||
|
||
func (r *App) Close() error {
|
||
log.Info().Msg("removing temporary directory")
|
||
return os.RemoveAll(r.TempDir)
|
||
}
|
||
|
||
// PrintVersion - Вывод версии приложения.
|
||
func (r *App) PrintVersion() error {
|
||
_, err := fmt.Println("Version: ", r.Version)
|
||
if err != nil {
|
||
return fmt.Errorf("cannot print. %v", err)
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// createDir - создает папку приложения, если она не существует.
|
||
func (r *App) createDir() error {
|
||
path, err := os.UserHomeDir()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
path = filepath.Join(path, r.Name)
|
||
|
||
r.Dir = path
|
||
|
||
_, err = os.Stat(r.Dir)
|
||
|
||
if err == nil {
|
||
return nil
|
||
}
|
||
|
||
if os.IsNotExist(err) {
|
||
return os.Mkdir(r.Dir, 0750)
|
||
}
|
||
|
||
return err
|
||
}
|
||
|
||
func (r *App) createTempDir() error {
|
||
path, err := os.MkdirTemp("", fmt.Sprintf("%v-*", r.Name))
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
r.TempDir = path
|
||
|
||
return nil
|
||
}
|
||
|
||
// getFromGit - возвращает папку с расположением git-репозитория указанного в флаге. Использует команду git clone для загрузки из git-репозитория.
|
||
func (r *App) getFromGit(url string) (path string, err error) {
|
||
cmd := exec.Command("git", "clone", url)
|
||
|
||
cmd.Dir = r.TempDir
|
||
|
||
if err := cmd.Run(); err != nil {
|
||
return "", err
|
||
}
|
||
|
||
url = strings.TrimSuffix(url, ".git")
|
||
|
||
repoName := filepath.Base(url)
|
||
|
||
path = filepath.Join(r.TempDir, repoName)
|
||
|
||
return path, nil
|
||
}
|
||
|
||
// getFromFolder - возвращает путь из папки приложения + папка из флага. Если папка не существует, то вернется ошибка.
|
||
func (r *App) getFromFolder(folder string) (path string, err error) {
|
||
path = filepath.Join(r.Dir, folder)
|
||
|
||
_, err = os.Stat(path)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
|
||
return path, nil
|
||
}
|