mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-16 14:45:28 +00:00
Merge branch 'kubectl-man' of https://github.com/eparis/kubernetes into eparis-kubectl-man
Conflicts: docs/kubectl.md COMMIT_BLOCKED_ON_GENDOCS
This commit is contained in:
@@ -17,42 +17,156 @@ limitations under the License.
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
)
|
||||
|
||||
func mergeFlags(old, newFlags *pflag.FlagSet) *pflag.FlagSet {
|
||||
newFlags.VisitAll(func(f *pflag.Flag) {
|
||||
if old.Lookup(f.Name) == nil {
|
||||
old.AddFlag(f)
|
||||
}
|
||||
})
|
||||
return old
|
||||
}
|
||||
|
||||
func parentFlags(c *cobra.Command) *pflag.FlagSet {
|
||||
if !c.HasParent() {
|
||||
return pflag.NewFlagSet("empty", pflag.ExitOnError)
|
||||
}
|
||||
return mergeFlags(c.Parent().PersistentFlags(), parentFlags(c.Parent()))
|
||||
}
|
||||
|
||||
func myFlags(c *cobra.Command) *pflag.FlagSet {
|
||||
myFlags := c.Flags()
|
||||
parentFlags := parentFlags(c)
|
||||
|
||||
if c.HasPersistentFlags() {
|
||||
c.PersistentFlags().VisitAll(func(f *pflag.Flag) {
|
||||
if c.Flags().Lookup(f.Name) == nil &&
|
||||
parentFlags.Lookup(f.Name) == nil {
|
||||
myFlags.AddFlag(f)
|
||||
}
|
||||
})
|
||||
}
|
||||
return myFlags
|
||||
}
|
||||
|
||||
func printOptions(out *bytes.Buffer, command *cobra.Command, name string) {
|
||||
flags := myFlags(command)
|
||||
flags.SetOutput(out)
|
||||
if command.Runnable() {
|
||||
fmt.Fprintf(out, "%s\n\n", command.UseLine())
|
||||
}
|
||||
if flags.HasFlags() {
|
||||
fmt.Fprintf(out, "### Options\n\n```\n")
|
||||
flags.PrintDefaults()
|
||||
fmt.Fprintf(out, "```\n\n")
|
||||
}
|
||||
|
||||
parentFlags := parentFlags(command)
|
||||
parentFlags.SetOutput(out)
|
||||
if parentFlags.HasFlags() {
|
||||
fmt.Fprintf(out, "### Options inherrited from parent commands\n\n```\n")
|
||||
parentFlags.PrintDefaults()
|
||||
fmt.Fprintf(out, "```\n\n")
|
||||
}
|
||||
}
|
||||
|
||||
func genMarkdown(command *cobra.Command, parent, docsDir string) {
|
||||
dparent := strings.Replace(parent, " ", "-", -1)
|
||||
name := command.Name()
|
||||
dname := name
|
||||
if len(parent) > 0 {
|
||||
dname = dparent + "-" + name
|
||||
name = parent + " " + name
|
||||
}
|
||||
|
||||
out := new(bytes.Buffer)
|
||||
short := command.Short
|
||||
long := command.Long
|
||||
if len(long) == 0 {
|
||||
long = short
|
||||
}
|
||||
|
||||
fmt.Fprintf(out, "## %s\n\n", name)
|
||||
fmt.Fprintf(out, "%s\n\n", short)
|
||||
fmt.Fprintf(out, "### Synopsis\n\n")
|
||||
fmt.Fprintf(out, "%s\n\n", long)
|
||||
|
||||
printOptions(out, command, name)
|
||||
|
||||
if len(command.Commands()) > 0 || len(parent) > 0 {
|
||||
fmt.Fprintf(out, "### SEE ALSO\n")
|
||||
if len(parent) > 0 {
|
||||
link := dparent + ".md"
|
||||
fmt.Fprintf(out, "* [%s](%s)\n", dparent, link)
|
||||
}
|
||||
for _, c := range command.Commands() {
|
||||
child := dname + "-" + c.Name()
|
||||
link := child + ".md"
|
||||
fmt.Fprintf(out, "* [%s](%s)\n", child, link)
|
||||
genMarkdown(c, name, docsDir)
|
||||
}
|
||||
fmt.Fprintf(out, "\n")
|
||||
}
|
||||
|
||||
filename := docsDir + dname + ".md"
|
||||
outFile, err := os.Create(filename)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
defer outFile.Close()
|
||||
_, err = outFile.Write(out.Bytes())
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
out := os.Stdout
|
||||
// use os.Args instead of "flags" because "flags" will mess up the man pages!
|
||||
docsDir := "docs/man/man1/"
|
||||
if len(os.Args) == 2 {
|
||||
docsDir = os.Args[1]
|
||||
} else if len(os.Args) > 2 {
|
||||
fmt.Fprintf(os.Stderr, "usage: %s [output directory]\n", os.Args[0])
|
||||
return
|
||||
}
|
||||
|
||||
docsDir, err := filepath.Abs(docsDir)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
stat, err := os.Stat(docsDir)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "output directory %s does not exist\n", docsDir)
|
||||
return
|
||||
}
|
||||
|
||||
if !stat.IsDir() {
|
||||
fmt.Fprintf(os.Stderr, "output directory %s is not a directory\n", docsDir)
|
||||
return
|
||||
}
|
||||
docsDir = docsDir + "/"
|
||||
|
||||
// Set environment variables used by kubectl so the output is consistent,
|
||||
// regardless of where we run.
|
||||
os.Setenv("HOME", "/home/username")
|
||||
kubectl := cmd.NewFactory(nil).NewKubectlCommand(out)
|
||||
fmt.Fprintf(out, "## %s\n\n", kubectl.Name())
|
||||
fmt.Fprintf(out, "%s\n\n", kubectl.Short)
|
||||
fmt.Fprintln(out, "### Commands\n")
|
||||
kubectl := cmd.NewFactory(nil).NewKubectlCommand(ioutil.Discard)
|
||||
genMarkdown(kubectl, "", docsDir)
|
||||
for _, c := range kubectl.Commands() {
|
||||
genMarkdown(c, nil, out)
|
||||
}
|
||||
}
|
||||
|
||||
func genMarkdown(command, parent *cobra.Command, out io.Writer) {
|
||||
name := command.Name()
|
||||
if parent != nil {
|
||||
name = fmt.Sprintf("%s %s", parent.Name(), name)
|
||||
}
|
||||
fmt.Fprintf(out, "#### %s\n", name)
|
||||
desc := command.Long
|
||||
if len(desc) == 0 {
|
||||
desc = command.Short
|
||||
}
|
||||
fmt.Fprintf(out, "%s\n\n", desc)
|
||||
usage := command.UsageString()
|
||||
fmt.Fprintf(out, "Usage:\n```\n%s\n```\n\n", usage[9:len(usage)-1])
|
||||
for _, c := range command.Commands() {
|
||||
genMarkdown(c, command, out)
|
||||
genMarkdown(c, "kubectl", docsDir)
|
||||
}
|
||||
}
|
||||
|
177
cmd/genman/gen_kubectl_man.go
Normal file
177
cmd/genman/gen_kubectl_man.go
Normal file
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
Copyright 2014 Google 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 main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd"
|
||||
"github.com/cpuguy83/go-md2man/mangen"
|
||||
"github.com/russross/blackfriday"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/pflag"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// use os.Args instead of "flags" because "flags" will mess up the man pages!
|
||||
docsDir := "docs/man/man1/"
|
||||
if len(os.Args) == 2 {
|
||||
docsDir = os.Args[1]
|
||||
} else if len(os.Args) > 2 {
|
||||
fmt.Fprintf(os.Stderr, "usage: %s [output directory]\n", os.Args[0])
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
docsDir, err := filepath.Abs(docsDir)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
stat, err := os.Stat(docsDir)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "output directory %s does not exist\n", docsDir)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if !stat.IsDir() {
|
||||
fmt.Fprintf(os.Stderr, "output directory %s is not a directory\n", docsDir)
|
||||
os.Exit(1)
|
||||
}
|
||||
docsDir = docsDir + "/"
|
||||
|
||||
// Set environment variables used by kubectl so the output is consistent,
|
||||
// regardless of where we run.
|
||||
os.Setenv("HOME", "/home/username")
|
||||
kubectl := cmd.NewFactory(nil).NewKubectlCommand(ioutil.Discard)
|
||||
genMarkdown(kubectl, "", docsDir)
|
||||
for _, c := range kubectl.Commands() {
|
||||
genMarkdown(c, "kubectl", docsDir)
|
||||
}
|
||||
}
|
||||
|
||||
func preamble(out *bytes.Buffer, name, short, long string) {
|
||||
out.WriteString(`% KUBERNETES(1) kubernetes User Manuals
|
||||
% Eric Paris
|
||||
% Jan 2015
|
||||
# NAME
|
||||
`)
|
||||
fmt.Fprintf(out, "%s \\- %s\n\n", name, short)
|
||||
fmt.Fprintf(out, "# SYNOPSIS\n")
|
||||
fmt.Fprintf(out, "**%s** [OPTIONS]\n\n", name)
|
||||
fmt.Fprintf(out, "# DESCRIPTION\n")
|
||||
fmt.Fprintf(out, "%s\n\n", long)
|
||||
}
|
||||
|
||||
func printFlags(out *bytes.Buffer, flags *pflag.FlagSet) {
|
||||
flags.VisitAll(func(flag *pflag.Flag) {
|
||||
format := "**--%s**=%s\n\t%s\n\n"
|
||||
if flag.Value.Type() == "string" {
|
||||
// put quotes on the value
|
||||
format = "**--%s**=%q\n\t%s\n\n"
|
||||
}
|
||||
if len(flag.Shorthand) > 0 {
|
||||
format = "**-%s**, " + format
|
||||
} else {
|
||||
format = "%s" + format
|
||||
}
|
||||
fmt.Fprintf(out, format, flag.Shorthand, flag.Name, flag.DefValue, flag.Usage)
|
||||
})
|
||||
}
|
||||
|
||||
func printOptions(out *bytes.Buffer, command *cobra.Command) {
|
||||
var flags *pflag.FlagSet
|
||||
if command.HasFlags() {
|
||||
flags = command.Flags()
|
||||
} else if !command.HasParent() && command.HasPersistentFlags() {
|
||||
flags = command.PersistentFlags()
|
||||
}
|
||||
if flags == nil {
|
||||
return
|
||||
}
|
||||
fmt.Fprintf(out, "# OPTIONS\n")
|
||||
printFlags(out, flags)
|
||||
fmt.Fprintf(out, "\n")
|
||||
}
|
||||
|
||||
func genMarkdown(command *cobra.Command, parent, docsDir string) {
|
||||
dparent := strings.Replace(parent, " ", "-", -1)
|
||||
name := command.Name()
|
||||
dname := name
|
||||
if len(parent) > 0 {
|
||||
dname = dparent + "-" + name
|
||||
name = parent + " " + name
|
||||
}
|
||||
|
||||
out := new(bytes.Buffer)
|
||||
short := command.Short
|
||||
long := command.Long
|
||||
if len(long) == 0 {
|
||||
long = short
|
||||
}
|
||||
|
||||
preamble(out, name, short, long)
|
||||
printOptions(out, command)
|
||||
|
||||
if len(command.Commands()) > 0 || len(parent) > 0 {
|
||||
fmt.Fprintf(out, "# SEE ALSO\n")
|
||||
if len(parent) > 0 {
|
||||
fmt.Fprintf(out, "**%s(1)**, ", dparent)
|
||||
}
|
||||
for _, c := range command.Commands() {
|
||||
fmt.Fprintf(out, "**%s-%s(1)**, ", dname, c.Name())
|
||||
genMarkdown(c, name, docsDir)
|
||||
}
|
||||
fmt.Fprintf(out, "\n")
|
||||
}
|
||||
|
||||
out.WriteString(`
|
||||
# HISTORY
|
||||
January 2015, Originally compiled by Eric Paris (eparis at redhat dot com) based on the kubernetes source material, but hopefully they have been automatically generated since!
|
||||
`)
|
||||
|
||||
renderer := mangen.ManRenderer(0)
|
||||
extensions := 0
|
||||
extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS
|
||||
extensions |= blackfriday.EXTENSION_TABLES
|
||||
extensions |= blackfriday.EXTENSION_FENCED_CODE
|
||||
extensions |= blackfriday.EXTENSION_AUTOLINK
|
||||
extensions |= blackfriday.EXTENSION_SPACE_HEADERS
|
||||
extensions |= blackfriday.EXTENSION_FOOTNOTES
|
||||
extensions |= blackfriday.EXTENSION_TITLEBLOCK
|
||||
|
||||
final := blackfriday.Markdown(out.Bytes(), renderer, extensions)
|
||||
|
||||
filename := docsDir + dname + ".1"
|
||||
outFile, err := os.Create(filename)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
defer outFile.Close()
|
||||
_, err = outFile.Write(final)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user