karmada/hack/tools/genkarmadactldocs/gen_karmadactl_docs.go

148 lines
3.9 KiB
Go

package main
import (
"fmt"
"io"
"io/fs"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/spf13/cobra"
"github.com/spf13/cobra/doc"
"github.com/karmada-io/karmada/pkg/karmadactl"
"github.com/karmada-io/karmada/pkg/karmadactl/util"
"github.com/karmada-io/karmada/pkg/util/lifted"
)
// PrintCLIByTag print custom defined index
func PrintCLIByTag(cmd *cobra.Command, all []*cobra.Command, tag string) string {
var result string
var pl []string
for _, c := range all {
if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() {
continue
}
if val, ok := c.Annotations[util.TagCommandGroup]; !ok || val != tag {
continue
}
cname := cmd.Name() + " " + c.Name()
link := cname
link = strings.Replace(link, " ", "_", -1)
pl = append(pl, fmt.Sprintf("* [%s](%s)\t - %s\n", cname, link, c.Long))
}
for _, v := range pl {
result += v
}
result += "\n"
return result
}
// GenMarkdownTreeForIndex generate the index page for karmadactl
func GenMarkdownTreeForIndex(cmd *cobra.Command, dir string) error {
basename := strings.Replace(cmd.CommandPath(), " ", "_", -1) + "_index" + ".md"
filename := filepath.Join(dir, basename)
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
if _, err = io.WriteString(f, "---\ntitle: Karmadactl Commands\n---\n\n\n"); err != nil {
return err
}
for _, tp := range []string{util.GroupBasic, util.GroupClusterRegistration, util.GroupClusterManagement, util.GroupClusterTroubleshootingAndDebugging, util.GroupAdvancedCommands} {
// write header of type
_, err = io.WriteString(f, "## "+tp+"\n\n")
if err != nil {
return err
}
str := PrintCLIByTag(cmd, cmd.Commands(), tp)
// write header of type
_, err = io.WriteString(f, str)
if err != nil {
return err
}
}
_, err = io.WriteString(f, "###### Auto generated by [script in Karmada](https://github.com/karmada-io/karmada/tree/master/hack/tools/genkarmadactldocs).")
if err != nil {
return err
}
return nil
}
func main() {
// use os.Args instead of "flags" because "flags" will mess up the man pages!
path := ""
if len(os.Args) == 2 {
path = os.Args[1]
} else if len(os.Args) > 2 {
fmt.Fprintf(os.Stderr, "usage: %s [output directory]\n", os.Args[0])
os.Exit(1)
}
outDir, err := lifted.OutDir(path)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to get output directory: %v\n", err)
os.Exit(1)
}
// Set environment variables used by karmadactl so the output is consistent,
// regardless of where we run.
os.Setenv("HOME", "/home/username")
karmadactl := karmadactl.NewKarmadaCtlCommand("karmadactl", "karmadactl")
karmadactl.DisableAutoGenTag = true
err = doc.GenMarkdownTree(karmadactl, outDir)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to generate docs: %v\n", err)
os.Exit(1)
}
err = GenMarkdownTreeForIndex(karmadactl, outDir)
if err != nil {
fmt.Fprintf(os.Stderr, "failed to generate index docs: %v\n", err)
os.Exit(1)
}
err = filepath.Walk(outDir, func(path string, info fs.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
data, err := ioutil.ReadFile(path)
if err != nil {
return err
}
lines := strings.Split(string(data), "\n")
if len(lines) < 1 {
return nil
}
firstL := lines[0]
if !strings.HasPrefix(firstL, "## karmadactl") {
return nil
}
lines[len(lines)-1] = "#### Go Back to [Karmadactl Commands](karmadactl_index) Homepage.\n\n\n###### Auto generated by [spf13/cobra script in Karmada](https://github.com/karmada-io/karmada/tree/master/hack/tools/genkarmadactldocs)."
title := strings.TrimPrefix(firstL, "## ")
lines[0] = "---"
newlines := []string{"---", "title: " + title}
newlines = append(newlines, lines...)
newcontent := strings.Join(newlines, "\n")
return os.WriteFile(path, []byte(newcontent), info.Mode())
})
if err != nil {
fmt.Fprintf(os.Stderr, "failed to process docs: %v\n", err)
os.Exit(1)
}
}