Skip to content

Commit cc5eaf0

Browse files
authored
Merge pull request #10 from crazy-max/fix-persistent-flags
fix persistent flags
2 parents bb36108 + 669397c commit cc5eaf0

13 files changed

Lines changed: 128 additions & 61 deletions

clidocstool.go

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ import (
2222
"github.com/spf13/cobra"
2323
)
2424

25+
const (
26+
// AnnotationExternalUrl specifies an external link annotation
27+
AnnotationExternalUrl = "docs.external.url"
28+
)
29+
2530
// Options defines options for cli-docs-tool
2631
type Options struct {
2732
Root *cobra.Command
@@ -75,25 +80,6 @@ func (c *Client) GenAllTree() error {
7580
return nil
7681
}
7782

78-
// DisableFlagsInUseLine sets the DisableFlagsInUseLine flag on all
79-
// commands within the tree rooted at cmd.
80-
func (c *Client) DisableFlagsInUseLine() {
81-
visitAll(c.root, func(ccmd *cobra.Command) {
82-
// do not add a `[flags]` to the end of the usage line.
83-
ccmd.DisableFlagsInUseLine = true
84-
})
85-
}
86-
87-
// visitAll traverses all commands from the root.
88-
// This is different from the VisitAll of cobra.Command where only parents
89-
// are checked.
90-
func visitAll(root *cobra.Command, fn func(*cobra.Command)) {
91-
for _, cmd := range root.Commands() {
92-
visitAll(cmd, fn)
93-
}
94-
fn(root)
95-
}
96-
9783
func fileExists(f string) bool {
9884
info, err := os.Stat(f)
9985
if os.IsNotExist(err) {

clidocstool_md.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ func (c *Client) GenMarkdownTree(cmd *cobra.Command) error {
3737
}
3838
}
3939

40+
// always disable the addition of [flags] to the usage
41+
cmd.DisableFlagsInUseLine = true
42+
4043
// Skip the root command altogether, to prevent generating a useless
4144
// md file for plugins.
4245
if c.plugin && !cmd.HasParent() {
@@ -117,7 +120,7 @@ func mdFilename(cmd *cobra.Command) string {
117120

118121
func mdMakeLink(txt, link string, f *pflag.Flag, isAnchor bool) string {
119122
link = "#" + link
120-
annotations, ok := f.Annotations["docs.external.url"]
123+
annotations, ok := f.Annotations[AnnotationExternalUrl]
121124
if ok && len(annotations) > 0 {
122125
link = annotations[0]
123126
} else {
@@ -158,11 +161,10 @@ func mdCmdOutput(cmd *cobra.Command, old string) (string, error) {
158161
fmt.Fprint(b, "\n\n")
159162
}
160163

161-
hasFlags := cmd.Flags().HasAvailableFlags()
162-
164+
// add inherited flags before checking for flags availability
163165
cmd.Flags().AddFlagSet(cmd.InheritedFlags())
164166

165-
if hasFlags {
167+
if cmd.Flags().HasAvailableFlags() {
166168
fmt.Fprint(b, "### Options\n\n")
167169
fmt.Fprint(b, "| Name | Description |\n")
168170
fmt.Fprint(b, "| --- | --- |\n")

clidocstool_md_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func TestGenMarkdownTree(t *testing.T) {
3939
require.NoError(t, err)
4040
require.NoError(t, c.GenMarkdownTree(buildxCmd))
4141

42-
for _, tt := range []string{"buildx.md", "buildx_build.md"} {
42+
for _, tt := range []string{"buildx.md", "buildx_build.md", "buildx_stop.md"} {
4343
tt := tt
4444
t.Run(tt, func(t *testing.T) {
4545
fres := filepath.Join(tmpdir, tt)

clidocstool_test.go

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ var (
3030
dockerCmd *cobra.Command
3131
buildxCmd *cobra.Command
3232
buildxBuildCmd *cobra.Command
33+
buildxStopCmd *cobra.Command
3334
)
3435

3536
//nolint:errcheck
@@ -54,43 +55,52 @@ func init() {
5455
Short: "Start a build",
5556
Run: func(cmd *cobra.Command, args []string) {},
5657
}
58+
buildxStopCmd = &cobra.Command{
59+
Use: "stop [NAME]",
60+
Short: "Stop builder instance",
61+
Run: func(cmd *cobra.Command, args []string) {},
62+
}
63+
64+
buildxPFlags := buildxCmd.PersistentFlags()
65+
buildxPFlags.String("builder", os.Getenv("BUILDX_BUILDER"), "Override the configured builder instance")
5766

58-
flags := buildxBuildCmd.Flags()
59-
flags.Bool("push", false, "Shorthand for --output=type=registry")
60-
flags.Bool("load", false, "Shorthand for --output=type=docker")
61-
flags.StringArrayP("tag", "t", []string{}, "Name and optionally a tag in the 'name:tag' format")
62-
flags.SetAnnotation("tag", "docs.external.url", []string{"https://docs.docker.com/engine/reference/commandline/build/#tag-an-image--t"})
63-
flags.StringArray("build-arg", []string{}, "Set build-time variables")
64-
flags.SetAnnotation("build-arg", "docs.external.url", []string{"https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg"})
65-
flags.StringP("file", "f", "", "Name of the Dockerfile (Default is 'PATH/Dockerfile')")
66-
flags.SetAnnotation("file", "docs.external.url", []string{"https://docs.docker.com/engine/reference/commandline/build/#specify-a-dockerfile--f"})
67-
flags.StringArray("label", []string{}, "Set metadata for an image")
68-
flags.StringArray("cache-from", []string{}, "External cache sources (eg. user/app:cache, type=local,src=path/to/dir)")
69-
flags.StringArray("cache-to", []string{}, "Cache export destinations (eg. user/app:cache, type=local,dest=path/to/dir)")
70-
flags.String("target", "", "Set the target build stage to build.")
71-
flags.SetAnnotation("target", "docs.external.url", []string{"https://docs.docker.com/engine/reference/commandline/build/#specifying-target-build-stage---target"})
72-
flags.StringSlice("allow", []string{}, "Allow extra privileged entitlement, e.g. network.host, security.insecure")
73-
flags.StringArray("platform", []string{}, "Set target platform for build")
74-
flags.StringArray("secret", []string{}, "Secret file to expose to the build: id=mysecret,src=/local/secret")
75-
flags.StringArray("ssh", []string{}, "SSH agent socket or keys to expose to the build (format: `default|<id>[=<socket>|<key>[,<key>]]`)")
76-
flags.StringArrayP("output", "o", []string{}, "Output destination (format: type=local,dest=path)")
67+
buildxBuildFlags := buildxBuildCmd.Flags()
68+
buildxBuildFlags.Bool("push", false, "Shorthand for --output=type=registry")
69+
buildxBuildFlags.Bool("load", false, "Shorthand for --output=type=docker")
70+
buildxBuildFlags.StringArrayP("tag", "t", []string{}, "Name and optionally a tag in the 'name:tag' format")
71+
buildxBuildFlags.SetAnnotation("tag", AnnotationExternalUrl, []string{"https://docs.docker.com/engine/reference/commandline/build/#tag-an-image--t"})
72+
buildxBuildFlags.StringArray("build-arg", []string{}, "Set build-time variables")
73+
buildxBuildFlags.SetAnnotation("build-arg", AnnotationExternalUrl, []string{"https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg"})
74+
buildxBuildFlags.StringP("file", "f", "", "Name of the Dockerfile (Default is 'PATH/Dockerfile')")
75+
buildxBuildFlags.SetAnnotation("file", AnnotationExternalUrl, []string{"https://docs.docker.com/engine/reference/commandline/build/#specify-a-dockerfile--f"})
76+
buildxBuildFlags.StringArray("label", []string{}, "Set metadata for an image")
77+
buildxBuildFlags.StringArray("cache-from", []string{}, "External cache sources (eg. user/app:cache, type=local,src=path/to/dir)")
78+
buildxBuildFlags.StringArray("cache-to", []string{}, "Cache export destinations (eg. user/app:cache, type=local,dest=path/to/dir)")
79+
buildxBuildFlags.String("target", "", "Set the target build stage to build.")
80+
buildxBuildFlags.SetAnnotation("target", AnnotationExternalUrl, []string{"https://docs.docker.com/engine/reference/commandline/build/#specifying-target-build-stage---target"})
81+
buildxBuildFlags.StringSlice("allow", []string{}, "Allow extra privileged entitlement, e.g. network.host, security.insecure")
82+
buildxBuildFlags.StringArray("platform", []string{}, "Set target platform for build")
83+
buildxBuildFlags.StringArray("secret", []string{}, "Secret file to expose to the build: id=mysecret,src=/local/secret")
84+
buildxBuildFlags.StringArray("ssh", []string{}, "SSH agent socket or keys to expose to the build (format: `default|<id>[=<socket>|<key>[,<key>]]`)")
85+
buildxBuildFlags.StringArrayP("output", "o", []string{}, "Output destination (format: type=local,dest=path)")
7786
// not implemented
78-
flags.String("network", "default", "Set the networking mode for the RUN instructions during build")
79-
flags.StringSlice("add-host", []string{}, "Add a custom host-to-IP mapping (host:ip)")
80-
flags.SetAnnotation("add-host", "docs.external.url", []string{"https://docs.docker.com/engine/reference/commandline/build/#add-entries-to-container-hosts-file---add-host"})
81-
flags.String("iidfile", "", "Write the image ID to the file")
87+
buildxBuildFlags.String("network", "default", "Set the networking mode for the RUN instructions during build")
88+
buildxBuildFlags.StringSlice("add-host", []string{}, "Add a custom host-to-IP mapping (host:ip)")
89+
buildxBuildFlags.SetAnnotation("add-host", AnnotationExternalUrl, []string{"https://docs.docker.com/engine/reference/commandline/build/#add-entries-to-container-hosts-file---add-host"})
90+
buildxBuildFlags.String("iidfile", "", "Write the image ID to the file")
8291
// hidden flags
83-
flags.BoolP("quiet", "q", false, "Suppress the build output and print image ID on success")
84-
flags.MarkHidden("quiet")
85-
flags.Bool("squash", false, "Squash newly built layers into a single new layer")
86-
flags.MarkHidden("squash")
87-
flags.String("ulimit", "", "Ulimit options")
88-
flags.MarkHidden("ulimit")
89-
flags.StringSlice("security-opt", []string{}, "Security options")
90-
flags.MarkHidden("security-opt")
91-
flags.Bool("compress", false, "Compress the build context using gzip")
92+
buildxBuildFlags.BoolP("quiet", "q", false, "Suppress the build output and print image ID on success")
93+
buildxBuildFlags.MarkHidden("quiet")
94+
buildxBuildFlags.Bool("squash", false, "Squash newly built layers into a single new layer")
95+
buildxBuildFlags.MarkHidden("squash")
96+
buildxBuildFlags.String("ulimit", "", "Ulimit options")
97+
buildxBuildFlags.MarkHidden("ulimit")
98+
buildxBuildFlags.StringSlice("security-opt", []string{}, "Security options")
99+
buildxBuildFlags.MarkHidden("security-opt")
100+
buildxBuildFlags.Bool("compress", false, "Compress the build context using gzip")
92101

93102
buildxCmd.AddCommand(buildxBuildCmd)
103+
buildxCmd.AddCommand(buildxStopCmd)
94104
dockerCmd.AddCommand(buildxCmd)
95105
}
96106

@@ -108,7 +118,7 @@ func TestGenAllTree(t *testing.T) {
108118
require.NoError(t, err)
109119
require.NoError(t, c.GenAllTree())
110120

111-
for _, tt := range []string{"buildx.md", "buildx_build.md", "docker_buildx.yaml", "docker_buildx_build.yaml"} {
121+
for _, tt := range []string{"buildx.md", "buildx_build.md", "buildx_stop.md", "docker_buildx.yaml", "docker_buildx_build.yaml", "docker_buildx_stop.yaml"} {
112122
tt := tt
113123
t.Run(tt, func(t *testing.T) {
114124
fres := filepath.Join(tmpdir, tt)

clidocstool_yaml.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ func (c *Client) genYamlTreeCustom(cmd *cobra.Command, filePrepender func(string
9797
}
9898
}
9999

100+
// always disable the addition of [flags] to the usage
101+
cmd.DisableFlagsInUseLine = true
102+
100103
// The "root" command used in the generator is just a "stub", and only has a
101104
// list of subcommands, but not (e.g.) global options/flags. We should fix
102105
// that, so that the YAML file for the docker "root" command contains the
@@ -140,6 +143,10 @@ func (c *Client) genYamlCustom(cmd *cobra.Command, w io.Writer) error {
140143
longMaxWidth = 74
141144
)
142145

146+
// necessary to add inherited flags otherwise some
147+
// fields are not properly declared like usage
148+
cmd.Flags().AddFlagSet(cmd.InheritedFlags())
149+
143150
cliDoc := cmdDoc{
144151
Name: cmd.CommandPath(),
145152
Aliases: strings.Join(cmd.Aliases, ", "),
@@ -259,7 +266,7 @@ func genFlagResult(flags *pflag.FlagSet, anchors map[string]struct{}) []cmdOptio
259266
Deprecated: len(flag.Deprecated) > 0,
260267
}
261268

262-
if v, ok := flag.Annotations["docs.external.url"]; ok && len(v) > 0 {
269+
if v, ok := flag.Annotations[AnnotationExternalUrl]; ok && len(v) > 0 {
263270
opt.DetailsURL = strings.TrimPrefix(v[0], "https://docs.docker.com")
264271
} else if _, ok = anchors[flag.Name]; ok {
265272
opt.DetailsURL = "#" + flag.Name

clidocstool_yaml_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func TestGenYamlTree(t *testing.T) {
3939
require.NoError(t, err)
4040
require.NoError(t, c.GenYamlTree(buildxCmd))
4141

42-
for _, tt := range []string{"docker_buildx.yaml", "docker_buildx_build.yaml"} {
42+
for _, tt := range []string{"docker_buildx.yaml", "docker_buildx_build.yaml", "docker_buildx_stop.yaml"} {
4343
tt := tt
4444
t.Run(tt, func(t *testing.T) {
4545
fres := filepath.Join(tmpdir, tt)

example/main.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ func gen(opts *options) error {
6363
if err != nil {
6464
return err
6565
}
66-
c.DisableFlagsInUseLine()
6766

6867
// generate all supported docs formats
6968
return c.GenAllTree()

fixtures/buildx.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,15 @@ Build with BuildKit
88
| Name | Description |
99
| --- | --- |
1010
| [`build`](buildx_build.md) | Start a build |
11+
| [`stop`](buildx_stop.md) | Stop builder instance |
1112

1213

14+
### Options
15+
16+
| Name | Description |
17+
| --- | --- |
18+
| `--builder string` | Override the configured builder instance |
19+
1320

1421
<!---MARKER_GEN_END-->
1522

fixtures/buildx_build.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Start a build
1414
| [`--add-host stringSlice`](https://docs.docker.com/engine/reference/commandline/build/#add-entries-to-container-hosts-file---add-host) | Add a custom host-to-IP mapping (host:ip) |
1515
| `--allow stringSlice` | Allow extra privileged entitlement, e.g. network.host, security.insecure |
1616
| [`--build-arg stringArray`](https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg) | Set build-time variables |
17+
| `--builder string` | Override the configured builder instance |
1718
| `--cache-from stringArray` | External cache sources (eg. user/app:cache, type=local,src=path/to/dir) |
1819
| `--cache-to stringArray` | Cache export destinations (eg. user/app:cache, type=local,dest=path/to/dir) |
1920
| `--compress` | Compress the build context using gzip |

fixtures/buildx_stop.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# docker buildx stop
2+
3+
<!---MARKER_GEN_START-->
4+
Stop builder instance
5+
6+
### Options
7+
8+
| Name | Description |
9+
| --- | --- |
10+
| `--builder string` | Override the configured builder instance |
11+
12+
13+
<!---MARKER_GEN_END-->
14+

0 commit comments

Comments
 (0)