|  | package main | 
|  |  | 
|  | import ( | 
|  | "bufio" | 
|  | "bytes" | 
|  | "fmt" | 
|  | "io" | 
|  | "os" | 
|  | "strings" | 
|  | "text/template" | 
|  | "unicode" | 
|  | "unicode/utf8" | 
|  | ) | 
|  |  | 
|  | var helpTemplate = `usage: gvt {{.UsageLine}} | 
|  |  | 
|  | {{.Long | trim}} | 
|  | ` | 
|  |  | 
|  | // help implements the 'help' command. | 
|  | func help(args []string) { | 
|  | if len(args) == 0 { | 
|  | printUsage(os.Stdout) | 
|  | return | 
|  | } | 
|  | if len(args) != 1 { | 
|  | fmt.Fprintf(os.Stderr, "usage: gvt help command\n\nToo many arguments given.\n") | 
|  | os.Exit(2) | 
|  | } | 
|  |  | 
|  | arg := args[0] | 
|  |  | 
|  | // 'gvt help documentation' generates alldocs.go. | 
|  | if arg == "documentation" { | 
|  | var u bytes.Buffer | 
|  | printUsage(&u) | 
|  | f, _ := os.Create("alldocs.go") | 
|  | tmpl(f, documentationTemplate, struct { | 
|  | Usage    string | 
|  | Commands []*Command | 
|  | }{ | 
|  | u.String(), | 
|  | commands, | 
|  | }) | 
|  | f.Close() | 
|  | return | 
|  | } | 
|  |  | 
|  | for _, cmd := range commands { | 
|  | if cmd.Name == arg { | 
|  | tmpl(os.Stdout, helpTemplate, cmd) | 
|  | return | 
|  | } | 
|  | } | 
|  |  | 
|  | fmt.Fprintf(os.Stderr, "Unknown help topic %#q. Run 'gvt help'.\n", arg) | 
|  | os.Exit(2) | 
|  | } | 
|  |  | 
|  | var usageTemplate = `gvt, a simple go vendoring tool based on gb-vendor. | 
|  |  | 
|  | Usage: | 
|  | gvt command [arguments] | 
|  |  | 
|  | The commands are: | 
|  | {{range .}} | 
|  | {{.Name | printf "%-11s"}} {{.Short}}{{end}} | 
|  |  | 
|  | Use "gvt help [command]" for more information about a command. | 
|  | ` | 
|  |  | 
|  | var documentationTemplate = `// DO NOT EDIT THIS FILE. | 
|  | //go:generate gvt help documentation | 
|  |  | 
|  | /* | 
|  | {{ .Usage }} | 
|  |  | 
|  | {{range .Commands}}{{if .Short}}{{.Short | capitalize}} | 
|  | {{end}} | 
|  | Usage: | 
|  | gvt {{.UsageLine}} | 
|  |  | 
|  | {{.Long | trim}} | 
|  |  | 
|  | {{end}}*/ | 
|  | package main | 
|  | ` | 
|  |  | 
|  | // tmpl executes the given template text on data, writing the result to w. | 
|  | func tmpl(w io.Writer, text string, data interface{}) { | 
|  | t := template.New("top") | 
|  | t.Funcs(template.FuncMap{"trim": strings.TrimSpace, "capitalize": capitalize}) | 
|  | template.Must(t.Parse(text)) | 
|  | if err := t.Execute(w, data); err != nil { | 
|  | panic(err) | 
|  | } | 
|  | } | 
|  |  | 
|  | func capitalize(s string) string { | 
|  | if s == "" { | 
|  | return s | 
|  | } | 
|  | r, n := utf8.DecodeRuneInString(s) | 
|  | return string(unicode.ToTitle(r)) + s[n:] | 
|  | } | 
|  |  | 
|  | func printUsage(w io.Writer) { | 
|  | bw := bufio.NewWriter(w) | 
|  | tmpl(bw, usageTemplate, commands) | 
|  | bw.Flush() | 
|  | } |