-
Notifications
You must be signed in to change notification settings - Fork 1.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cobra completion v2 with CLI plugin support #3429
Conversation
4b68b6b
to
df0647c
Compare
df0647c
to
3be87bb
Compare
Codecov Report
@@ Coverage Diff @@
## master #3429 +/- ##
==========================================
- Coverage 59.47% 59.06% -0.41%
==========================================
Files 287 288 +1
Lines 24174 24372 +198
==========================================
+ Hits 14377 14395 +18
- Misses 8931 9105 +174
- Partials 866 872 +6 |
cli-plugins/manager/metadata.go
Outdated
@@ -25,4 +25,6 @@ type Metadata struct { | |||
// Experimental specifies whether the plugin is experimental. | |||
// Deprecated: experimental features are now always enabled in the CLI | |||
Experimental bool `json:",omitempty"` | |||
// Completions specifies whether the plugin supports command completion | |||
Completions bool `json:",omitempty"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps we should consider updating the SchemaVersion as well
// SchemaVersion describes the version of this struct. Mandatory, must be "0.1.0"
Do you think we can combine this PR with #3254 ? (feel free to take that branch of course, if there's useful bits in it)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure about #3254. I understand we want to keep backward compatibility for users, but on the other hand using cobra completion v2 bring more flexibility and CLI plugins support, so should be preferred. If we support both, we will have to offer double maintenance...
cmd/docker/completions.go
Outdated
return nil, cobra.ShellCompDirectiveError | ||
} | ||
|
||
return filterForCompletion(names, toComplete), cobra.ShellCompDirectiveDefault |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If there are no context that match what the user has typed, do you want the shell to suggest file name?
If not, you should return cobra.ShellCompDirectiveNoFileComp
. For example:
$ docker --context D[tab][tab] # There is a context starting with 'D'
Development
$ docker --context Do[tab][tab] # There is NO context starting with 'Do' so we would get file completion
Documents/ Dockerfile Dockerfile.new Dockerfile.ori
cmd/docker/completions.go
Outdated
) | ||
} | ||
|
||
func filterForCompletion(values []string, toComplete string) []string { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You may want to consider not filtering on toComplete
but always returning all choices. Most implementations do the filtering, but with the latest version of Cobra, it is safe not to do it. The advantage is that it allows for fuzzy matching for some shells. In this case, fuzzy matching means that the shell can match what the user has typed not just as a prefix.
So let's say you have contexts test-dev
, test-prod
, test-local
, and the user types prod
, zsh
and fish
shells would be smart and match on test-prod
. This improves the user experience. As for bash
and powershell
that don't support fuzzy matching, they will filter on prefix automatically.
If you want more details, you can have a look at how we did this for helm: helm/helm#10513
e7193c3
to
5a64693
Compare
(see docker/cli#3429) Signed-off-by: Nicolas De Loof <[email protected]>
94d87b3
to
5a65670
Compare
09eeb1f
to
ae2b5da
Compare
Looks like all the comments were fixed, maybe we should merge this one? |
Signed-off-by: Nicolas De Loof <[email protected]>
003dc15
to
cbec75e
Compare
LOL completion is funny; wondering if there's an option to prevent this (each docker unpause paused-container paused-container paused-container paused-container paused-container paused-container paused-container paused-container |
For the list of "improvements"; we should exclude default (built-in) networks; docker network rm <TAB>
bridge docker_gwbridge docker_mynetwork host none Also need to prevent docker network create
# prints file list And some tweaking for docker container attach
cranky_varahamihira paused-container running-container
docker build
.circleci/ .idea/ cli-plugins/ demo/ e2e/ man/ scripts/ vendor/
.git/ build/ cmd/ dockerfiles/ experimental/ opts/ service/
.github/ cli/ contrib/ docs/ internal/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
(see docker/cli#3429) Signed-off-by: Nicolas De Loof <[email protected]>
(see docker/cli#3429) Signed-off-by: Nicolas De Loof <[email protected]>
(see docker/cli#3429) Signed-off-by: Nicolas De Loof <[email protected]>
(see docker/cli#3429) Signed-off-by: Nicolas De Loof <[email protected]>
(see docker/cli#3429) Signed-off-by: Nicolas De Loof <[email protected]>
- What I did
Updated Cobra to 1.3.0 and started adopting Completion v2 mechanism with dynamic flag completion
Longer terms plan is to be able to fully generate completion for all commands, and replace the hand-written completion script
- How I did it
Enabled completion command and introduced
registerCompletionFunc..
I would prefer this is all set by
SetupRootCommand
, but we needdockerCli
to list available values, and passing this will change method signature. Or we need to set a globalutil.*
variable like kubernetes doesRoot Command gets a custom
ValidArgsFunction
set so that we can list available CLI plugins and include them in the completions. Note: they appear after canonical commands, unsorted:Note: support by plugin require docker/cli dependency to be updated and Metadata to explicitly declare
Completion
support (SchemaVersion 0.2.0)- How to verify it
generate completion script by
docker completion bash > /usr/local/etc/bash_completion.d/docker.sh
and check completion within a new consoleor directly invoke completion by:
demo: https://asciinema.org/a/cThdD50ILb3G5Ugx9q25XlTGo
- Description for the changelog
Introduce generation of shell completion command
docker completion
with dynamic completion- A picture of a cute animal (not mandatory but encouraged)