mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 16:01:32 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			272 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			272 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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 .Description}}
 | |
| 
 | |
| DESCRIPTION:
 | |
|    {{.Description}}{{end}}{{if len .Authors}}
 | |
| 
 | |
| AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
 | |
|    {{range $index, $author := .Authors}}{{if $index}}
 | |
|    {{end}}{{$author}}{{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 $index, $option := .VisibleFlags}}{{if $index}}
 | |
|    {{end}}{{$option}}{{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.Bool("h") || c.Bool("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
 | |
| }
 |