Skip to content

Commit 74e84e8

Browse files
authored
Merge pull request #3889 from ashwat287/Enhancestarthelp
fix: restructure `limactl start --help output for better readability
2 parents 0429723 + 0b5a505 commit 74e84e8

File tree

1 file changed

+103
-3
lines changed

1 file changed

+103
-3
lines changed

cmd/limactl/start.go

Lines changed: 103 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/sirupsen/logrus"
1616
"github.com/spf13/cobra"
17+
"github.com/spf13/pflag"
1718

1819
"github.com/lima-vm/lima/v2/cmd/limactl/editflags"
1920
"github.com/lima-vm/lima/v2/pkg/editutil"
@@ -84,9 +85,6 @@ func newStartCommand() *cobra.Command {
8485
8586
To create an instance "default" from a template "docker", and start it:
8687
$ 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'.
9088
`,
9189
Short: "Start an instance of Lima",
9290
Args: WrapArgsError(cobra.MaximumNArgs(1)),
@@ -100,9 +98,111 @@ See the examples in 'limactl create --help'.
10098
}
10199
startCommand.Flags().Duration("timeout", instance.DefaultWatchHostAgentEventsTimeout, "Duration to wait for the instance to be running before timing out")
102100
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+
103110
return startCommand
104111
}
105112

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+
106206
func loadOrCreateInstance(cmd *cobra.Command, args []string, createOnly bool) (*store.Instance, error) {
107207
ctx := cmd.Context()
108208
var arg string // can be empty

0 commit comments

Comments
 (0)