summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/spf13/cobra/doc
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/spf13/cobra/doc')
-rw-r--r--vendor/github.com/spf13/cobra/doc/cmd_test.go145
-rw-r--r--vendor/github.com/spf13/cobra/doc/man_docs.go231
-rw-r--r--vendor/github.com/spf13/cobra/doc/man_docs.md26
-rw-r--r--vendor/github.com/spf13/cobra/doc/man_docs_test.go202
-rw-r--r--vendor/github.com/spf13/cobra/doc/man_examples_test.go35
-rw-r--r--vendor/github.com/spf13/cobra/doc/md_docs.go175
-rw-r--r--vendor/github.com/spf13/cobra/doc/md_docs.md103
-rw-r--r--vendor/github.com/spf13/cobra/doc/md_docs_test.go88
-rw-r--r--vendor/github.com/spf13/cobra/doc/util.go38
9 files changed, 1043 insertions, 0 deletions
diff --git a/vendor/github.com/spf13/cobra/doc/cmd_test.go b/vendor/github.com/spf13/cobra/doc/cmd_test.go
new file mode 100644
index 000000000..a4b5568fa
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/doc/cmd_test.go
@@ -0,0 +1,145 @@
+package doc
+
+import (
+ "bytes"
+ "fmt"
+ "runtime"
+ "strings"
+ "testing"
+
+ "github.com/spf13/cobra"
+)
+
+var flagb1, flagb2, flagb3, flagbr, flagbp bool
+var flags1, flags2a, flags2b, flags3 string
+var flagi1, flagi2, flagi3, flagir int
+
+const strtwoParentHelp = "help message for parent flag strtwo"
+const strtwoChildHelp = "help message for child flag strtwo"
+
+var cmdEcho = &cobra.Command{
+ Use: "echo [string to echo]",
+ Aliases: []string{"say"},
+ Short: "Echo anything to the screen",
+ Long: `an utterly useless command for testing.`,
+ Example: "Just run cobra-test echo",
+}
+
+var cmdEchoSub = &cobra.Command{
+ Use: "echosub [string to print]",
+ Short: "second sub command for echo",
+ Long: `an absolutely utterly useless command for testing gendocs!.`,
+ Run: func(cmd *cobra.Command, args []string) {},
+}
+
+var cmdDeprecated = &cobra.Command{
+ Use: "deprecated [can't do anything here]",
+ Short: "A command which is deprecated",
+ Long: `an absolutely utterly useless command for testing deprecation!.`,
+ Deprecated: "Please use echo instead",
+}
+
+var cmdTimes = &cobra.Command{
+ Use: "times [# times] [string to echo]",
+ SuggestFor: []string{"counts"},
+ Short: "Echo anything to the screen more times",
+ Long: `a slightly useless command for testing.`,
+ PersistentPreRun: func(cmd *cobra.Command, args []string) {},
+ Run: func(cmd *cobra.Command, args []string) {},
+}
+
+var cmdPrint = &cobra.Command{
+ Use: "print [string to print]",
+ Short: "Print anything to the screen",
+ Long: `an absolutely utterly useless command for testing.`,
+}
+
+var cmdRootNoRun = &cobra.Command{
+ Use: "cobra-test",
+ Short: "The root can run its own function",
+ Long: "The root description for help",
+}
+
+var cmdRootSameName = &cobra.Command{
+ Use: "print",
+ Short: "Root with the same name as a subcommand",
+ Long: "The root description for help",
+}
+
+var cmdRootWithRun = &cobra.Command{
+ Use: "cobra-test",
+ Short: "The root can run its own function",
+ Long: "The root description for help",
+}
+
+var cmdSubNoRun = &cobra.Command{
+ Use: "subnorun",
+ Short: "A subcommand without a Run function",
+ Long: "A long output about a subcommand without a Run function",
+}
+
+var cmdVersion1 = &cobra.Command{
+ Use: "version",
+ Short: "Print the version number",
+ Long: `First version of the version command`,
+}
+
+var cmdVersion2 = &cobra.Command{
+ Use: "version",
+ Short: "Print the version number",
+ Long: `Second version of the version command`,
+}
+
+func flagInit() {
+ cmdEcho.ResetFlags()
+ cmdPrint.ResetFlags()
+ cmdTimes.ResetFlags()
+ cmdRootNoRun.ResetFlags()
+ cmdRootSameName.ResetFlags()
+ cmdRootWithRun.ResetFlags()
+ cmdSubNoRun.ResetFlags()
+ cmdRootNoRun.PersistentFlags().StringVarP(&flags2a, "strtwo", "t", "two", strtwoParentHelp)
+ cmdEcho.Flags().IntVarP(&flagi1, "intone", "i", 123, "help message for flag intone")
+ cmdTimes.Flags().IntVarP(&flagi2, "inttwo", "j", 234, "help message for flag inttwo")
+ cmdPrint.Flags().IntVarP(&flagi3, "intthree", "i", 345, "help message for flag intthree")
+ cmdEcho.PersistentFlags().StringVarP(&flags1, "strone", "s", "one", "help message for flag strone")
+ cmdEcho.PersistentFlags().BoolVarP(&flagbp, "persistentbool", "p", false, "help message for flag persistentbool")
+ cmdTimes.PersistentFlags().StringVarP(&flags2b, "strtwo", "t", "2", strtwoChildHelp)
+ cmdPrint.PersistentFlags().StringVarP(&flags3, "strthree", "s", "three", "help message for flag strthree")
+ cmdEcho.Flags().BoolVarP(&flagb1, "boolone", "b", true, "help message for flag boolone")
+ cmdTimes.Flags().BoolVarP(&flagb2, "booltwo", "c", false, "help message for flag booltwo")
+ cmdPrint.Flags().BoolVarP(&flagb3, "boolthree", "b", true, "help message for flag boolthree")
+ cmdVersion1.ResetFlags()
+ cmdVersion2.ResetFlags()
+}
+
+func initializeWithRootCmd() *cobra.Command {
+ cmdRootWithRun.ResetCommands()
+ flagInit()
+ cmdRootWithRun.Flags().BoolVarP(&flagbr, "boolroot", "b", false, "help message for flag boolroot")
+ cmdRootWithRun.Flags().IntVarP(&flagir, "introot", "i", 321, "help message for flag introot")
+ return cmdRootWithRun
+}
+
+func checkStringContains(t *testing.T, found, expected string) {
+ if !strings.Contains(found, expected) {
+ logErr(t, found, expected)
+ }
+}
+
+func checkStringOmits(t *testing.T, found, expected string) {
+ if strings.Contains(found, expected) {
+ logErr(t, found, expected)
+ }
+}
+
+func logErr(t *testing.T, found, expected string) {
+ out := new(bytes.Buffer)
+
+ _, _, line, ok := runtime.Caller(2)
+ if ok {
+ fmt.Fprintf(out, "Line: %d ", line)
+ }
+ fmt.Fprintf(out, "Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found)
+ t.Errorf(out.String())
+}
diff --git a/vendor/github.com/spf13/cobra/doc/man_docs.go b/vendor/github.com/spf13/cobra/doc/man_docs.go
new file mode 100644
index 000000000..5798d0fbf
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/doc/man_docs.go
@@ -0,0 +1,231 @@
+// Copyright 2015 Red Hat Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package doc
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+ "time"
+
+ mangen "github.com/cpuguy83/go-md2man/md2man"
+ "github.com/spf13/cobra"
+ "github.com/spf13/pflag"
+)
+
+// GenManTree will generate a man page for this command and all descendants
+// in the directory given. The header may be nil. This function may not work
+// correctly if your command names have - in them. If you have `cmd` with two
+// subcmds, `sub` and `sub-third`. And `sub` has a subcommand called `third`
+// it is undefined which help output will be in the file `cmd-sub-third.1`.
+func GenManTree(cmd *cobra.Command, header *GenManHeader, dir string) error {
+ return GenManTreeFromOpts(cmd, GenManTreeOptions{
+ Header: header,
+ Path: dir,
+ CommandSeparator: "_",
+ })
+}
+
+// GenManTreeFromOpts generates a man page for the command and all descendants.
+// The pages are written to the opts.Path directory.
+func GenManTreeFromOpts(cmd *cobra.Command, opts GenManTreeOptions) error {
+ header := opts.Header
+ if header == nil {
+ header = &GenManHeader{}
+ }
+ for _, c := range cmd.Commands() {
+ if !c.IsAvailableCommand() || c.IsHelpCommand() {
+ continue
+ }
+ if err := GenManTreeFromOpts(c, opts); err != nil {
+ return err
+ }
+ }
+ section := "1"
+ if header.Section != "" {
+ section = header.Section
+ }
+
+ separator := "_"
+ if opts.CommandSeparator != "" {
+ separator = opts.CommandSeparator
+ }
+ basename := strings.Replace(cmd.CommandPath(), " ", separator, -1)
+ filename := filepath.Join(opts.Path, basename+"."+section)
+ f, err := os.Create(filename)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ headerCopy := *header
+ return GenMan(cmd, &headerCopy, f)
+}
+
+type GenManTreeOptions struct {
+ Header *GenManHeader
+ Path string
+ CommandSeparator string
+}
+
+// GenManHeader is a lot like the .TH header at the start of man pages. These
+// include the title, section, date, source, and manual. We will use the
+// current time if Date if unset and will use "Auto generated by spf13/cobra"
+// if the Source is unset.
+type GenManHeader struct {
+ Title string
+ Section string
+ Date *time.Time
+ date string
+ Source string
+ Manual string
+}
+
+// GenMan will generate a man page for the given command and write it to
+// w. The header argument may be nil, however obviously w may not.
+func GenMan(cmd *cobra.Command, header *GenManHeader, w io.Writer) error {
+ if header == nil {
+ header = &GenManHeader{}
+ }
+ fillHeader(header, cmd.CommandPath())
+
+ b := genMan(cmd, header)
+ _, err := w.Write(mangen.Render(b))
+ return err
+}
+
+func fillHeader(header *GenManHeader, name string) {
+ if header.Title == "" {
+ header.Title = strings.ToUpper(strings.Replace(name, " ", "\\-", -1))
+ }
+ if header.Section == "" {
+ header.Section = "1"
+ }
+ if header.Date == nil {
+ now := time.Now()
+ header.Date = &now
+ }
+ header.date = (*header.Date).Format("Jan 2006")
+ if header.Source == "" {
+ header.Source = "Auto generated by spf13/cobra"
+ }
+}
+
+func manPreamble(out io.Writer, header *GenManHeader, cmd *cobra.Command, dashedName string) {
+ description := cmd.Long
+ if len(description) == 0 {
+ description = cmd.Short
+ }
+
+ fmt.Fprintf(out, `%% %s(%s)%s
+%% %s
+%% %s
+# NAME
+`, header.Title, header.Section, header.date, header.Source, header.Manual)
+ fmt.Fprintf(out, "%s \\- %s\n\n", dashedName, cmd.Short)
+ fmt.Fprintf(out, "# SYNOPSIS\n")
+ fmt.Fprintf(out, "**%s**\n\n", cmd.UseLine())
+ fmt.Fprintf(out, "# DESCRIPTION\n")
+ fmt.Fprintf(out, "%s\n\n", description)
+}
+
+func manPrintFlags(out io.Writer, flags *pflag.FlagSet) {
+ flags.VisitAll(func(flag *pflag.Flag) {
+ if len(flag.Deprecated) > 0 || flag.Hidden {
+ return
+ }
+ format := ""
+ if len(flag.Shorthand) > 0 && len(flag.ShorthandDeprecated) == 0 {
+ format = fmt.Sprintf("**-%s**, **--%s**", flag.Shorthand, flag.Name)
+ } else {
+ format = fmt.Sprintf("**--%s**", flag.Name)
+ }
+ if len(flag.NoOptDefVal) > 0 {
+ format = format + "["
+ }
+ if flag.Value.Type() == "string" {
+ // put quotes on the value
+ format = format + "=%q"
+ } else {
+ format = format + "=%s"
+ }
+ if len(flag.NoOptDefVal) > 0 {
+ format = format + "]"
+ }
+ format = format + "\n\t%s\n\n"
+ fmt.Fprintf(out, format, flag.DefValue, flag.Usage)
+ })
+}
+
+func manPrintOptions(out io.Writer, command *cobra.Command) {
+ flags := command.NonInheritedFlags()
+ if flags.HasFlags() {
+ fmt.Fprintf(out, "# OPTIONS\n")
+ manPrintFlags(out, flags)
+ fmt.Fprintf(out, "\n")
+ }
+ flags = command.InheritedFlags()
+ if flags.HasFlags() {
+ fmt.Fprintf(out, "# OPTIONS INHERITED FROM PARENT COMMANDS\n")
+ manPrintFlags(out, flags)
+ fmt.Fprintf(out, "\n")
+ }
+}
+
+func genMan(cmd *cobra.Command, header *GenManHeader) []byte {
+ // something like `rootcmd-subcmd1-subcmd2`
+ dashCommandName := strings.Replace(cmd.CommandPath(), " ", "-", -1)
+
+ buf := new(bytes.Buffer)
+
+ manPreamble(buf, header, cmd, dashCommandName)
+ manPrintOptions(buf, cmd)
+ if len(cmd.Example) > 0 {
+ fmt.Fprintf(buf, "# EXAMPLE\n")
+ fmt.Fprintf(buf, "```\n%s\n```\n", cmd.Example)
+ }
+ if hasSeeAlso(cmd) {
+ fmt.Fprintf(buf, "# SEE ALSO\n")
+ seealsos := make([]string, 0)
+ if cmd.HasParent() {
+ parentPath := cmd.Parent().CommandPath()
+ dashParentPath := strings.Replace(parentPath, " ", "-", -1)
+ seealso := fmt.Sprintf("**%s(%s)**", dashParentPath, header.Section)
+ seealsos = append(seealsos, seealso)
+ cmd.VisitParents(func(c *cobra.Command) {
+ if c.DisableAutoGenTag {
+ cmd.DisableAutoGenTag = c.DisableAutoGenTag
+ }
+ })
+ }
+ children := cmd.Commands()
+ sort.Sort(byName(children))
+ for _, c := range children {
+ if !c.IsAvailableCommand() || c.IsHelpCommand() {
+ continue
+ }
+ seealso := fmt.Sprintf("**%s-%s(%s)**", dashCommandName, c.Name(), header.Section)
+ seealsos = append(seealsos, seealso)
+ }
+ fmt.Fprintf(buf, "%s\n", strings.Join(seealsos, ", "))
+ }
+ if !cmd.DisableAutoGenTag {
+ fmt.Fprintf(buf, "# HISTORY\n%s Auto generated by spf13/cobra\n", header.Date.Format("2-Jan-2006"))
+ }
+ return buf.Bytes()
+}
diff --git a/vendor/github.com/spf13/cobra/doc/man_docs.md b/vendor/github.com/spf13/cobra/doc/man_docs.md
new file mode 100644
index 000000000..d568d9a03
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/doc/man_docs.md
@@ -0,0 +1,26 @@
+# Generating Man Pages For Your Own cobra.Command
+
+Generating man pages from a cobra command is incredibly easy. An example is as follows:
+
+```go
+package main
+
+import (
+ "github.com/spf13/cobra"
+ "github.com/spf13/cobra/doc"
+)
+
+func main() {
+ cmd := &cobra.Command{
+ Use: "test",
+ Short: "my test program",
+ }
+ header := &doc.GenManHeader{
+ Title: "MINE",
+ Section: "3",
+ }
+ doc.GenManTree(cmd, header, "/tmp")
+}
+```
+
+That will get you a man page `/tmp/test.3`
diff --git a/vendor/github.com/spf13/cobra/doc/man_docs_test.go b/vendor/github.com/spf13/cobra/doc/man_docs_test.go
new file mode 100644
index 000000000..26b8fcc60
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/doc/man_docs_test.go
@@ -0,0 +1,202 @@
+package doc
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+
+ "github.com/spf13/cobra"
+)
+
+var _ = fmt.Println
+var _ = os.Stderr
+
+func translate(in string) string {
+ return strings.Replace(in, "-", "\\-", -1)
+}
+
+func TestGenManDoc(t *testing.T) {
+ c := initializeWithRootCmd()
+ // Need two commands to run the command alphabetical sort
+ cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated)
+ c.AddCommand(cmdPrint, cmdEcho)
+ cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp)
+
+ out := new(bytes.Buffer)
+
+ header := &GenManHeader{
+ Title: "Project",
+ Section: "2",
+ }
+ // We generate on a subcommand so we have both subcommands and parents
+ if err := GenMan(cmdEcho, header, out); err != nil {
+ t.Fatal(err)
+ }
+ found := out.String()
+
+ // Make sure parent has - in CommandPath() in SEE ALSO:
+ parentPath := cmdEcho.Parent().CommandPath()
+ dashParentPath := strings.Replace(parentPath, " ", "-", -1)
+ expected := translate(dashParentPath)
+ expected = expected + "(" + header.Section + ")"
+ checkStringContains(t, found, expected)
+
+ // Our description
+ expected = translate(cmdEcho.Name())
+ checkStringContains(t, found, expected)
+
+ // Better have our example
+ expected = translate(cmdEcho.Name())
+ checkStringContains(t, found, expected)
+
+ // A local flag
+ expected = "boolone"
+ checkStringContains(t, found, expected)
+
+ // persistent flag on parent
+ expected = "rootflag"
+ checkStringContains(t, found, expected)
+
+ // We better output info about our parent
+ expected = translate(cmdRootWithRun.Name())
+ checkStringContains(t, found, expected)
+
+ // And about subcommands
+ expected = translate(cmdEchoSub.Name())
+ checkStringContains(t, found, expected)
+
+ unexpected := translate(cmdDeprecated.Name())
+ checkStringOmits(t, found, unexpected)
+
+ // auto generated
+ expected = translate("Auto generated")
+ checkStringContains(t, found, expected)
+}
+
+func TestGenManNoGenTag(t *testing.T) {
+ c := initializeWithRootCmd()
+ // Need two commands to run the command alphabetical sort
+ cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated)
+ c.AddCommand(cmdPrint, cmdEcho)
+ cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp)
+ cmdEcho.DisableAutoGenTag = true
+ out := new(bytes.Buffer)
+
+ header := &GenManHeader{
+ Title: "Project",
+ Section: "2",
+ }
+ // We generate on a subcommand so we have both subcommands and parents
+ if err := GenMan(cmdEcho, header, out); err != nil {
+ t.Fatal(err)
+ }
+ found := out.String()
+
+ unexpected := translate("#HISTORY")
+ checkStringOmits(t, found, unexpected)
+}
+
+func TestGenManSeeAlso(t *testing.T) {
+ noop := func(cmd *cobra.Command, args []string) {}
+
+ top := &cobra.Command{Use: "top", Run: noop}
+ aaa := &cobra.Command{Use: "aaa", Run: noop, Hidden: true} // #229
+ bbb := &cobra.Command{Use: "bbb", Run: noop}
+ ccc := &cobra.Command{Use: "ccc", Run: noop}
+ top.AddCommand(aaa, bbb, ccc)
+
+ out := new(bytes.Buffer)
+ header := &GenManHeader{}
+ if err := GenMan(top, header, out); err != nil {
+ t.Fatal(err)
+ }
+
+ scanner := bufio.NewScanner(out)
+
+ if err := AssertLineFound(scanner, ".SH SEE ALSO"); err != nil {
+ t.Fatal(fmt.Errorf("Couldn't find SEE ALSO section header: %s", err.Error()))
+ }
+
+ if err := AssertNextLineEquals(scanner, ".PP"); err != nil {
+ t.Fatal(fmt.Errorf("First line after SEE ALSO wasn't break-indent: %s", err.Error()))
+ }
+
+ if err := AssertNextLineEquals(scanner, `\fBtop\-bbb(1)\fP, \fBtop\-ccc(1)\fP`); err != nil {
+ t.Fatal(fmt.Errorf("Second line after SEE ALSO wasn't correct: %s", err.Error()))
+ }
+}
+
+func TestManPrintFlagsHidesShortDeperecated(t *testing.T) {
+ cmd := &cobra.Command{}
+ flags := cmd.Flags()
+ flags.StringP("foo", "f", "default", "Foo flag")
+ flags.MarkShorthandDeprecated("foo", "don't use it no more")
+
+ out := new(bytes.Buffer)
+ manPrintFlags(out, flags)
+
+ expected := "**--foo**=\"default\"\n\tFoo flag\n\n"
+ if out.String() != expected {
+ t.Fatalf("Expected %s, but got %s", expected, out.String())
+ }
+}
+
+func TestGenManTree(t *testing.T) {
+ cmd := &cobra.Command{
+ Use: "do [OPTIONS] arg1 arg2",
+ }
+ header := &GenManHeader{Section: "2"}
+ tmpdir, err := ioutil.TempDir("", "test-gen-man-tree")
+ if err != nil {
+ t.Fatalf("Failed to create tempdir: %s", err.Error())
+ }
+ defer os.RemoveAll(tmpdir)
+
+ if err := GenManTree(cmd, header, tmpdir); err != nil {
+ t.Fatalf("GenManTree failed: %s", err.Error())
+ }
+
+ if _, err := os.Stat(filepath.Join(tmpdir, "do.2")); err != nil {
+ t.Fatalf("Expected file 'do.2' to exist")
+ }
+
+ if header.Title != "" {
+ t.Fatalf("Expected header.Title to be unmodified")
+ }
+}
+
+func AssertLineFound(scanner *bufio.Scanner, expectedLine string) error {
+ for scanner.Scan() {
+ line := scanner.Text()
+ if line == expectedLine {
+ return nil
+ }
+ }
+
+ if err := scanner.Err(); err != nil {
+ return fmt.Errorf("AssertLineFound: scan failed: %s", err.Error())
+ }
+
+ return fmt.Errorf("AssertLineFound: hit EOF before finding %#v", expectedLine)
+}
+
+func AssertNextLineEquals(scanner *bufio.Scanner, expectedLine string) error {
+ if scanner.Scan() {
+ line := scanner.Text()
+ if line == expectedLine {
+ return nil
+ }
+ return fmt.Errorf("AssertNextLineEquals: got %#v, not %#v", line, expectedLine)
+ }
+
+ if err := scanner.Err(); err != nil {
+ return fmt.Errorf("AssertNextLineEquals: scan failed: %s", err.Error())
+ }
+
+ return fmt.Errorf("AssertNextLineEquals: hit EOF before finding %#v", expectedLine)
+}
diff --git a/vendor/github.com/spf13/cobra/doc/man_examples_test.go b/vendor/github.com/spf13/cobra/doc/man_examples_test.go
new file mode 100644
index 000000000..3593853b0
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/doc/man_examples_test.go
@@ -0,0 +1,35 @@
+package doc_test
+
+import (
+ "bytes"
+ "fmt"
+
+ "github.com/spf13/cobra"
+ "github.com/spf13/cobra/doc"
+)
+
+func ExampleCommand_GenManTree() {
+ cmd := &cobra.Command{
+ Use: "test",
+ Short: "my test program",
+ }
+ header := &doc.GenManHeader{
+ Title: "MINE",
+ Section: "3",
+ }
+ doc.GenManTree(cmd, header, "/tmp")
+}
+
+func ExampleCommand_GenMan() {
+ cmd := &cobra.Command{
+ Use: "test",
+ Short: "my test program",
+ }
+ header := &doc.GenManHeader{
+ Title: "MINE",
+ Section: "3",
+ }
+ out := new(bytes.Buffer)
+ doc.GenMan(cmd, header, out)
+ fmt.Print(out.String())
+}
diff --git a/vendor/github.com/spf13/cobra/doc/md_docs.go b/vendor/github.com/spf13/cobra/doc/md_docs.go
new file mode 100644
index 000000000..fa1363180
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/doc/md_docs.go
@@ -0,0 +1,175 @@
+//Copyright 2015 Red Hat Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package doc
+
+import (
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+ "time"
+
+ "github.com/spf13/cobra"
+)
+
+func printOptions(w io.Writer, cmd *cobra.Command, name string) error {
+ flags := cmd.NonInheritedFlags()
+ flags.SetOutput(w)
+ if flags.HasFlags() {
+ if _, err := fmt.Fprintf(w, "### Options\n\n```\n"); err != nil {
+ return err
+ }
+ flags.PrintDefaults()
+ if _, err := fmt.Fprintf(w, "```\n\n"); err != nil {
+ return err
+ }
+ }
+
+ parentFlags := cmd.InheritedFlags()
+ parentFlags.SetOutput(w)
+ if parentFlags.HasFlags() {
+ if _, err := fmt.Fprintf(w, "### Options inherited from parent commands\n\n```\n"); err != nil {
+ return err
+ }
+ parentFlags.PrintDefaults()
+ if _, err := fmt.Fprintf(w, "```\n\n"); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func GenMarkdown(cmd *cobra.Command, w io.Writer) error {
+ return GenMarkdownCustom(cmd, w, func(s string) string { return s })
+}
+
+func GenMarkdownCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) string) error {
+ name := cmd.CommandPath()
+
+ short := cmd.Short
+ long := cmd.Long
+ if len(long) == 0 {
+ long = short
+ }
+
+ if _, err := fmt.Fprintf(w, "## %s\n\n", name); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprintf(w, "%s\n\n", short); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprintf(w, "### Synopsis\n\n"); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprintf(w, "\n%s\n\n", long); err != nil {
+ return err
+ }
+
+ if cmd.Runnable() {
+ if _, err := fmt.Fprintf(w, "```\n%s\n```\n\n", cmd.UseLine()); err != nil {
+ return err
+ }
+ }
+
+ if len(cmd.Example) > 0 {
+ if _, err := fmt.Fprintf(w, "### Examples\n\n"); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprintf(w, "```\n%s\n```\n\n", cmd.Example); err != nil {
+ return err
+ }
+ }
+
+ if err := printOptions(w, cmd, name); err != nil {
+ return err
+ }
+ if hasSeeAlso(cmd) {
+ if _, err := fmt.Fprintf(w, "### SEE ALSO\n"); err != nil {
+ return err
+ }
+ if cmd.HasParent() {
+ parent := cmd.Parent()
+ pname := parent.CommandPath()
+ link := pname + ".md"
+ link = strings.Replace(link, " ", "_", -1)
+ if _, err := fmt.Fprintf(w, "* [%s](%s)\t - %s\n", pname, linkHandler(link), parent.Short); err != nil {
+ return err
+ }
+ cmd.VisitParents(func(c *cobra.Command) {
+ if c.DisableAutoGenTag {
+ cmd.DisableAutoGenTag = c.DisableAutoGenTag
+ }
+ })
+ }
+
+ children := cmd.Commands()
+ sort.Sort(byName(children))
+
+ for _, child := range children {
+ if !child.IsAvailableCommand() || child.IsHelpCommand() {
+ continue
+ }
+ cname := name + " " + child.Name()
+ link := cname + ".md"
+ link = strings.Replace(link, " ", "_", -1)
+ if _, err := fmt.Fprintf(w, "* [%s](%s)\t - %s\n", cname, linkHandler(link), child.Short); err != nil {
+ return err
+ }
+ }
+ if _, err := fmt.Fprintf(w, "\n"); err != nil {
+ return err
+ }
+ }
+ if !cmd.DisableAutoGenTag {
+ if _, err := fmt.Fprintf(w, "###### Auto generated by spf13/cobra on %s\n", time.Now().Format("2-Jan-2006")); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func GenMarkdownTree(cmd *cobra.Command, dir string) error {
+ identity := func(s string) string { return s }
+ emptyStr := func(s string) string { return "" }
+ return GenMarkdownTreeCustom(cmd, dir, emptyStr, identity)
+}
+
+func GenMarkdownTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error {
+ for _, c := range cmd.Commands() {
+ if !c.IsAvailableCommand() || c.IsHelpCommand() {
+ continue
+ }
+ if err := GenMarkdownTreeCustom(c, dir, filePrepender, linkHandler); err != nil {
+ return err
+ }
+ }
+
+ basename := strings.Replace(cmd.CommandPath(), " ", "_", -1) + ".md"
+ filename := filepath.Join(dir, basename)
+ f, err := os.Create(filename)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ if _, err := io.WriteString(f, filePrepender(filename)); err != nil {
+ return err
+ }
+ if err := GenMarkdownCustom(cmd, f, linkHandler); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/vendor/github.com/spf13/cobra/doc/md_docs.md b/vendor/github.com/spf13/cobra/doc/md_docs.md
new file mode 100644
index 000000000..480b152f0
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/doc/md_docs.md
@@ -0,0 +1,103 @@
+# Generating Markdown Docs For Your Own cobra.Command
+
+Generating man pages from a cobra command is incredibly easy. An example is as follows:
+
+```go
+package main
+
+import (
+ "github.com/spf13/cobra"
+ "github.com/spf13/cobra/doc"
+)
+
+func main() {
+ cmd := &cobra.Command{
+ Use: "test",
+ Short: "my test program",
+ }
+ doc.GenMarkdownTree(cmd, "/tmp")
+}
+```
+
+That will get you a Markdown document `/tmp/test.md`
+
+## Generate markdown docs for the entire command tree
+
+This program can actually generate docs for the kubectl command in the kubernetes project
+
+```go
+package main
+
+import (
+ "io/ioutil"
+ "os"
+
+ kubectlcmd "k8s.io/kubernetes/pkg/kubectl/cmd"
+ cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
+
+ "github.com/spf13/cobra/doc"
+)
+
+func main() {
+ cmd := kubectlcmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard)
+ doc.GenMarkdownTree(cmd, "./")
+}
+```
+
+This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./")
+
+## Generate markdown docs for a single command
+
+You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenMarkdown` instead of `GenMarkdownTree`
+
+```go
+ out := new(bytes.Buffer)
+ doc.GenMarkdown(cmd, out)
+```
+
+This will write the markdown doc for ONLY "cmd" into the out, buffer.
+
+## Customize the output
+
+Both `GenMarkdown` and `GenMarkdownTree` have alternate versions with callbacks to get some control of the output:
+
+```go
+func GenMarkdownTreeCustom(cmd *Command, dir string, filePrepender, linkHandler func(string) string) error {
+ //...
+}
+```
+
+```go
+func GenMarkdownCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string) string) error {
+ //...
+}
+```
+
+The `filePrepender` will prepend the return value given the full filepath to the rendered Markdown file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/):
+
+```go
+const fmTemplate = `---
+date: %s
+title: "%s"
+slug: %s
+url: %s
+---
+`
+
+filePrepender := func(filename string) string {
+ now := time.Now().Format(time.RFC3339)
+ name := filepath.Base(filename)
+ base := strings.TrimSuffix(name, path.Ext(name))
+ url := "/commands/" + strings.ToLower(base) + "/"
+ return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url)
+}
+```
+
+The `linkHandler` can be used to customize the rendered internal links to the commands, given a filename:
+
+```go
+linkHandler := func(name string) string {
+ base := strings.TrimSuffix(name, path.Ext(name))
+ return "/commands/" + strings.ToLower(base) + "/"
+}
+```
diff --git a/vendor/github.com/spf13/cobra/doc/md_docs_test.go b/vendor/github.com/spf13/cobra/doc/md_docs_test.go
new file mode 100644
index 000000000..86ee02930
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/doc/md_docs_test.go
@@ -0,0 +1,88 @@
+package doc
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "strings"
+ "testing"
+)
+
+var _ = fmt.Println
+var _ = os.Stderr
+
+func TestGenMdDoc(t *testing.T) {
+ c := initializeWithRootCmd()
+ // Need two commands to run the command alphabetical sort
+ cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated)
+ c.AddCommand(cmdPrint, cmdEcho)
+ cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp)
+
+ out := new(bytes.Buffer)
+
+ // We generate on s subcommand so we have both subcommands and parents
+ if err := GenMarkdown(cmdEcho, out); err != nil {
+ t.Fatal(err)
+ }
+ found := out.String()
+
+ // Our description
+ expected := cmdEcho.Long
+ if !strings.Contains(found, expected) {
+ t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found)
+ }
+
+ // Better have our example
+ expected = cmdEcho.Example
+ if !strings.Contains(found, expected) {
+ t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found)
+ }
+
+ // A local flag
+ expected = "boolone"
+ if !strings.Contains(found, expected) {
+ t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found)
+ }
+
+ // persistent flag on parent
+ expected = "rootflag"
+ if !strings.Contains(found, expected) {
+ t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found)
+ }
+
+ // We better output info about our parent
+ expected = cmdRootWithRun.Short
+ if !strings.Contains(found, expected) {
+ t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found)
+ }
+
+ // And about subcommands
+ expected = cmdEchoSub.Short
+ if !strings.Contains(found, expected) {
+ t.Errorf("Unexpected response.\nExpecting to contain: \n %q\nGot:\n %q\n", expected, found)
+ }
+
+ unexpected := cmdDeprecated.Short
+ if strings.Contains(found, unexpected) {
+ t.Errorf("Unexpected response.\nFound: %v\nBut should not have!!\n", unexpected)
+ }
+}
+
+func TestGenMdNoTag(t *testing.T) {
+ c := initializeWithRootCmd()
+ // Need two commands to run the command alphabetical sort
+ cmdEcho.AddCommand(cmdTimes, cmdEchoSub, cmdDeprecated)
+ c.AddCommand(cmdPrint, cmdEcho)
+ c.DisableAutoGenTag = true
+ cmdRootWithRun.PersistentFlags().StringVarP(&flags2a, "rootflag", "r", "two", strtwoParentHelp)
+ out := new(bytes.Buffer)
+
+ if err := GenMarkdown(c, out); err != nil {
+ t.Fatal(err)
+ }
+ found := out.String()
+
+ unexpected := "Auto generated"
+ checkStringOmits(t, found, unexpected)
+
+}
diff --git a/vendor/github.com/spf13/cobra/doc/util.go b/vendor/github.com/spf13/cobra/doc/util.go
new file mode 100644
index 000000000..a1c6b89ba
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/doc/util.go
@@ -0,0 +1,38 @@
+// Copyright 2015 Red Hat Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package doc
+
+import "github.com/spf13/cobra"
+
+// Test to see if we have a reason to print See Also information in docs
+// Basically this is a test for a parent commend or a subcommand which is
+// both not deprecated and not the autogenerated help command.
+func hasSeeAlso(cmd *cobra.Command) bool {
+ if cmd.HasParent() {
+ return true
+ }
+ for _, c := range cmd.Commands() {
+ if !c.IsAvailableCommand() || c.IsHelpCommand() {
+ continue
+ }
+ return true
+ }
+ return false
+}
+
+type byName []*cobra.Command
+
+func (s byName) Len() int { return len(s) }
+func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
+func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() }