| 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() | 
 | } |