Skip to content

Commit 80bca8e

Browse files
committed
man: rewrite to use cli-docs-tool manpage generator
It's a wrapper around Cobra's generator, but handles some special cases. While rewriting, also rewrite the generator code to align with the mddocs/yamldocs counterpart in docs/generate/ Signed-off-by: Sebastiaan van Stijn <[email protected]>
1 parent b8034c0 commit 80bca8e

File tree

2 files changed

+47
-51
lines changed

2 files changed

+47
-51
lines changed

man/generate.go

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -9,57 +9,63 @@ import (
99
"log"
1010
"os"
1111
"path/filepath"
12-
"strconv"
13-
"time"
1412

13+
clidocstool "github.com/docker/cli-docs-tool"
14+
"github.com/docker/cli/cli"
1515
"github.com/docker/cli/cli/command"
1616
"github.com/docker/cli/cli/command/commands"
1717
"github.com/spf13/cobra"
1818
"github.com/spf13/cobra/doc"
1919
"github.com/spf13/pflag"
2020
)
2121

22-
const descriptionSourcePath = "man/src/"
22+
const defaultSourcePath = "man/src/"
2323

24-
func generateManPages(opts *options) error {
24+
type options struct {
25+
source string
26+
target string
27+
}
28+
29+
func gen(opts *options) error {
2530
log.SetFlags(0)
2631

27-
header := &doc.GenManHeader{
28-
Title: "DOCKER",
29-
Section: "1",
30-
Source: "Docker Community",
31-
Manual: "Docker User Manuals",
32+
dockerCLI, err := command.NewDockerCli()
33+
if err != nil {
34+
return err
3235
}
33-
34-
// If SOURCE_DATE_EPOCH is set, in order to allow reproducible package
35-
// builds, we explicitly set the build time to SOURCE_DATE_EPOCH.
36-
if epoch := os.Getenv("SOURCE_DATE_EPOCH"); epoch != "" {
37-
unixEpoch, err := strconv.ParseInt(epoch, 10, 64)
38-
if err != nil {
39-
return fmt.Errorf("invalid SOURCE_DATE_EPOCH: %v", err)
40-
}
41-
now := time.Unix(unixEpoch, 0)
42-
header.Date = &now
36+
cmd := &cobra.Command{
37+
Use: "docker [OPTIONS] COMMAND [ARG...]",
38+
Short: "The base command for the Docker CLI.",
4339
}
4440

45-
dockerCli, err := command.NewDockerCli()
46-
if err != nil {
41+
clientOpts, _ := cli.SetupRootCommand(cmd)
42+
if err := dockerCLI.Initialize(clientOpts); err != nil {
4743
return err
4844
}
49-
cmd := &cobra.Command{Use: "docker"}
50-
commands.AddCommands(cmd, dockerCli)
51-
source := filepath.Join(opts.source, descriptionSourcePath)
52-
if err := loadLongDescription(cmd, source); err != nil {
45+
commands.AddCommands(cmd, dockerCLI)
46+
// TODO(thaJeztah): cli-docs-tool should already be able to do this, but assumes source-files are not in subdirectories (it looks for `src/docker_command_subcommand.md`)
47+
if err := loadLongDescription(cmd, opts.source); err != nil {
5348
return err
5449
}
5550

56-
cmd.DisableAutoGenTag = true
57-
cmd.DisableFlagsInUseLine = true
58-
return doc.GenManTreeFromOpts(cmd, doc.GenManTreeOptions{
59-
Header: header,
60-
Path: opts.target,
61-
CommandSeparator: "-",
51+
c, err := clidocstool.New(clidocstool.Options{
52+
Root: cmd,
53+
SourceDir: opts.source,
54+
TargetDir: opts.target,
55+
ManHeader: &doc.GenManHeader{
56+
Title: "DOCKER",
57+
Section: "1",
58+
Source: "Docker Community",
59+
Manual: "Docker User Manuals",
60+
},
61+
Plugin: false,
6262
})
63+
if err != nil {
64+
return err
65+
}
66+
fmt.Println("Manpage source folder:", opts.source)
67+
fmt.Println("Generating man pages into", opts.target)
68+
return c.GenManTree(cmd)
6369
}
6470

6571
func loadLongDescription(parentCommand *cobra.Command, path string) error {
@@ -98,34 +104,24 @@ func loadLongDescription(parentCommand *cobra.Command, path string) error {
98104
return err
99105
}
100106
cmd.Example = string(content)
101-
102107
}
103108
return nil
104109
}
105110

106-
type options struct {
107-
source string
108-
target string
109-
}
110-
111-
func parseArgs() (*options, error) {
111+
func run() error {
112112
opts := &options{}
113-
cwd, _ := os.Getwd()
114113
flags := pflag.NewFlagSet(os.Args[0], pflag.ContinueOnError)
115-
flags.StringVar(&opts.source, "root", cwd, "Path to project root")
114+
flags.StringVar(&opts.source, "source", defaultSourcePath, "Manpage source folder")
116115
flags.StringVar(&opts.target, "target", "/tmp", "Target path for generated man pages")
117-
err := flags.Parse(os.Args[1:])
118-
return opts, err
116+
if err := flags.Parse(os.Args[1:]); err != nil {
117+
return err
118+
}
119+
return gen(opts)
119120
}
120121

121122
func main() {
122-
opts, err := parseArgs()
123-
if err != nil {
124-
fmt.Fprintln(os.Stderr, err.Error())
125-
}
126-
fmt.Printf("Project root: %s\n", opts.source)
127-
fmt.Printf("Generating man pages into %s\n", opts.target)
128-
if err := generateManPages(opts); err != nil {
129-
fmt.Fprintf(os.Stderr, "Failed to generate man pages: %s\n", err.Error())
123+
if err := run(); err != nil {
124+
log.Printf("ERROR: %+v", err)
125+
os.Exit(1)
130126
}
131127
}

scripts/docs/generate-man.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fi
1515
mkdir -p man/man1
1616
(
1717
set -x
18-
go run -mod=vendor -modfile=vendor.mod -tags manpages ./man/generate.go --root "." --target "./man/man1"
18+
go run -mod=vendor -modfile=vendor.mod -tags manpages ./man/generate.go --source "./man/src" --target "./man/man1"
1919
)
2020

2121
(

0 commit comments

Comments
 (0)