github.com/w3security/vervet/v5@v5.3.1-0.20230618081846-5bd9b5d799dc/internal/cmd/scaffold.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 8 "github.com/urfave/cli/v2" 9 10 "github.com/w3security/vervet/v5/internal/scaffold" 11 ) 12 13 // Scaffold is the `vervet scaffold` subcommand. 14 var Scaffold = cli.Command{ 15 Name: "scaffold", 16 Subcommands: []*cli.Command{{ 17 Name: "init", 18 Usage: "Initialize a new project from a scaffold", 19 ArgsUsage: "[path to scaffold directory]", 20 Flags: []cli.Flag{ 21 &cli.BoolFlag{ 22 Name: "force", 23 Aliases: []string{"f", "overwrite"}, 24 Usage: "Overwrite existing files", 25 }, 26 }, 27 Action: ScaffoldInit, 28 }}, 29 } 30 31 // ScaffoldInit creates a new project configuration from a provided scaffold directory. 32 func ScaffoldInit(ctx *cli.Context) error { 33 scaffoldDir := ctx.Args().Get(0) 34 if scaffoldDir == "" { 35 return fmt.Errorf("a scaffold name is required") 36 } 37 var err error 38 scaffoldDir, err = filepath.Abs(scaffoldDir) 39 if err != nil { 40 return err 41 } 42 if _, err := os.Stat(scaffoldDir); err != nil && os.IsNotExist(err) { 43 return err 44 } 45 targetDir, err := os.Getwd() 46 if err != nil { 47 return err 48 } 49 sc, err := scaffold.New(targetDir, scaffoldDir, scaffold.Force(ctx.Bool("force"))) 50 if err != nil { 51 return err 52 } 53 err = sc.Organize() 54 if err == scaffold.ErrAlreadyInitialized { 55 // If the project files already exist, prompt the user to see if they want to overwrite them. 56 vervetApp, err := appFromContext(ctx.Context) 57 if err != nil { 58 return err 59 } 60 prompt := vervetApp.Params.Prompt 61 overwrite, err := prompt.Confirm("Scaffold already initialized; do you want to overwrite") 62 if err != nil { 63 return err 64 } 65 if overwrite { 66 forceFn := scaffold.Force(true) 67 forceFn(sc) 68 // If an error happens with --force enabled, something new has gone wrong. 69 if err = sc.Organize(); err != nil { 70 return err 71 } 72 } 73 return nil 74 } else if err != nil { 75 return err 76 } 77 err = sc.Init() 78 if err != nil { 79 return err 80 } 81 return nil 82 }