github.com/snyk/vervet/v6@v6.2.4/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/snyk/vervet/v6/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  }