func (cmd *Help) Execute(c flags.FlagContext) error { if len(c.Args()) == 0 { help.ShowHelp(cmd.ui.Writer(), help.GetHelpTemplate()) } else { cmdName := c.Args()[0] if commandregistry.Commands.CommandExists(cmdName) { cmd.ui.Say(commandregistry.Commands.CommandUsage(cmdName)) } else { //check plugin commands found := false for _, meta := range cmd.config.Plugins() { for _, c := range meta.Commands { if c.Name == cmdName || c.Alias == cmdName { output := T("NAME:") + "\n" output += " " + c.Name + " - " + c.HelpText + "\n" if c.Alias != "" { output += "\n" + T("ALIAS:") + "\n" output += " " + c.Alias + "\n" } output += "\n" + T("USAGE:") + "\n" output += " " + c.UsageDetails.Usage + "\n" if len(c.UsageDetails.Options) > 0 { output += "\n" + T("OPTIONS:") + "\n" //find longest name length l := 0 for n := range c.UsageDetails.Options { if len(n) > l { l = len(n) } } for n, f := range c.UsageDetails.Options { output += " -" + n + strings.Repeat(" ", 7+(l-len(n))) + f + "\n" } } cmd.ui.Say(output) found = true } } } if !found { return errors.New("'" + cmdName + "' is not a registered command. See 'cf help'") } } } return nil }
func main() { commands_loader.Load() defer handlePanics(deps.TeePrinter) defer deps.Config.Close() //handles `cf` | `cf -h` || `cf -help` if len(os.Args) == 1 || os.Args[1] == "--help" || os.Args[1] == "-help" || os.Args[1] == "--h" || os.Args[1] == "-h" { help.ShowHelp(help.GetHelpTemplate()) os.Exit(0) } //handle `cf -v` for cf version if len(os.Args) == 2 && (os.Args[1] == "-v" || os.Args[1] == "--version") { deps.Ui.Say(os.Args[0] + " version " + cf.Version + "-" + cf.BuiltOnDate) os.Exit(0) } //handle `cf --build` if len(os.Args) == 2 && (os.Args[1] == "--build" || os.Args[1] == "-b") { deps.Ui.Say(T("{{.CFName}} was built with Go version: {{.GoVersion}}", map[string]interface{}{ "CFName": os.Args[0], "GoVersion": runtime.Version(), })) os.Exit(0) } //handles `cf [COMMAND] -h ...` //rearrage args to `cf help COMMAND` and let `command help` to print out usage if requestHelp(os.Args[2:]) { os.Args[2] = os.Args[1] os.Args[1] = "help" } //run core command cmd := os.Args[1] if cmdRegistry.CommandExists(cmd) { meta := cmdRegistry.FindCommand(os.Args[1]).MetaData() fc := flags.NewFlagContext(meta.Flags) fc.SkipFlagParsing(meta.SkipFlagParsing) err := fc.Parse(os.Args[2:]...) if err != nil { deps.Ui.Failed("Incorrect Usage\n\n" + err.Error() + "\n\n" + cmdRegistry.CommandUsage(cmd)) } cmdRegistry.SetCommand(cmdRegistry.FindCommand(cmd).SetDependency(deps, false)) cfCmd := cmdRegistry.FindCommand(cmd) reqs, err := cfCmd.Requirements(requirements.NewFactory(deps.Ui, deps.Config, deps.RepoLocator), fc) if err != nil { deps.Ui.Failed(err.Error()) } for _, r := range reqs { if !r.Execute() { os.Exit(1) } } cfCmd.Execute(fc) os.Exit(0) } //non core command, try plugin command rpcService := newCliRpcServer(deps.TeePrinter, deps.TeePrinter) pluginsConfig := plugin_config.NewPluginConfig(func(err error) { deps.Ui.Failed(fmt.Sprintf("Error read/writing plugin config: %s, ", err.Error())) }) pluginList := pluginsConfig.Plugins() ran := rpc.RunMethodIfExists(rpcService, os.Args[1:], pluginList) if !ran { deps.Ui.Say("'" + os.Args[1] + T("' is not a registered command. See 'cf help'")) os.Exit(1) } }
io_helpers "github.com/cloudfoundry/cli/testhelpers/io" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("Help", func() { It("shows help for all commands", func() { dummyTemplate := ` {{range .Commands}}{{range .CommandSubGroups}}{{range .}} {{.Name}} {{end}}{{end}}{{end}} ` output := io_helpers.CaptureOutput(func() { help.ShowHelp(dummyTemplate) }) for _, metadata := range command_registry.Commands.Metadatas() { Expect(commandInOutput(metadata.Name, output)).To(BeTrue(), metadata.Name+" not in help") } }) It("shows help for all installed plugin's commands", func() { config_helpers.PluginRepoDir = func() string { return filepath.Join("..", "..", "fixtures", "config", "help-plugin-test-config") } dummyTemplate := ` {{range .Commands}}{{range .CommandSubGroups}}{{range .}} {{.Name}}
func main() { commands_loader.Load() defer handlePanics(deps.TeePrinter) defer deps.Config.Close() //////////////// non-codegangsta path /////////////////////// //handles `cf` | `cf -h` || `cf -help` if len(os.Args) == 1 || os.Args[1] == "--help" || os.Args[1] == "-help" || os.Args[1] == "--h" || os.Args[1] == "-h" { help.ShowHelp(help.GetHelpTemplate()) os.Exit(0) } //handle `cf -v` for cf version if len(os.Args) == 2 && os.Args[1] == "-v" { deps.Ui.Say(os.Args[0] + " version " + cf.Version + "-" + cf.BuiltOnDate) os.Exit(0) } //handles `cf [COMMAND] -h ...` //rearrage args to `cf help COMMAND` and let `command help` to print out usage if requestHelp(os.Args[2:]) { os.Args[2] = os.Args[1] os.Args[1] = "help" } if len(os.Args) > 1 { cmd := os.Args[1] if cmdRegistry.CommandExists(cmd) { meta := cmdRegistry.FindCommand(os.Args[1]).MetaData() fc := flags.NewFlagContext(meta.Flags) fc.SkipFlagParsing(meta.SkipFlagParsing) if requestHelp(os.Args[2:]) { deps.Ui.Say(cmdRegistry.CommandUsage(cmd)) os.Exit(0) } else { err := fc.Parse(os.Args[2:]...) if err != nil { deps.Ui.Failed("Incorrect Usage\n\n" + err.Error() + "\n\n" + cmdRegistry.CommandUsage(cmd)) } } cmdRegistry.SetCommand(cmdRegistry.FindCommand(cmd).SetDependency(deps, false)) cfCmd := cmdRegistry.FindCommand(cmd) reqs, err := cfCmd.Requirements(requirements.NewFactory(deps.Ui, deps.Config, deps.RepoLocator), fc) if err != nil { deps.Ui.Failed(err.Error()) } for _, r := range reqs { if !r.Execute() { os.Exit(1) } } cfCmd.Execute(fc) os.Exit(0) } } ////////////////////////////////////////// rpcService := newCliRpcServer(deps.TeePrinter, deps.TeePrinter) cmdFactory := command_factory.NewFactory(deps.Ui, deps.Config, deps.ManifestRepo, deps.RepoLocator, deps.PluginConfig, rpcService) requirementsFactory := requirements.NewFactory(deps.Ui, deps.Config, deps.RepoLocator) cmdRunner := command_runner.NewRunner(cmdFactory, requirementsFactory, deps.Ui) pluginsConfig := plugin_config.NewPluginConfig(func(err error) { deps.Ui.Failed(fmt.Sprintf("Error read/writing plugin config: %s, ", err.Error())) }) pluginList := pluginsConfig.Plugins() var badFlags string metaDatas := cmdFactory.CommandMetadatas() //return only metadata for current command metaDatas = mergePluginMetaData(metaDatas, pluginList) if len(os.Args) > 1 { flags := cmdFactory.GetCommandFlags(os.Args[1]) totalArgs, _ := cmdFactory.GetCommandTotalArgs(os.Args[1]) if args2skip := totalArgs + 2; len(os.Args) >= args2skip { badFlags = matchArgAndFlags(flags, os.Args[args2skip:]) } if badFlags != "" { badFlags = badFlags + "\n\n" } } injectHelpTemplate(badFlags) theApp := app.NewApp(cmdRunner, metaDatas...) rpcService.SetTheApp(theApp) if cmdFactory.CheckIfCoreCmdExists(os.Args[1]) { callCoreCommand(os.Args[0:], theApp) } else { // run each plugin and find the method/ // run method if exist ran := rpc.RunMethodIfExists(rpcService, os.Args[1:], pluginList) if !ran { deps.Ui.Say("'" + os.Args[1] + "' is not a registered command. See 'cf help'") os.Exit(1) } } }
var buffer *gbytes.Buffer BeforeEach(func() { buffer = gbytes.NewBuffer() }) AfterEach(func() { buffer.Close() }) It("shows help for all commands", func() { dummyTemplate := ` {{range .Commands}}{{range .CommandSubGroups}}{{range .}} {{.Name}} {{end}}{{end}}{{end}} ` help.ShowHelp(buffer, dummyTemplate) Expect(buffer).To(gbytes.Say("login")) for _, metadata := range commandregistry.Commands.Metadatas() { if metadata.Hidden { continue } Expect(buffer.Contents()).To(ContainSubstring(metadata.Name)) } }) It("shows help for all installed plugin's commands", func() { confighelpers.PluginRepoDir = func() string { return filepath.Join("..", "..", "fixtures", "config", "help-plugin-test-config") }