
This removes indirect dependencies from go.mod, and includes the fix for the missing -help flag info. The latest cobra release is v1.2.1. Given that there were minor security-related dependency cleanup during v1.2 release, I was tempted to pick up the latest version, but that caused dependency updates in golang.org/x/sys and golang.org/x/tools which may be too recent (golang.org/x/* follow the go's release support policy, so recent versions may not be compatible with go versions beyond go's official version support policy). Verified that dlv still builds with go1.12.x. (go1.12 is the oldest version of go that can build the latest delve already). $ go get -d github.com/spf13/cobra@v1.1.3 $ go mod tidy $ go mod vendor $ go run _scripts/gen-usage-docs.go
156 lines
4.5 KiB
Go
156 lines
4.5 KiB
Go
//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"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func printOptions(buf *bytes.Buffer, cmd *cobra.Command, name string) error {
|
|
flags := cmd.NonInheritedFlags()
|
|
flags.SetOutput(buf)
|
|
if flags.HasAvailableFlags() {
|
|
buf.WriteString("### Options\n\n```\n")
|
|
flags.PrintDefaults()
|
|
buf.WriteString("```\n\n")
|
|
}
|
|
|
|
parentFlags := cmd.InheritedFlags()
|
|
parentFlags.SetOutput(buf)
|
|
if parentFlags.HasAvailableFlags() {
|
|
buf.WriteString("### Options inherited from parent commands\n\n```\n")
|
|
parentFlags.PrintDefaults()
|
|
buf.WriteString("```\n\n")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GenMarkdown creates markdown output.
|
|
func GenMarkdown(cmd *cobra.Command, w io.Writer) error {
|
|
return GenMarkdownCustom(cmd, w, func(s string) string { return s })
|
|
}
|
|
|
|
// GenMarkdownCustom creates custom markdown output.
|
|
func GenMarkdownCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) string) error {
|
|
cmd.InitDefaultHelpCmd()
|
|
cmd.InitDefaultHelpFlag()
|
|
|
|
buf := new(bytes.Buffer)
|
|
name := cmd.CommandPath()
|
|
|
|
buf.WriteString("## " + name + "\n\n")
|
|
buf.WriteString(cmd.Short + "\n\n")
|
|
if len(cmd.Long) > 0 {
|
|
buf.WriteString("### Synopsis\n\n")
|
|
buf.WriteString(cmd.Long + "\n\n")
|
|
}
|
|
|
|
if cmd.Runnable() {
|
|
buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.UseLine()))
|
|
}
|
|
|
|
if len(cmd.Example) > 0 {
|
|
buf.WriteString("### Examples\n\n")
|
|
buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.Example))
|
|
}
|
|
|
|
if err := printOptions(buf, cmd, name); err != nil {
|
|
return err
|
|
}
|
|
if hasSeeAlso(cmd) {
|
|
buf.WriteString("### SEE ALSO\n\n")
|
|
if cmd.HasParent() {
|
|
parent := cmd.Parent()
|
|
pname := parent.CommandPath()
|
|
link := pname + ".md"
|
|
link = strings.Replace(link, " ", "_", -1)
|
|
buf.WriteString(fmt.Sprintf("* [%s](%s)\t - %s\n", pname, linkHandler(link), parent.Short))
|
|
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.IsAdditionalHelpTopicCommand() {
|
|
continue
|
|
}
|
|
cname := name + " " + child.Name()
|
|
link := cname + ".md"
|
|
link = strings.Replace(link, " ", "_", -1)
|
|
buf.WriteString(fmt.Sprintf("* [%s](%s)\t - %s\n", cname, linkHandler(link), child.Short))
|
|
}
|
|
buf.WriteString("\n")
|
|
}
|
|
if !cmd.DisableAutoGenTag {
|
|
buf.WriteString("###### Auto generated by spf13/cobra on " + time.Now().Format("2-Jan-2006") + "\n")
|
|
}
|
|
_, err := buf.WriteTo(w)
|
|
return err
|
|
}
|
|
|
|
// GenMarkdownTree will generate a markdown 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 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)
|
|
}
|
|
|
|
// GenMarkdownTreeCustom is the the same as GenMarkdownTree, but
|
|
// with custom filePrepender and linkHandler.
|
|
func GenMarkdownTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error {
|
|
for _, c := range cmd.Commands() {
|
|
if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() {
|
|
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
|
|
}
|