-
Notifications
You must be signed in to change notification settings - Fork 2.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
Fix flag completion #1438
Fix flag completion #1438
Conversation
@jpmcb @marckhouzam PTAL Every program who calls cmd.RegisterFlagCompletionFunc() before joining the cmd to the root command will no longer have functional flag completion. I think it will break many applications since it is common to add flags to the cmd before adding it the root/parent cmd. |
OK this patch doesn't work either. Storing them in the correct cmd doesn't work for persistent flags. I also do not understand what #1423 is supposed to fix. The map is just stored in the root cmd now, writing concurrently will still fail. |
41a0a4e
to
16378fa
Compare
OK, this should work now and truly fix the concurrency problem. |
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.
Thanks for the quick reaction @Luap99 !
This look good with a couple of nits.
However, I haven't tested if it really fixes the concern of istioctl mentioned in #1423 (comment), but I expect it would.
@silenceshell are you able to test if this fix addresses the concern you were aiming to fix for istioctl in #1423 (comment)? |
This PR could fix the istioctl test cases, RWMutex is safe enough. |
@marckhouzam Updated. |
The flag completion functions should not be stored in the root cmd. There is no requirement that the root cmd should be the same when `RegisterFlagCompletionFunc` was called. Storing the flags there does not work when you add the the flags to your cmd struct before you add the cmd to the parent/root cmd. The flags can no longer be found in the rigth place when the completion command is called and thus the flag completion does not work. Also spf13#1423 claims that this would be thread safe but we still have a map which will fail when accessed concurrently. To truly fix this issue use a RWMutex. Fixes spf13#1437 Fixes spf13#1320 Signed-off-by: Paul Holzinger <pholzing@redhat.com>
Signed-off-by: Paul Holzinger <pholzing@redhat.com>
Sorry for the incomplete consideration. |
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.
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.
Merging to get a quick fix out for this regression. Thanks all for the fast find and quick testing efforts on this!
@jpmcb Thanks for the quick review and the new release tag. |
Different problems have been reported about flag completion registration. These two tests are the cases that were not being verified but had been mentioned as problematic. Ref: - spf13#1320 - spf13#1438 (comment) Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>
Different problems have been reported about flag completion registration. These two tests are the cases that were not being verified but had been mentioned as problematic. Ref: - #1320 - #1438 (comment) Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com>
* Create unit test illustrating unknown flag bug (spf13#1854) Created a unit test that tests the unknown flag error message when the unknown flag is located in different arg positions. * Update stale.yml (spf13#1863) * fix: force ForEach-Object to return array in pwsh completion (spf13#1850) Fixes spf13#1847 * Makefile: add target richtest (spf13#1865) Don't require contributors to install richgo but keep it as an option and for CI * build(deps): bump golangci/golangci-lint-action from 3.2.0 to 3.3.1 (spf13#1851) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 3.2.0 to 3.3.1. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](golangci/golangci-lint-action@v3.2.0...v3.3.1) --- updated-dependencies: - dependency-name: golangci/golangci-lint-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update kubescape org (spf13#1874) Signed-off-by: David Wertenteil <dwertent@armosec.io> * ci: deprecate go 1.15 (spf13#1866) Remove testing for go 1.15 to allow CI to pass, but don't force projects to upgrade. * fix: conflict import name with variable (spf13#1879) `template` is an import in `cobra.go` file and also used as a variable name, which masks the library in the scope of that function. * Update badge route (spf13#1884) Based on badges/shields#8671 * fix: func name in doc strings (spf13#1885) Corrected the function name at the start of doc strings, as per the convention outlined in official go documentation: https://go.dev/blog/godoc * completions: do not detect arguments with dash as 2nd char as flag (spf13#1817) Fixes spf13#1816 Previously, arguments with a dash as the second character (e.g., 1-ff00:0:1) were detected as a flag by mistake. This resulted in auto completion misbehaving if such an argument was last in the argument list during invocation. * build(deps): bump github.com/inconshreveable/mousetrap (spf13#1872) * Add documentation about disabling completion descriptions (spf13#1901) * Improve MarkFlagsMutuallyExclusive example in User Guide (spf13#1904) * Update shell_completions.md (spf13#1907) align documentation with the code : completions.go:452 * build(deps): bump golangci/golangci-lint-action from 3.3.1 to 3.4.0 (spf13#1902) * Removes stale bot from GitHub action (spf13#1908) Signed-off-by: John McBride <jpmmcbride@gmail.com> * Add keeporder to shell completion (spf13#1903) This allows programs to request the shell to maintain the order of completions that was returned by the program * Add support for PowerShell 7.2+ (spf13#1916) PowerShell 7.2 has changed the way arguments are passed to executables. This was originally an experimental feature in 7.2, but as of 7.3 it is built-in. A simple "" is now sufficient for passing empty arguments, no back-tick escaping is required. Fixes spf13#1849 Signed-off-by: Oldřich Jedlička <oldium.pro@gmail.com> Co-authored-by: Oldřich Jedlička <oldrich.jedlicka@rohlik.cz> * ci: deprecate go 1.16 (spf13#1926) * ci: test Golang 1.20 (spf13#1925) * update copyright year (spf13#1927) * Update projects_using_cobra.md (spf13#1932) Signed-off-by: Florent Poinsard <florent.poinsard@outlook.fr> * Document suggested layout for subcommands (spf13#1930) Signed-off-by: Luiz Carvalho <lucarval@redhat.com> * Allow sourcing zsh completion script (spf13#1917) Although it is not the recommended approach, sourcing a completion script is the simplest way to get people to try using shell completion. Not allowing it for zsh has turned out to complicate shell completion adoption. Further, many tools modify the zsh script to allow sourcing. This commit allows sourcing of the zsh completion script. Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com> * Update main image to better handle dark background (spf13#1883) Fixes spf13#1880 Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com> Co-authored-by: Deleplace <deleplace2015@gmail.com> * Fix typo in fish completions (spf13#1945) * build(deps): bump golangci/golangci-lint-action from 3.4.0 to 3.5.0 (spf13#1971) * Fix grammar: 'allows to' (spf13#1978) The use in generated bash completion files is getting flagged by Lintian (the Debian package linting tool). Signed-off-by: Taavi Väänänen <hi@taavi.wtf> * test: make fish_completions_test more robust (spf13#1980) Use temporary files instead of assuming the current directory is writable. Also, if creating a temporary file still returns an error, prevent the test from failing silently by replacing `log.Fatal` with `t.Fatal`. * powershell: escape variable with curly brackets (spf13#1960) This fixes an issue with program names that include a dot, in our case `podman.exe`. This was caused by the change in commit 6ba7ebb. Fixes spf13#1853 Signed-off-by: Paul Holzinger <pholzing@redhat.com> * build(deps): bump golangci/golangci-lint-action from 3.5.0 to 3.6.0 (spf13#1976) * Move documentation sources to site/content (spf13#1428) * Add 'one required flag' group (spf13#1952) * golangci: enable 'unused' and disable deprecated replaced by it (spf13#1983) * doc: fix typo, Deperecated -> Deprecated (spf13#2000) * minor corrections to unit tests (spf13#2003) * build(deps): bump golangci/golangci-lint-action from 3.6.0 to 3.7.0 (spf13#2021) * command: temporarily disable G602 due to securego/gosec#1005 (spf13#2022) * ci: test golang 1.21 (spf13#2024) * Customizable error message prefix (spf13#2023) * feat: add getters for flag completions (spf13#1943) * Add notes to doc on preRun and postRun condition (spf13#2041) * build(deps): bump actions/setup-go from 3 to 4 (spf13#1934) * build(deps): bump github.com/cpuguy83/go-md2man/v2 from 2.0.2 to 2.0.3 (spf13#2047) * Allow running persistent run hooks of all parents (spf13#2044) Currently, only one of the persistent pre-runs and post-runs is executed. It is always the first one found in the parents chain, starting at this command. Expected behavior is to execute all parents' persistent pre-runs and post-runs. Dependent projects implemented various workarounds for this: - manually building persistent hook chains (in every hook). - applying some kind of monkey-patching on top of Cobra. This change eliminates the necessity for such workarounds by allowing to set a global variable EnableTraverseRunHooks. Tickets: - spf13#216 - spf13#252 Signed-off-by: Volodymyr Khoroz <volodymyr.khoroz@foundries.io> * Fix linter errors (spf13#2052) When using golangci-lint v1.55.0 some new errors were being reported. Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com> * Don't complete --help flag when flag parsing disabled (spf13#2061) Fixes spf13#2060 When a command sets `DisableFlagParsing = true` it requests the responsibility of doing all the flag parsing. Therefore even the `--help/-f/--version/-v` flags should not be automatically completed by Cobra in such a case. Without this change the `--help/-h/--version/-v` flags can end up being completed twice for plugins: one time from cobra and one time from the plugin (which has set `DisableFlagParsing = true`). Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com> * Add tests for flag completion registration (spf13#2053) Different problems have been reported about flag completion registration. These two tests are the cases that were not being verified but had been mentioned as problematic. Ref: - spf13#1320 - spf13#1438 (comment) Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com> * Replace all non-alphanumerics in active help env var program prefix (spf13#1940) * Replace all non-alphanumerics in active help env var program prefix There are other characters besides the dash that are fine in program names, but are problematic in environment variable names. These include (but are not limited to) period, space, and non-ASCII letters. * Another change in docs to mention non-ASCII-alphanumeric instead of just dash * build(deps): bump actions/checkout from 3 to 4 (spf13#2028) * Support usage as plugin for tools like kubectl (spf13#2018) In this case the executable is `kubectl-plugin`, but we run it as: kubectl plugin And the help text should reflect the actual usage of the command. To create a plugin, add the cobra.CommandDisplayNameAnnotation: rootCmd := &cobra.Command{ Use: "plugin", Annotations: map[string]string{ cobra.CommandDisplayNameAnnotation: "kubectl plugin", } } Internally this change modifies CommandPath() for the root command to return the command display name instead of the command name. This is used for error messages, help text generation, and completions. CommandPath() is expected to have spaces and code using it already handle spaces (e.g replacing with _), so hopefully this does not break anything. Fixes: spf13#2017 Signed-off-by: Nir Soffer <nsoffer@redhat.com> * Improve API to get flag completion function (spf13#2063) The new API is simpler and matches the `c.RegisterFlagCompletionFunc()` API. By removing the global function `GetFlagCompletion()` we are more future proof if we ever move from a global map of flag completion functions to something associated with the command. The commit also makes this API work with persistent flags by using `c.Flag(flagName)` instead of `c.Flags().Lookup(flagName)`. The commit also adds unit tests. Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com> * feat: expose GetCompletions (was getCompletions) --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: David Wertenteil <dwertent@armosec.io> Signed-off-by: John McBride <jpmmcbride@gmail.com> Signed-off-by: Oldřich Jedlička <oldium.pro@gmail.com> Signed-off-by: Florent Poinsard <florent.poinsard@outlook.fr> Signed-off-by: Luiz Carvalho <lucarval@redhat.com> Signed-off-by: Marc Khouzam <marc.khouzam@gmail.com> Signed-off-by: Taavi Väänänen <hi@taavi.wtf> Signed-off-by: Paul Holzinger <pholzing@redhat.com> Signed-off-by: Volodymyr Khoroz <volodymyr.khoroz@foundries.io> Signed-off-by: Nir Soffer <nsoffer@redhat.com> Co-authored-by: Brian Pursley <bpursley@cinlogic.com> Co-authored-by: Enrico Candino <enrico.candino@gmail.com> Co-authored-by: Norman Dankert <norman.dankert@outlook.com> Co-authored-by: Unai Martinez-Corral <38422348+umarcor@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: David Wertenteil <dwertent@armosec.io> Co-authored-by: Yash Ladha <18033231+yashLadha@users.noreply.github.com> Co-authored-by: Seonghyeon Cho <seonghyeoncho96@gmail.com> Co-authored-by: Dominik Roos <domi.roos@gmail.com> Co-authored-by: Shihta Kuan <Shihta@users.noreply.github.com> Co-authored-by: janhn <jan@hnatek.eu> Co-authored-by: Ggg6542 <465806+gusega@users.noreply.github.com> Co-authored-by: John McBride <jpmmcbride@gmail.com> Co-authored-by: Gyanendra Mishra <anomaly.the@gmail.com> Co-authored-by: Oldřich Jedlička <oldium@users.noreply.github.com> Co-authored-by: Oldřich Jedlička <oldrich.jedlicka@rohlik.cz> Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com> Co-authored-by: Luiz Carvalho <luizcarvalho85@gmail.com> Co-authored-by: Marc Khouzam <marc.khouzam@gmail.com> Co-authored-by: Deleplace <deleplace2015@gmail.com> Co-authored-by: Tom Payne <tom.payne@flarm.com> Co-authored-by: Taavi Väänänen <hi@taavi.wtf> Co-authored-by: Branch Vincent <branchevincent@gmail.com> Co-authored-by: Paul Holzinger <45212748+Luap99@users.noreply.github.com> Co-authored-by: Martijn Evers <94963229+marevers@users.noreply.github.com> Co-authored-by: gocurr <xigua67damn@gmail.com> Co-authored-by: Jun Nishimura <n.junjun0303@gmail.com> Co-authored-by: Nuno Adrego <55922671+nunoadrego@users.noreply.github.com> Co-authored-by: Souma <101255979+5ouma@users.noreply.github.com> Co-authored-by: Alexandru-Claudius Virtopeanu <alexandru-claudius.virtopeanu@ionos.com> Co-authored-by: Haoming Meng <41393704+Techming@users.noreply.github.com> Co-authored-by: vkhoroz <vkhoroz@users.noreply.github.com> Co-authored-by: Ville Skyttä <ville.skytta@upcloud.com> Co-authored-by: Nir Soffer <nirsof@gmail.com> Co-authored-by: Geoffrey Ragot <geoffrey.ragot@gmail.com>
The flag completion functions should not be stored in the root cmd.
There is no requirement that the root cmd should be the same when
RegisterFlagCompletionFunc
was called. Storing the flags there doesnot work when you add the the flags to your cmd struct before you add the
cmd to the parent/root cmd. The flags can no longer be found in the rigth
place when the completion command is called and thus the flag completion
does not work.
Also #1423 claims that this would be thread safe but we still have a map
which will fail when accessed concurrently. To truly fix this issue use a
RWMutex.
Fixes #1437
Fixes #1320