@@ -14,6 +14,7 @@ import (
14
14
15
15
"github.com/sirupsen/logrus"
16
16
"github.com/spf13/cobra"
17
+ "github.com/spf13/pflag"
17
18
18
19
"github.com/lima-vm/lima/v2/cmd/limactl/editflags"
19
20
"github.com/lima-vm/lima/v2/pkg/editutil"
@@ -84,9 +85,6 @@ func newStartCommand() *cobra.Command {
84
85
85
86
To create an instance "default" from a template "docker", and start it:
86
87
$ limactl start --name=default template://docker
87
-
88
- 'limactl start' also accepts the 'limactl create' flags such as '--set'.
89
- See the examples in 'limactl create --help'.
90
88
` ,
91
89
Short : "Start an instance of Lima" ,
92
90
Args : WrapArgsError (cobra .MaximumNArgs (1 )),
@@ -100,9 +98,111 @@ See the examples in 'limactl create --help'.
100
98
}
101
99
startCommand .Flags ().Duration ("timeout" , instance .DefaultWatchHostAgentEventsTimeout , "Duration to wait for the instance to be running before timing out" )
102
100
startCommand .Flags ().Bool ("progress" , false , "Show provision script progress by tailing cloud-init logs" )
101
+ startCommand .SetHelpFunc (func (cmd * cobra.Command , _ []string ) {
102
+ printCommandSummary (cmd )
103
+
104
+ allFlags , createFlags := collectFlags (cmd )
105
+ printFlags (allFlags , createFlags )
106
+
107
+ printGlobalFlags (cmd )
108
+ })
109
+
103
110
return startCommand
104
111
}
105
112
113
+ func printCommandSummary (cmd * cobra.Command ) {
114
+ fmt .Fprintf (cmd .OutOrStdout (), "%s\n \n " , cmd .Short )
115
+ fmt .Fprintf (cmd .OutOrStdout (), "Usage:\n %s\n \n " , cmd .UseLine ())
116
+
117
+ if cmd .Example != "" {
118
+ fmt .Fprintf (cmd .OutOrStdout (), "Examples:\n %s\n \n " , cmd .Example )
119
+ }
120
+ }
121
+
122
+ func getFlagType (flag * pflag.Flag ) string {
123
+ switch flag .Value .Type () {
124
+ case "bool" :
125
+ return ""
126
+ case "string" :
127
+ return "string"
128
+ case "int" :
129
+ return "int"
130
+ case "duration" :
131
+ return "duration"
132
+ case "stringSlice" , "stringArray" :
133
+ return "strings"
134
+ case "ipSlice" :
135
+ return "ipSlice"
136
+ case "uint16" :
137
+ return "uint16"
138
+ case "float32" :
139
+ return "float32"
140
+ default :
141
+ return flag .Value .Type ()
142
+ }
143
+ }
144
+
145
+ func formatFlag (flag * pflag.Flag ) (flagName , shorthand string ) {
146
+ flagName = "--" + flag .Name
147
+
148
+ if flag .Shorthand != "" {
149
+ shorthand = "-" + flag .Shorthand
150
+ }
151
+
152
+ flagType := getFlagType (flag )
153
+ if flagType != "" {
154
+ flagName += " " + flagType
155
+ }
156
+
157
+ return flagName , shorthand
158
+ }
159
+
160
+ func collectFlags (cmd * cobra.Command ) (allFlags , createFlags []string ) {
161
+ cmd .LocalFlags ().VisitAll (func (flag * pflag.Flag ) {
162
+ flagName , shorthand := formatFlag (flag )
163
+ flagUsage := flag .Usage
164
+
165
+ var formattedFlag string
166
+ if shorthand != "" {
167
+ formattedFlag = fmt .Sprintf (" %s, %s" , shorthand , flagName )
168
+ } else {
169
+ formattedFlag = fmt .Sprintf (" %s" , flagName )
170
+ }
171
+
172
+ if strings .HasPrefix (flagUsage , "[limactl create]" ) {
173
+ cleanUsage := strings .TrimPrefix (flagUsage , "[limactl create] " )
174
+ createFlags = append (createFlags , fmt .Sprintf ("%-25s %s" , formattedFlag , cleanUsage ))
175
+ } else {
176
+ allFlags = append (allFlags , fmt .Sprintf ("%-25s %s" , formattedFlag , flagUsage ))
177
+ }
178
+ })
179
+ return allFlags , createFlags
180
+ }
181
+
182
+ func printFlags (allFlags , createFlags []string ) {
183
+ if len (allFlags ) > 0 {
184
+ fmt .Fprint (os .Stdout , "Flags:\n " )
185
+ for _ , flag := range allFlags {
186
+ fmt .Fprintln (os .Stdout , flag )
187
+ }
188
+ fmt .Fprint (os .Stdout , "\n " )
189
+ }
190
+
191
+ if len (createFlags ) > 0 {
192
+ fmt .Fprint (os .Stdout , "Flags inherited from `limactl create`:\n " )
193
+ for _ , flag := range createFlags {
194
+ fmt .Fprintln (os .Stdout , flag )
195
+ }
196
+ fmt .Fprint (os .Stdout , "\n " )
197
+ }
198
+ }
199
+
200
+ func printGlobalFlags (cmd * cobra.Command ) {
201
+ if cmd .HasAvailableInheritedFlags () {
202
+ fmt .Fprintf (cmd .OutOrStdout (), "Global Flags:\n %s" , cmd .InheritedFlags ().FlagUsages ())
203
+ }
204
+ }
205
+
106
206
func loadOrCreateInstance (cmd * cobra.Command , args []string , createOnly bool ) (* store.Instance , error ) {
107
207
ctx := cmd .Context ()
108
208
var arg string // can be empty
0 commit comments