-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathcreate.go
138 lines (111 loc) · 3.26 KB
/
create.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package commands
import (
"fmt"
"kool-dev/kool/core/environment"
"kool-dev/kool/core/presets"
"kool-dev/kool/core/shell"
"os"
"path"
"path/filepath"
"github.com/spf13/cobra"
)
// TODO: create flag for --no-preset so the command runs only the create portion of the preset config
// KoolCreate holds handlers and functions to implement the create command logic
type KoolCreate struct {
DefaultKoolService
parser presets.Parser
env environment.EnvStorage
}
func AddKoolCreate(root *cobra.Command) {
var (
createCmd = NewCreateCommand(NewKoolCreate())
)
root.AddCommand(createCmd)
}
// NewKoolCreate creates a new handler for create logic
func NewKoolCreate() *KoolCreate {
return &KoolCreate{
*newDefaultKoolService(),
presets.NewParser(),
environment.NewEnvStorage(),
}
}
// Execute runs the create logic with incoming arguments.
func (c *KoolCreate) Execute(args []string) (err error) {
var (
createDirectory, preset string
)
if len(args) == 2 {
preset = args[0]
createDirectory = args[1]
} else if len(args) == 1 {
err = fmt.Errorf("bad number of arguments - either specify both preset and directory or none")
return
} else {
if preset, err = NewKoolPreset().getPreset(args); err != nil {
return
}
for {
if createDirectory, err = shell.NewPromptInput().Input("New folder name:", fmt.Sprintf("my-kool-%s-project", preset)); err != nil {
return
}
if createDirectory == "" {
c.Shell().Error(fmt.Errorf("Please enter a valid folder name"))
continue
} else if _, err = os.Stat(createDirectory); !os.IsNotExist(err) {
c.Shell().Error(fmt.Errorf("Folder %s already exists.", createDirectory))
continue
} else {
if err = os.MkdirAll(filepath.Join(os.TempDir(), createDirectory), 0755); err != nil {
c.Shell().Error(fmt.Errorf("Please enter a valid folder name"))
continue
} else {
// ok we created, let's just have it removed if we fail
defer func() {
_ = os.RemoveAll(filepath.Join(os.TempDir(), createDirectory))
}()
}
}
// if no error, we got our directory
break
}
}
// sets env variable CREATE_DIRECTORY so preset can use it
c.env.Set("CREATE_DIRECTORY", createDirectory)
if !c.parser.Exists(preset) {
err = fmt.Errorf("unknown preset %s", preset)
return
}
c.Shell().Println("Creating new", preset, "project...")
c.parser.PrepareExecutor(c.Shell())
if err = c.parser.Create(preset); err != nil {
return
}
c.Shell().Println("Initializing", preset, "preset...")
if !path.IsAbs(createDirectory) {
if createDirectory, err = filepath.Abs(createDirectory); err != nil {
return
}
}
if err = os.Chdir(createDirectory); err != nil {
return
}
c.env.Set("PWD", createDirectory)
if err = c.parser.Install(preset); err != nil {
return
}
c.Shell().Success("Preset ", preset, " created successfully!")
return
}
// NewCreateCommand initializes new kool create command
func NewCreateCommand(create *KoolCreate) (createCmd *cobra.Command) {
createCmd = &cobra.Command{
Use: "create PRESET FOLDER",
Short: "Create a new project using a preset",
Long: "Create a new project using the specified PRESET in a directory named FOLDER.",
Args: cobra.MaximumNArgs(2),
RunE: DefaultCommandRunFunction(create),
DisableFlagsInUseLine: true,
}
return
}