@@ -2,16 +2,22 @@ package main
22
33import (
44 "fmt"
5+ "io/ioutil"
6+ "log"
57 "os"
8+ "path/filepath"
69
710 "github.com/docker/docker/cli/command"
811 "github.com/docker/docker/cli/command/commands"
912 "github.com/docker/docker/pkg/term"
1013 "github.com/spf13/cobra"
1114 "github.com/spf13/cobra/doc"
15+ "github.com/spf13/pflag"
1216)
1317
14- func generateManPages (path string ) error {
18+ const descriptionSourcePath = "man/src/"
19+
20+ func generateManPages (opts * options ) error {
1521 header := & doc.GenManHeader {
1622 Title : "DOCKER" ,
1723 Section : "1" ,
@@ -22,22 +28,67 @@ func generateManPages(path string) error {
2228 dockerCli := command .NewDockerCli (stdin , stdout , stderr )
2329 cmd := & cobra.Command {Use : "docker" }
2430 commands .AddCommands (cmd , dockerCli )
31+ source := filepath .Join (opts .source , descriptionSourcePath )
32+ if err := loadLongDescription (cmd , source ); err != nil {
33+ return err
34+ }
2535
2636 cmd .DisableAutoGenTag = true
2737 return doc .GenManTreeFromOpts (cmd , doc.GenManTreeOptions {
2838 Header : header ,
29- Path : path ,
39+ Path : opts . target ,
3040 CommandSeparator : "-" ,
3141 })
3242}
3343
44+ func loadLongDescription (cmd * cobra.Command , path string ) error {
45+ for _ , cmd := range cmd .Commands () {
46+ if cmd .Name () == "" {
47+ continue
48+ }
49+ fullpath := filepath .Join (path , cmd .Name ()+ ".md" )
50+
51+ if cmd .HasSubCommands () {
52+ loadLongDescription (cmd , filepath .Join (path , cmd .Name ()))
53+ }
54+
55+ if _ , err := os .Stat (fullpath ); err != nil {
56+ log .Printf ("WARN: %s does not exist, skipping\n " , fullpath )
57+ continue
58+ }
59+
60+ content , err := ioutil .ReadFile (fullpath )
61+ if err != nil {
62+ return err
63+ }
64+ cmd .Long = string (content )
65+ }
66+ return nil
67+ }
68+
69+ type options struct {
70+ source string
71+ target string
72+ }
73+
74+ func parseArgs () (* options , error ) {
75+ opts := & options {}
76+ cwd , _ := os .Getwd ()
77+ flags := pflag .NewFlagSet (os .Args [0 ], pflag .ContinueOnError )
78+ flags .StringVar (& opts .source , "root" , cwd , "Path to project root" )
79+ flags .StringVar (& opts .target , "target" , "/tmp" , "Target path for generated man pages" )
80+ err := flags .Parse (os .Args [1 :])
81+ return opts , err
82+ }
83+
3484func main () {
35- path := "/tmp"
36- if len ( os . Args ) > 1 {
37- path = os .Args [ 1 ]
85+ opts , err := parseArgs ()
86+ if err != nil {
87+ fmt . Fprintln ( os .Stderr , err . Error ())
3888 }
39- fmt .Printf ("Generating man pages into %s\n " , path )
40- if err := generateManPages (path ); err != nil {
89+ fmt .Printf ("Project root: %s\n " , opts .source )
90+ fmt .Printf ("Generating man pages into %s\n " , opts .target )
91+ if err := generateManPages (opts ); err != nil {
4192 fmt .Fprintf (os .Stderr , "Failed to generate man pages: %s\n " , err .Error ())
4293 }
4394}
0 commit comments