Skip to content

Commit 76b5950

Browse files
authored
Merge pull request #1142 from plebioda/completion-scripts
Add support for shell completion
2 parents d3411b7 + 35e2a6a commit 76b5950

File tree

6 files changed

+66
-3
lines changed

6 files changed

+66
-3
lines changed

Makefile

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: build-pbm build-agent build install install-pbm install-agent test
1+
.PHONY: build-pbm build-agent build install install-pbm install-agent test completion completion-bash completion-zsh
22

33
GOOS?=$(shell go env GOOS)
44
GOMOD?=on
@@ -129,3 +129,28 @@ install-agent-cover:
129129
$(ENVS) go install -cover -ldflags="$(LDFLAGS)" $(BUILD_FLAGS) ./cmd/pbm-agent
130130
install-stest-cover:
131131
$(ENVS) go install -cover -ldflags="$(LDFLAGS)" $(BUILD_FLAGS) ./cmd/pbm-speed-test
132+
133+
# COMPLETION SCRIPTS
134+
completion: completion-bash completion-zsh
135+
136+
completion-dir-bash:
137+
mkdir -p ./bin/completions/bash
138+
139+
completion-dir-zsh:
140+
mkdir -p ./bin/completions/zsh
141+
142+
completion-bash: completion-dir-bash completion-bash-pbm completion-bash-agent completion-bash-stest
143+
completion-bash-pbm:
144+
./bin/pbm completion bash > ./bin/completions/bash/pbm
145+
completion-bash-agent:
146+
./bin/pbm-agent completion bash > ./bin/completions/bash/pbm-agent
147+
completion-bash-stest:
148+
./bin/pbm-speed-test completion bash > ./bin/completions/bash/pbm-speed-test
149+
150+
completion-zsh: completion-dir-zsh completion-zsh-pbm completion-zsh-agent completion-zsh-stest
151+
completion-zsh-pbm:
152+
./bin/pbm completion zsh > ./bin/completions/zsh/_pbm
153+
completion-zsh-agent:
154+
./bin/pbm-agent completion zsh > ./bin/completions/zsh/_pbm-agent
155+
completion-zsh-stest:
156+
./bin/pbm-speed-test completion zsh > ./bin/completions/zsh/_pbm-speed-test

cmd/pbm-agent/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/percona/percona-backup-mongodb/pbm/connect"
1818
"github.com/percona/percona-backup-mongodb/pbm/errors"
1919
"github.com/percona/percona-backup-mongodb/pbm/log"
20+
"github.com/percona/percona-backup-mongodb/pbm/util"
2021
"github.com/percona/percona-backup-mongodb/pbm/version"
2122
)
2223

@@ -25,6 +26,7 @@ const mongoConnFlag = "mongodb-uri"
2526
func main() {
2627
rootCmd := rootCommand()
2728
rootCmd.AddCommand(versionCommand())
29+
rootCmd.AddCommand(util.CompletionCommand())
2830

2931
if err := rootCmd.Execute(); err != nil {
3032
fmt.Println(err)

cmd/pbm-speed-test/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ func main() {
158158
versionCmd.Flags().StringVar(&versionFormat, "format", "", "Output format <json or \"\">")
159159

160160
rootCmd.AddCommand(versionCmd)
161+
rootCmd.AddCommand(util.CompletionCommand())
161162

162163
if err := rootCmd.Execute(); err != nil {
163164
os.Exit(1)

cmd/pbm/main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/percona/percona-backup-mongodb/pbm/log"
2121
"github.com/percona/percona-backup-mongodb/pbm/oplog"
2222
"github.com/percona/percona-backup-mongodb/pbm/topo"
23+
"github.com/percona/percona-backup-mongodb/pbm/util"
2324
"github.com/percona/percona-backup-mongodb/pbm/version"
2425
"github.com/percona/percona-backup-mongodb/sdk"
2526
)
@@ -148,14 +149,15 @@ func newPbmApp() *pbmApp {
148149
app.rootCmd.AddCommand(app.buildRestoreFinishCmd())
149150
app.rootCmd.AddCommand(app.buildStatusCmd())
150151
app.rootCmd.AddCommand(app.buildVersionCmd())
152+
app.rootCmd.AddCommand(util.CompletionCommand())
151153

152154
return app
153155
}
154156

155157
func (app *pbmApp) persistentPreRun(cmd *cobra.Command, args []string) error {
156158
app.pbmOutF = outFormat(viper.GetString("out"))
157159

158-
if cmd.Name() == "help" || cmd.Name() == "version" {
160+
if cmd.Name() == "help" || cmd.Name() == "version" || util.IsCompletionCommand(cmd.Name()) {
159161
return nil
160162
}
161163

e2e-tests/docker/pbm.dockerfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ WORKDIR /build
99
RUN mkdir -p /data/db
1010

1111
COPY --from=mongo_image /bin/mongod /bin/
12-
RUN dnf install epel-release && dnf update && dnf install make gcc krb5-devel iproute-tc libfaketime
12+
RUN dnf install epel-release && dnf update && dnf install make gcc krb5-devel iproute-tc libfaketime bash-completion
1313

1414
RUN arch=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) && \
1515
curl -sL -o /tmp/golang.tar.gz https://go.dev/dl/go1.23.2.linux-${arch}.tar.gz && \
@@ -21,3 +21,5 @@ FROM base-build
2121
COPY . .
2222

2323
RUN make build-tests && cp /build/bin/* /bin/
24+
RUN pbm completion bash > /etc/bash_completion.d/pbm
25+
RUN useradd -u 1001 user

pbm/util/completion.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package util
2+
3+
import (
4+
"os"
5+
6+
"github.com/spf13/cobra"
7+
)
8+
9+
func CompletionCommand() *cobra.Command {
10+
return &cobra.Command{
11+
Use: "completion [bash|zsh]",
12+
Short: "Generate completion script for the specified shell",
13+
DisableFlagsInUseLine: true,
14+
Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs),
15+
ValidArgs: []string{"bash", "zsh"},
16+
RunE: func(cmd *cobra.Command, args []string) error {
17+
switch args[0] {
18+
case "bash":
19+
return cmd.Root().GenBashCompletion(os.Stdout)
20+
case "zsh":
21+
return cmd.Root().GenZshCompletion(os.Stdout)
22+
default:
23+
return cmd.Help()
24+
}
25+
},
26+
}
27+
}
28+
29+
func IsCompletionCommand(name string) bool {
30+
return name == "completion" || name == "__complete"
31+
}

0 commit comments

Comments
 (0)