Skip to content

Commit 3ef3474

Browse files
author
Tibor Vass
committed
Import completion scripts, docs, and man pages from docker/docker
2 parents 1302228 + 5f4920e commit 3ef3474

1 file changed

Lines changed: 106 additions & 0 deletions

File tree

man/generate.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"log"
7+
"os"
8+
"path/filepath"
9+
10+
"github.com/docker/docker/cli/command"
11+
"github.com/docker/docker/cli/command/commands"
12+
"github.com/docker/docker/pkg/term"
13+
"github.com/spf13/cobra"
14+
"github.com/spf13/cobra/doc"
15+
"github.com/spf13/pflag"
16+
)
17+
18+
const descriptionSourcePath = "man/src/"
19+
20+
func generateManPages(opts *options) error {
21+
header := &doc.GenManHeader{
22+
Title: "DOCKER",
23+
Section: "1",
24+
Source: "Docker Community",
25+
}
26+
27+
stdin, stdout, stderr := term.StdStreams()
28+
dockerCli := command.NewDockerCli(stdin, stdout, stderr)
29+
cmd := &cobra.Command{Use: "docker"}
30+
commands.AddCommands(cmd, dockerCli)
31+
source := filepath.Join(opts.source, descriptionSourcePath)
32+
if err := loadLongDescription(cmd, source); err != nil {
33+
return err
34+
}
35+
36+
cmd.DisableAutoGenTag = true
37+
return doc.GenManTreeFromOpts(cmd, doc.GenManTreeOptions{
38+
Header: header,
39+
Path: opts.target,
40+
CommandSeparator: "-",
41+
})
42+
}
43+
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+
fullpath = filepath.Join(path, cmd.Name()+"-example.md")
67+
if _, err := os.Stat(fullpath); err != nil {
68+
continue
69+
}
70+
71+
content, err = ioutil.ReadFile(fullpath)
72+
if err != nil {
73+
return err
74+
}
75+
cmd.Example = string(content)
76+
77+
}
78+
return nil
79+
}
80+
81+
type options struct {
82+
source string
83+
target string
84+
}
85+
86+
func parseArgs() (*options, error) {
87+
opts := &options{}
88+
cwd, _ := os.Getwd()
89+
flags := pflag.NewFlagSet(os.Args[0], pflag.ContinueOnError)
90+
flags.StringVar(&opts.source, "root", cwd, "Path to project root")
91+
flags.StringVar(&opts.target, "target", "/tmp", "Target path for generated man pages")
92+
err := flags.Parse(os.Args[1:])
93+
return opts, err
94+
}
95+
96+
func main() {
97+
opts, err := parseArgs()
98+
if err != nil {
99+
fmt.Fprintln(os.Stderr, err.Error())
100+
}
101+
fmt.Printf("Project root: %s\n", opts.source)
102+
fmt.Printf("Generating man pages into %s\n", opts.target)
103+
if err := generateManPages(opts); err != nil {
104+
fmt.Fprintf(os.Stderr, "Failed to generate man pages: %s\n", err.Error())
105+
}
106+
}

0 commit comments

Comments
 (0)