aboutsummaryrefslogblamecommitdiffstats
path: root/vendor/gopkg.in/urfave/cli.v1/help.go
blob: 0f4cf14cd86898b549cccde34a0f0d9112ffc134 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

           


             
            



                        
 
                                                                   





                                                         

                                                                                                                                                                                                                        
        
               
                                    
          



                                                 
                                                  
                                  
               

                                  


                 

 
                                                                       


                                                         
                             

      



                                                                                                                                          

            
                                              

        

                               

 
                                                                             


                                                         
                             

      
                                                                                                                                  
 

                                                 
                                                  
                           
        
                               



                          



                                                                      
                                        

                                   
                                                               
                 


                              



                             



                                                                      
                                        

                                   
                                                               
                 

                                            


          

                                                                  
 


                                                                              
                                       
 
                                                

                                 
                                                   
                                    
                                                         
                  

 
                                                                                         

                                                


                                   

                                                        



                 

                                                          

                                                                  
                                                                            
                          

         
                                            
                                       
                                                                           
                                  


                 

                                                                                      
         


                                             

 


                                                          

 
                                                   







                                                                               
                                                                      






                                              
                                                                           






                                                           


                                                               

         
                                                      


                                                                            
                                                                                    



                                                                                
                      

                 

 







                                                               
         

                    
 









                                                               




































                                                                                                                     
package cli

import (
    "fmt"
    "io"
    "os"
    "strings"
    "text/tabwriter"
    "text/template"
)

// AppHelpTemplate is 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:
   {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}
   {{if .Version}}{{if not .HideVersion}}
VERSION:
   {{.Version}}
   {{end}}{{end}}{{if len .Authors}}
AUTHOR(S):
   {{range .Authors}}{{.}}{{end}}
   {{end}}{{if .VisibleCommands}}
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
   {{.Name}}:{{end}}{{range .VisibleCommands}}
     {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}
{{end}}{{end}}{{if .VisibleFlags}}
GLOBAL OPTIONS:
   {{range .VisibleFlags}}{{.}}
   {{end}}{{end}}{{if .Copyright}}
COPYRIGHT:
   {{.Copyright}}
   {{end}}
`

// CommandHelpTemplate is 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:
   {{.HelpName}} - {{.Usage}}

USAGE:
   {{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Category}}

CATEGORY:
   {{.Category}}{{end}}{{if .Description}}

DESCRIPTION:
   {{.Description}}{{end}}{{if .VisibleFlags}}

OPTIONS:
   {{range .VisibleFlags}}{{.}}
   {{end}}{{end}}
`

// SubcommandHelpTemplate is 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:
   {{.HelpName}} - {{.Usage}}

USAGE:
   {{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}

COMMANDS:{{range .VisibleCategories}}{{if .Name}}
   {{.Name}}:{{end}}{{range .VisibleCommands}}
     {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}
{{end}}{{if .VisibleFlags}}
OPTIONS:
   {{range .VisibleFlags}}{{.}}
   {{end}}{{end}}
`

var helpCommand = Command{
    Name:      "help",
    Aliases:   []string{"h"},
    Usage:     "Shows a list of commands or help for one command",
    ArgsUsage: "[command]",
    Action: func(c *Context) error {
        args := c.Args()
        if args.Present() {
            return ShowCommandHelp(c, args.First())
        }

        ShowAppHelp(c)
        return nil
    },
}

var helpSubcommand = Command{
    Name:      "help",
    Aliases:   []string{"h"},
    Usage:     "Shows a list of commands or help for one command",
    ArgsUsage: "[command]",
    Action: func(c *Context) error {
        args := c.Args()
        if args.Present() {
            return ShowCommandHelp(c, args.First())
        }

        return ShowSubcommandHelp(c)
    },
}

// Prints help for the App or Command
type helpPrinter func(w io.Writer, templ string, data interface{})

// HelpPrinter is a function that writes the help output. If not set a default
// is used. The function signature is:
// func(w io.Writer, templ string, data interface{})
var HelpPrinter helpPrinter = printHelp

// VersionPrinter prints the version for the App
var VersionPrinter = printVersion

// ShowAppHelp is an action that displays the help.
func ShowAppHelp(c *Context) error {
    HelpPrinter(c.App.Writer, AppHelpTemplate, c.App)
    return nil
}

// DefaultAppComplete prints the list of subcommands as the default app completion method
func DefaultAppComplete(c *Context) {
    for _, command := range c.App.Commands {
        if command.Hidden {
            continue
        }
        for _, name := range command.Names() {
            fmt.Fprintln(c.App.Writer, name)
        }
    }
}

// ShowCommandHelp prints help for the given command
func ShowCommandHelp(ctx *Context, command string) error {
    // show the subcommand help for a command with subcommands
    if command == "" {
        HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App)
        return nil
    }

    for _, c := range ctx.App.Commands {
        if c.HasName(command) {
            HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c)
            return nil
        }
    }

    if ctx.App.CommandNotFound == nil {
        return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3)
    }

    ctx.App.CommandNotFound(ctx, command)
    return nil
}

// ShowSubcommandHelp prints help for the given subcommand
func ShowSubcommandHelp(c *Context) error {
    return ShowCommandHelp(c, c.Command.Name)
}

// ShowVersion 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)
}

// ShowCompletions 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)
    }
}

// ShowCommandCompletions 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, 1, 8, 2, ' ', 0)
    t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
    err := t.Execute(w, data)
    if err != nil {
        // If the writer is closed, t.Execute will fail, and there's nothing
        // we can do to recover.
        if os.Getenv("CLI_TEMPLATE_ERROR_DEBUG") != "" {
            fmt.Fprintf(ErrWriter, "CLI TEMPLATE ERROR: %#v\n", err)
        }
        return
    }
    w.Flush()
}

func checkVersion(c *Context) bool {
    found := false
    if VersionFlag.Name != "" {
        eachName(VersionFlag.Name, func(name string) {
            if c.GlobalBool(name) || c.Bool(name) {
                found = true
            }
        })
    }
    return found
}

func checkHelp(c *Context) bool {
    found := false
    if HelpFlag.Name != "" {
        eachName(HelpFlag.Name, func(name string) {
            if c.GlobalBool(name) || c.Bool(name) {
                found = true
            }
        })
    }
    return found
}

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
}