e842547421
But update signature to take a writer. This is a backwards incompatible change for those overriding the HelpPrinter, but the hope is that this feature is largely unused and the usage is easily updated.
236 lines
5.0 KiB
Go
236 lines
5.0 KiB
Go
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
"text/tabwriter"
|
|
"text/template"
|
|
)
|
|
|
|
// The text template for the Default help topic.
|
|
// cli.go uses text/template to render templates. You can
|
|
// render custom help text by setting this variable.
|
|
var AppHelpTemplate = `NAME:
|
|
{{.Name}} - {{.Usage}}
|
|
|
|
USAGE:
|
|
{{.Name}} {{if .Flags}}[global options] {{end}}command{{if .Flags}} [command options]{{end}} [arguments...]
|
|
|
|
VERSION:
|
|
{{.Version}}
|
|
|
|
AUTHOR(S):
|
|
{{range .Authors}}{{ . }}
|
|
{{end}}
|
|
COMMANDS:
|
|
{{range .Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
|
|
{{end}}{{if .Flags}}
|
|
GLOBAL OPTIONS:
|
|
{{range .Flags}}{{.}}
|
|
{{end}}{{end}}
|
|
`
|
|
|
|
// The text template for the command help topic.
|
|
// cli.go uses text/template to render templates. You can
|
|
// render custom help text by setting this variable.
|
|
var CommandHelpTemplate = `NAME:
|
|
{{.Name}} - {{.Usage}}
|
|
|
|
USAGE:
|
|
command {{.Name}}{{if .Flags}} [command options]{{end}} [arguments...]{{if .Description}}
|
|
|
|
DESCRIPTION:
|
|
{{.Description}}{{end}}{{if .Flags}}
|
|
|
|
OPTIONS:
|
|
{{range .Flags}}{{.}}
|
|
{{end}}{{ end }}
|
|
`
|
|
|
|
// The text template for the subcommand help topic.
|
|
// cli.go uses text/template to render templates. You can
|
|
// render custom help text by setting this variable.
|
|
var SubcommandHelpTemplate = `NAME:
|
|
{{.Name}} - {{.Usage}}
|
|
|
|
USAGE:
|
|
{{.Name}} command{{if .Flags}} [command options]{{end}} [arguments...]
|
|
|
|
COMMANDS:
|
|
{{range .Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
|
|
{{end}}{{if .Flags}}
|
|
OPTIONS:
|
|
{{range .Flags}}{{.}}
|
|
{{end}}{{end}}
|
|
`
|
|
|
|
var helpCommand = Command{
|
|
Name: "help",
|
|
Aliases: []string{"h"},
|
|
Usage: "Shows a list of commands or help for one command",
|
|
Action: func(c *Context) {
|
|
args := c.Args()
|
|
if args.Present() {
|
|
ShowCommandHelp(c, args.First())
|
|
} else {
|
|
ShowAppHelp(c)
|
|
}
|
|
},
|
|
}
|
|
|
|
var helpSubcommand = Command{
|
|
Name: "help",
|
|
Aliases: []string{"h"},
|
|
Usage: "Shows a list of commands or help for one command",
|
|
Action: func(c *Context) {
|
|
args := c.Args()
|
|
if args.Present() {
|
|
ShowCommandHelp(c, args.First())
|
|
} else {
|
|
ShowSubcommandHelp(c)
|
|
}
|
|
},
|
|
}
|
|
|
|
// Prints help for the App or Command
|
|
type helpPrinter func(w io.Writer, templ string, data interface{})
|
|
|
|
var HelpPrinter helpPrinter = printHelp
|
|
|
|
// Prints version for the App
|
|
var VersionPrinter = printVersion
|
|
|
|
func ShowAppHelp(c *Context) {
|
|
HelpPrinter(c.App.Writer, AppHelpTemplate, c.App)
|
|
}
|
|
|
|
// Prints the list of subcommands as the default app completion method
|
|
func DefaultAppComplete(c *Context) {
|
|
for _, command := range c.App.Commands {
|
|
for _, name := range command.Names() {
|
|
fmt.Fprintln(c.App.Writer, name)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Prints help for the given command
|
|
func ShowCommandHelp(ctx *Context, command string) {
|
|
// show the subcommand help for a command with subcommands
|
|
if command == "" {
|
|
HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App)
|
|
return
|
|
}
|
|
|
|
for _, c := range ctx.App.Commands {
|
|
if c.HasName(command) {
|
|
HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c)
|
|
return
|
|
}
|
|
}
|
|
|
|
if ctx.App.CommandNotFound != nil {
|
|
ctx.App.CommandNotFound(ctx, command)
|
|
} else {
|
|
fmt.Fprintf(ctx.App.Writer, "No help topic for '%v'\n", command)
|
|
}
|
|
}
|
|
|
|
// Prints help for the given subcommand
|
|
func ShowSubcommandHelp(c *Context) {
|
|
ShowCommandHelp(c, c.Command.Name)
|
|
}
|
|
|
|
// Prints the version number of the App
|
|
func ShowVersion(c *Context) {
|
|
VersionPrinter(c)
|
|
}
|
|
|
|
func printVersion(c *Context) {
|
|
fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version)
|
|
}
|
|
|
|
// Prints the lists of commands within a given context
|
|
func ShowCompletions(c *Context) {
|
|
a := c.App
|
|
if a != nil && a.BashComplete != nil {
|
|
a.BashComplete(c)
|
|
}
|
|
}
|
|
|
|
// Prints the custom completions for a given command
|
|
func ShowCommandCompletions(ctx *Context, command string) {
|
|
c := ctx.App.Command(command)
|
|
if c != nil && c.BashComplete != nil {
|
|
c.BashComplete(ctx)
|
|
}
|
|
}
|
|
|
|
func printHelp(out io.Writer, templ string, data interface{}) {
|
|
funcMap := template.FuncMap{
|
|
"join": strings.Join,
|
|
}
|
|
|
|
w := tabwriter.NewWriter(out, 0, 8, 1, '\t', 0)
|
|
t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
|
|
err := t.Execute(w, data)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
w.Flush()
|
|
}
|
|
|
|
func checkVersion(c *Context) bool {
|
|
if c.GlobalBool("version") {
|
|
ShowVersion(c)
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func checkHelp(c *Context) bool {
|
|
if c.GlobalBool("h") || c.GlobalBool("help") {
|
|
ShowAppHelp(c)
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func checkCommandHelp(c *Context, name string) bool {
|
|
if c.Bool("h") || c.Bool("help") {
|
|
ShowCommandHelp(c, name)
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func checkSubcommandHelp(c *Context) bool {
|
|
if c.GlobalBool("h") || c.GlobalBool("help") {
|
|
ShowSubcommandHelp(c)
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func checkCompletions(c *Context) bool {
|
|
if (c.GlobalBool(BashCompletionFlag.Name) || c.Bool(BashCompletionFlag.Name)) && c.App.EnableBashCompletion {
|
|
ShowCompletions(c)
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func checkCommandCompletions(c *Context, name string) bool {
|
|
if c.Bool(BashCompletionFlag.Name) && c.App.EnableBashCompletion {
|
|
ShowCommandCompletions(c, name)
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|