generate.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. "github.com/docker/docker/cli/command"
  10. "github.com/docker/docker/cli/command/commands"
  11. "github.com/docker/docker/pkg/term"
  12. "github.com/spf13/cobra"
  13. "github.com/spf13/pflag"
  14. )
  15. const descriptionSourcePath = "docs/reference/commandline/"
  16. func generateCliYaml(opts *options) error {
  17. stdin, stdout, stderr := term.StdStreams()
  18. dockerCli := command.NewDockerCli(stdin, stdout, stderr)
  19. cmd := &cobra.Command{Use: "docker"}
  20. commands.AddCommands(cmd, dockerCli)
  21. source := filepath.Join(opts.source, descriptionSourcePath)
  22. if err := loadLongDescription(cmd, source); err != nil {
  23. return err
  24. }
  25. cmd.DisableAutoGenTag = true
  26. return GenYamlTree(cmd, opts.target)
  27. }
  28. func loadLongDescription(cmd *cobra.Command, path ...string) error {
  29. for _, cmd := range cmd.Commands() {
  30. if cmd.Name() == "" {
  31. continue
  32. }
  33. fullpath := filepath.Join(path[0], strings.Join(append(path[1:], cmd.Name()), "_")+".md")
  34. if cmd.HasSubCommands() {
  35. loadLongDescription(cmd, path[0], cmd.Name())
  36. }
  37. if _, err := os.Stat(fullpath); err != nil {
  38. log.Printf("WARN: %s does not exist, skipping\n", fullpath)
  39. continue
  40. }
  41. content, err := ioutil.ReadFile(fullpath)
  42. if err != nil {
  43. return err
  44. }
  45. description, examples := parseMDContent(string(content))
  46. cmd.Long = description
  47. cmd.Example = examples
  48. }
  49. return nil
  50. }
  51. type options struct {
  52. source string
  53. target string
  54. }
  55. func parseArgs() (*options, error) {
  56. opts := &options{}
  57. cwd, _ := os.Getwd()
  58. flags := pflag.NewFlagSet(os.Args[0], pflag.ContinueOnError)
  59. flags.StringVar(&opts.source, "root", cwd, "Path to project root")
  60. flags.StringVar(&opts.target, "target", "/tmp", "Target path for generated yaml files")
  61. err := flags.Parse(os.Args[1:])
  62. return opts, err
  63. }
  64. func main() {
  65. opts, err := parseArgs()
  66. if err != nil {
  67. fmt.Fprintln(os.Stderr, err.Error())
  68. }
  69. fmt.Printf("Project root: %s\n", opts.source)
  70. fmt.Printf("Generating yaml files into %s\n", opts.target)
  71. if err := generateCliYaml(opts); err != nil {
  72. fmt.Fprintf(os.Stderr, "Failed to generate yaml files: %s\n", err.Error())
  73. }
  74. }