Skip to content

Commit 12670c0

Browse files
dnephinTibor Vass
authored andcommitted
Read long description from a file.
Signed-off-by: Daniel Nephin <dnephin@docker.com>
1 parent 7b32646 commit 12670c0

1 file changed

Lines changed: 58 additions & 7 deletions

File tree

man/generate.go

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,22 @@ package main
22

33
import (
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+
3484
func 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

Comments
 (0)