Skip to content
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

Add ability to mark flags as required or exclusive as a group #1654

Merged
merged 1 commit into from Apr 17, 2022

Conversation

johnSchnake
Copy link
Collaborator

@johnSchnake johnSchnake commented Apr 3, 2022

This change adds two features for dealing with flags:

  • requiring flags be provided as a group (or not at all)
  • requiring flags be mutually exclusive of each other

By utilizing the flag annotations we can mark which flag groups
a flag is a part of and during the parsing process we track which
ones we have seen or not.

A flag may be a part of multiple groups. The list of flags and the
type of group (required together or exclusive) make it a unique group.

Fixes #1654
Fixes #1595
Fixes #1238

Signed-off-by: John Schnake jschnake@vmware.com

@github-actions github-actions bot added the size/XL Denotes a PR that exceeds 200 lines. Caution! label Apr 3, 2022
@github-actions
Copy link

github-actions bot commented Apr 3, 2022

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@johnSchnake
Copy link
Collaborator Author

When doing the review of the backlog this feature came up a few times and I have personally wanted to do this as well in my other projects so I thought I would put something up.

I utilize the flag annotations which up to this point had just been used for shell completions. This doesn't interact with the shell completions at all but is just validation logic. I don't know if that is a hard stop for someone, but I thought I'd put this up and see.

I'll have to lookup the issues that this would impact (don't have them handy right now) but wanted it put up for 👀 . There is surely some cleanup that could occur as well, feel free to comment. I just wanted to make sure it had functioning logic and tests to make it clear how it looked in its current state.

@github-actions
Copy link

github-actions bot commented Apr 3, 2022

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@marckhouzam marckhouzam added kind/feature A feature request for cobra; new or enhanced behavior area/flags-args Changes to functionality around command line flags and args labels Apr 3, 2022
@github-actions
Copy link

github-actions bot commented Apr 4, 2022

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@johnSchnake
Copy link
Collaborator Author

The 200 line "suggested max" is exceeded but it includes tests and a new file (so a new file/license header). Regardless, I also think there is a bit of code I can compact.

@github-actions
Copy link

github-actions bot commented Apr 4, 2022

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@johnSchnake
Copy link
Collaborator Author

Pulling some common code out caused some reduction in LOC but then continuing to extract logic into functions for easier reading caused some increase. Not worrying about the LOC unless others think it is a problem. I think the new arrangement of code is easier to understand.

flag_groups.go Outdated
Comment on lines 25 to 26
RequiredAsGroup = "cobra_annotation_required_if_others_set"
MutuallyExclusive = "cobra_annotation_mutually_exclusive"
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 new annotations. No utilization for completion, but only for validation.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like that. I think it is just fine to use the annotations field of a flag for anything we need (even if there are pflag comments saying Annotations are used for completions...)

However, do we need them public? Based on the proposed solution, I don't expect users to access the annotation directly, right?

flag_groups.go Outdated
continue
}
sort.Strings(unset)
errs = append(errs, fmt.Errorf("if any flags in the group [%v] are set they must all be set; missing %v", flagList, unset))
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Definitely open to verbage changes if someone wants to suggest anything. Pointing out the first [%v] I manually add the brackets since the flagList is just a string even though it is of the form flagA flagB flagC.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The wording seems ok to me. I'm just a little unsure about the format when multiple errors are concatenated together. For example:

./prog child --automatic yes --destination a --fast-deploy fish --effective a                                                       <k8s-lab>
Error: if any flags in the group [automatic best certificate] are set they must all be set; missing [best certificate], if any flags in the group [destination fast-deploy] are set none of the others can be; [destination fast-deploy] were all set
Usage:
  prog child [flags]

Flags:
[..]

Should the error messages be separated by a newline character?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A newline would work for me; I also didnt like the format but tried to follow the general Go guidance of not using capital letters or ending punctuation.

So you'd prefer something like :

Error: if any flags in the group [automatic best certificate] are set they must all be set; missing [best certificate]
if any flags in the group [destination fast-deploy] are set none of the others can be; [destination fast-deploy] were all set

Usage:...

I could also try and make it so that it makes it like a bulleted list? They are long errors so it doesnt flow particularly great if you have multiples:

Error: 
 - if any flags in the group [automatic best certificate] are set they must all be set; missing [best certificate]
 - if any flags in the group [destination fast-deploy] are set none of the others can be; [destination fast-deploy] were all set

Usage:...

I think the latter looks the best for and end user on the CLI and is just a tiny bit more verbose to implement. What do you think?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you have to return all errors? The normal flag parsing code only returns the first error it encounters. This should simplify the code and make the errors smaller and thus better readable.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you have to return all errors? The normal flag parsing code only returns the first error it encounters. This should simplify the code and make the errors smaller and thus better readable.

I guess it was to avoid a user having to fix one error at a time, if there were multiple errors?
I see value in both approaches personally, so I'll defer to what you guys settle on.

That being said, the current code is missing the first newline when there are multiple errors:

Error: - if any flags in the group [automatic best certificate] are set they must all be set; missing [best certificate]
- if any flags in the group [destination fast-deploy] are set none of the others can be; [destination fast-deploy] were all set

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm definitely fine with the simplification. Not sure why I defaulted to that originally, I sometimes use both. Making the simplification avoids that problem all together and since its just at invocation time and feedback is fast I dont think its a problem if they have to tweak it a few times and keep finding 'new' problems.

@marckhouzam
Copy link
Collaborator

marckhouzam commented Apr 4, 2022

Nice improvement @johnSchnake! I'm interested in having a more detailed look soon.
We will probably want to update the documentation to tell users how they can use the feature.

@marckhouzam
Copy link
Collaborator

What should we do about persistent flags for this feature? Can they be part of groups for example?

@johnSchnake
Copy link
Collaborator Author

Thanks for the call on persistent flags. I'll double check how they're handled. I know there were some other existing issues about them not getting merged in certain validations. My assumption should be merged prior to this and valid for use with this feature. I'll make sure tests cover that.

@github-actions
Copy link

github-actions bot commented Apr 5, 2022

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@github-actions
Copy link

github-actions bot commented Apr 5, 2022

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

1 similar comment
@github-actions
Copy link

github-actions bot commented Apr 7, 2022

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@johnSchnake
Copy link
Collaborator Author

Updated docs so that didnt slow things down later if this gets 👍

@Luap99
Copy link
Contributor

Luap99 commented Apr 7, 2022

Not a proper review but we should try to add the mutually exclusive logic to the shell completion logic, i. e.
if I have mutually exclusive flags foo and bar the shell completion logic should no longer recommend --bar when --foo is already present on the cli.

@johnSchnake
Copy link
Collaborator Author

@Luap99 I have no idea regarding shell completions. Could that potentially go in a as a separate PR from someone who has context on that? That seems reasonable to me since it isn't obvious that devs with 1 piece of context will have the other and shell completion is just a convenience feature and not something necessary for the functionality.

I have no problem creating an issue to track it as I've pointed out that shortcoming myself too.

Copy link
Collaborator

@marckhouzam marckhouzam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is pretty cool! I think it is a nice improvement for our users. Nice job @johnSchnake .
I've added some suggestions in-line for your consideration.

I'll have a look at the completion logic in the mean time.

flag_groups.go Outdated Show resolved Hide resolved
flag_groups.go Show resolved Hide resolved
flag_groups.go Outdated
Comment on lines 25 to 26
RequiredAsGroup = "cobra_annotation_required_if_others_set"
MutuallyExclusive = "cobra_annotation_mutually_exclusive"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like that. I think it is just fine to use the annotations field of a flag for anything we need (even if there are pflag comments saying Annotations are used for completions...)

However, do we need them public? Based on the proposed solution, I don't expect users to access the annotation directly, right?

flag_groups.go Outdated Show resolved Hide resolved
flag_groups.go Outdated Show resolved Hide resolved
flag_groups.go Outdated Show resolved Hide resolved
user_guide.md Outdated Show resolved Hide resolved
user_guide.md Outdated Show resolved Hide resolved
flag_groups.go Show resolved Hide resolved
flag_groups.go Outdated
continue
}
sort.Strings(unset)
errs = append(errs, fmt.Errorf("if any flags in the group [%v] are set they must all be set; missing %v", flagList, unset))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The wording seems ok to me. I'm just a little unsure about the format when multiple errors are concatenated together. For example:

./prog child --automatic yes --destination a --fast-deploy fish --effective a                                                       <k8s-lab>
Error: if any flags in the group [automatic best certificate] are set they must all be set; missing [best certificate], if any flags in the group [destination fast-deploy] are set none of the others can be; [destination fast-deploy] were all set
Usage:
  prog child [flags]

Flags:
[..]

Should the error messages be separated by a newline character?

@github-actions
Copy link

github-actions bot commented Apr 9, 2022

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@Luap99
Copy link
Contributor

Luap99 commented Apr 9, 2022

@Luap99 I have no idea regarding shell completions. Could that potentially go in a as a separate PR from someone who has context on that? That seems reasonable to me since it isn't obvious that devs with 1 piece of context will have the other and shell completion is just a convenience feature and not something necessary for the functionality.

I have no problem creating an issue to track it as I've pointed out that shortcoming myself too.

Creating an issue to track this would be great. Maybe I can find some time to work on this.

@marckhouzam
Copy link
Collaborator

@Luap99 I have no idea regarding shell completions. Could that potentially go in a as a separate PR from someone who has context on that? That seems reasonable to me since it isn't obvious that devs with 1 piece of context will have the other and shell completion is just a convenience feature and not something necessary for the functionality.
I have no problem creating an issue to track it as I've pointed out that shortcoming myself too.

Creating an issue to track this would be great. Maybe I can find some time to work on this.

I coded something last night but I didn't know how to share it. Sorry @Luap99 .
I guess I can create a PR on top of this one. It's just that I don't like that it will contain the changes of this PR as well...
If there is a better way to do such things, I'd love to know.

Copy link
Collaborator

@marckhouzam marckhouzam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is good for me once the linter and format errors are fixed.

@github-actions
Copy link

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@johnSchnake
Copy link
Collaborator Author

All green; going to squash down to 1 commit

@github-actions
Copy link

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

Copy link
Collaborator

@marckhouzam marckhouzam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was all ready to approve but I did one last testing pass and I hit something I hadn't noticed before.

Say I have a root command with a persistent --debug flag, and a child command with a --details flag. Then the child marks both flags as required together. I noticed that I can no longer call the root command with the --debug flag as it requires the --details flag, but that flag does not exist on the root.

Here's a test program:

package main

import (
	"fmt"

	"github.com/spf13/cobra"
)

var (
	debug   bool
	details bool
)

var rootCmd = &cobra.Command{
	Use: "prog",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("rootCmd called")
	},
}

var logCmd = &cobra.Command{
	Use: "log",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("child called")
	},
}

func main() {
	rootCmd.AddCommand(logCmd)

	rootCmd.PersistentFlags().BoolVar(&debug, "debug", false, "debug")
	logCmd.Flags().BoolVarP(&details, "details", "d", false, "details")

	logCmd.MarkFlagsRequiredTogether("details", "debug")

	rootCmd.Execute()
}

then I run this:

$ go build -o prog groupFlag.go
$ ./prog --debug
Error: if any flags in the group [details debug] are set they must all be set; missing [details]
[...]
# The root command wants the flag group although it was the child command that created it

$ ./prog --debug --details
Error: unknown flag: --details
[...]

It's hard for me to judge if this is a valid scenario, but it seems like it is plausible, no?

I haven't looked into the logic causing this.

@marckhouzam
Copy link
Collaborator

That last test I ran made me think of a situation that is not covered by the PR. Maybe it's not important and we simply won't support it, I just wanted to mention it to get your opinion.

Let's use an example to describe the use case. Say I have a --user flag and a --password flag used to login to a system. But say I am allowed to use the --user flag by itself, but not the --password flag. So, if the user types --password the --user flag is required but not vice versa.

Any thoughts on this @johnSchnake ?

@johnSchnake
Copy link
Collaborator Author

Let's use an example to describe the use case. Say I have a --user flag and a --password flag used to login to a system. But say I am allowed to use the --user flag by itself, but not the --password flag. So, if the user types --password the --user flag is required but not vice versa.

@marckhouzam that is an interesting use case. I do think thats a more narrow use-case so I don't mind leaving that off (users can still manually implement it as they would today); the only alternative would be to do one of two things it seems:

  • redefine all of this in terms of per-flag triggers: if flag X is defined, then this separate list is required/exclusive. This would mean if a flag group has 3 elements you'd have to define 3 flag groups to reproduce the behavior we have in this. I think this is a much less intuitive and more verbose way to implement the feature for end users.
  • Alternatively, you could keep this as-is and add the above functionality as a separate feature. In that case it wouldn't impact this PR necessarily and I think we should wait to see if people actually complain/request that specific feature. Otherwise we risk adding unnecessary features/functions into the library, clouding the more useful, requested ones.

@marckhouzam
Copy link
Collaborator

  • Alternatively, you could keep this as-is and add the above functionality as a separate feature. In that case it wouldn't impact this PR necessarily and I think we should wait to see if people actually complain/request that specific feature. Otherwise we risk adding unnecessary features/functions into the library, clouding the more useful, requested ones.

Sounds like a good approach to me.

@johnSchnake
Copy link
Collaborator Author

Is this still good to go or did I miss a separate concern?

@marckhouzam
Copy link
Collaborator

I think we have an inconsistency when dealing with persistent flags. I tried to describe it in the comment above: #1654 (review)

Maybe we made thing overly complex by supporting persistent flags? If the feature does not really need to support them, I'd be ok with documenting that persistent flags should not be part of groups. It depends on how you imagine the feature being use @johnSchnake.

@johnSchnake
Copy link
Collaborator Author

johnSchnake commented Apr 13, 2022

My thoughts on this:

  • when marking the flags as a part of a group, we ensure the flags do exist in the context they're being defined (e.g. on the logCmd in your example); so erroring like the code did is the worst outcome
  • when actually checking flag groups we start with, potentially, another command (e.g. rootCmd) where only a subset of those flags may exist (the persistent one). Either the flag should be ignored or the entire flag group.

I lean towards modifying the code so that the entire flag group is ignored if not every flag is found. That seems to be the easiest mental model to understand, is easily written into the documentation, and still facilitates the the use case you showed.

Documentation will just be updated to reflect something like:

If persistent and local flags are in flag groups together, the group will not be enforced on commands which do not have all the relevant flags defined.

@github-actions
Copy link

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

Copy link
Collaborator

@marckhouzam marckhouzam left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!
LGTM

@jpmcb are you ok with this new feature? If we don't hear from @jpmcb by Friday afternoon, and since both @johnSchnake and I approved, I suggest @johnSchnake go ahead and merge.

@marckhouzam marckhouzam added this to the 1.5.0 milestone Apr 14, 2022
@marckhouzam marckhouzam added the lgtm Denotes "looks good to me" from maintainers and signals other collaboratores that a PR is ready label Apr 14, 2022
@johnSchnake
Copy link
Collaborator Author

Just squashing preemptively. No other changes on this next push, just FYI

This change adds two features for dealing with flags:
 - requiring flags be provided as a group (or not at all)
 - requiring flags be mutually exclusive of each other

By utilizing the flag annotations we can mark which flag groups
a flag is a part of and during the parsing process we track which
ones we have seen or not.

A flag may be a part of multiple groups. The list of flags and the
type of group (required together or exclusive) make it a unique group.

Signed-off-by: John Schnake <jschnake@vmware.com>
@github-actions
Copy link

This PR exceeds the recommended size of 200 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@johnSchnake johnSchnake merged commit 68b6b24 into spf13:master Apr 17, 2022
@johnSchnake johnSchnake deleted the flagGroups branch April 17, 2022 21:05
gcf-merge-on-green bot pushed a commit to googleapis/gapic-showcase that referenced this pull request Jun 27, 2022
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/spf13/cobra](https://togithub.com/spf13/cobra) | require | minor | `v1.4.0` -> `v1.5.0` |

---

### Release Notes

<details>
<summary>spf13/cobra</summary>

### [`v1.5.0`](https://togithub.com/spf13/cobra/releases/tag/v1.5.0)

[Compare Source](https://togithub.com/spf13/cobra/compare/v1.4.0...v1.5.0)

#### Spring 2022 Release 🌥️

Hello everyone! Welcome to another release of cobra. Completions continue to get better and better. This release adds a few really cool new features. We also continue to patch versions of our dependencies as they become available via dependabot. Happy coding!

#### Active help 👐🏼

Shout out to [@&#8203;marckhouzam](https://togithub.com/marckhouzam) for a big value add: Active Help [spf13/cobra#1482. With active help, a program can provide some inline warnings or hints for users as they hit tab. Now, your CLIs can be even more intuitive to use!

Currently active help is only supported for bash V2 and zsh. Marc wrote a whole guide on how to do this, so make sure to give it a good read to learn how you can add this to your cobra code! https://github.com/spf13/cobra/blob/master/active_help.md

#### Group flags 🧑🏼‍🤝‍🧑🏼

Cobra now has the ability to mark flags as required or exclusive as a ***group***. Shout out to our newest maintainer [@&#8203;johnSchnake](https://togithub.com/johnSchnake) for this! [spf13/cobra#1654 Let's say you have a `username` flag that ***MUST*** be partnered with a `password` flag. Well, now, you can enforce those as being required together:

```go
rootCmd.Flags().StringVarP(&u, "username", "u", "", "Username (required if password is set)")
rootCmd.Flags().StringVarP(&pw, "password", "p", "", "Password (required if username is set)")
rootCmd.MarkFlagsRequiredTogether("username", "password")
```

Flags may also be marked as "mutally exclusive" with the `MarkFlagsMutuallyExclusive(string, string ... )` command API. Refer to our [user guide documentation](https://togithub.com/spf13/cobra/blob/master/user_guide.md) for further info!

#### Completions 👀

-   Add backwards-compatibility tests for legacyArgs() by [@&#8203;marckhouzam](https://togithub.com/marckhouzam) in [spf13/cobra#1547
-   feat: Add how to load completions in your current zsh session by [@&#8203;ondrejsika](https://togithub.com/ondrejsika) in [spf13/cobra#1608
-   Introduce FixedCompletions by [@&#8203;emersion](https://togithub.com/emersion) in [spf13/cobra#1574
-   Add shell completion to flag groups by [@&#8203;marckhouzam](https://togithub.com/marckhouzam) in [spf13/cobra#1659
-   Modify brew prefix path in macOS system by [@&#8203;imxw](https://togithub.com/imxw) in [spf13/cobra#1719
-   perf(bash-v2): use backslash escape string expansion for tab by [@&#8203;scop](https://togithub.com/scop) in [spf13/cobra#1682
-   style(bash-v2): out is not an array variable, do not refer to it as such by [@&#8203;scop](https://togithub.com/scop) in [spf13/cobra#1681
-   perf(bash-v2): standard completion optimizations by [@&#8203;scop](https://togithub.com/scop) in [spf13/cobra#1683
-   style(bash): out is not an array variable, do not refer to it as such by [@&#8203;scop](https://togithub.com/scop) in [spf13/cobra#1684
-   perf(bash-v2): short-circuit descriptionless candidate lists by [@&#8203;scop](https://togithub.com/scop) in [spf13/cobra#1686
-   perf(bash-v2): speed up filtering entries with descriptions by [@&#8203;scop](https://togithub.com/scop) in [spf13/cobra#1689
-   perf(bash-v2): speed up filtering menu-complete descriptions by [@&#8203;scop](https://togithub.com/scop) in [spf13/cobra#1692
-   fix(bash-v2): skip empty completions when filtering descriptions by [@&#8203;scop](https://togithub.com/scop) in [spf13/cobra#1691
-   perf(bash-v2): read directly to COMPREPLY on descriptionless short circuit by [@&#8203;scop](https://togithub.com/scop) in [spf13/cobra#1700
-   fix: Don't complete \_command on zsh by [@&#8203;twpayne](https://togithub.com/twpayne) in [spf13/cobra#1690
-   Improve fish_completions code quality by [@&#8203;t29kida](https://togithub.com/t29kida) in [spf13/cobra#1515
-   Fix handling of descriptions for bash v3 by [@&#8203;marckhouzam](https://togithub.com/marckhouzam) in [spf13/cobra#1735
-   undefined or nil Args default to ArbitraryArgs by [@&#8203;umarcor](https://togithub.com/umarcor) in [spf13/cobra#1612
-   Add Command.SetContext by [@&#8203;joshcarp](https://togithub.com/joshcarp) in [spf13/cobra#1551
-   Wrap printf tab with quotes by [@&#8203;PapaCharlie](https://togithub.com/PapaCharlie) in [spf13/cobra#1665

#### Documentation 📝

-   Fixed typos in completions docs - [@&#8203;cuishuang](https://togithub.com/cuishuang) [spf13/cobra#1625
-   Removed `CHANGELOG.md` as it isn't updated - [@&#8203;johnSchnake](https://togithub.com/johnSchnake) [spf13/cobra#1634
-   Minor typo fix in `shell_completion.md` - [@&#8203;danieldn](https://togithub.com/danieldn) [spf13/cobra#1678
-   Changed branch name in the cobra generator link to 'main' - [@&#8203;skywalker2909](https://togithub.com/skywalker2909) [spf13/cobra#1645
-   Fix Command.Context comment by [@&#8203;katexochen](https://togithub.com/katexochen) in [spf13/cobra#1639
-   Change appropriate links from http:// to https:// where applicable - [@&#8203;deining](https://togithub.com/deining) [spf13/cobra#1695

#### Testing & CI ⚙️

-   Test on Golang 1.18 - [@&#8203;umarcor](https://togithub.com/umarcor) [spf13/cobra#1635
-   Use `RICHGO_FORCE_COLOR` - [@&#8203;umarcor](https://togithub.com/umarcor) [spf13/cobra#1647
-   Adds size labeler GitHub action by [@&#8203;jpmcb](https://togithub.com/jpmcb) in [spf13/cobra#1610
-   Update `stale-bot` settings - [@&#8203;jpmcb](https://togithub.com/jpmcb) [spf13/cobra#1609

#### Beep boop, bot commits 🤖

-   Bumped golangci/golangci-lint-action from 3.1.0 to 3.2.0 - [@&#8203;dependabot](https://togithub.com/dependabot) [spf13/cobra#1697
-   Bump codelytv/pr-size-labeler from 1.8.0 to 1.8.1 - [@&#8203;dependabot](https://togithub.com/dependabot) [spf13/cobra#1661
-   Bump actions/stale from 1 to 5 by [@&#8203;dependabot](https://togithub.com/dependabot) in [spf13/cobra#1618
-   Bump actions/cache from 2 to 3 by [@&#8203;dependabot](https://togithub.com/dependabot) in [spf13/cobra#1640
-   Bump actions/labeler from 3 to 4 by [@&#8203;dependabot](https://togithub.com/dependabot) in [spf13/cobra#1620
-   Bump golangci/golangci-lint-action from 2 to 3.1.0 by [@&#8203;dependabot](https://togithub.com/dependabot) in [spf13/cobra#1615
-   Bump actions/checkout from 2 to 3 by [@&#8203;dependabot](https://togithub.com/dependabot) in [spf13/cobra#1619
-   Bump github.com/cpuguy83/go-md2man/v2 from 2.0.1 to 2.0.2 by [@&#8203;dependabot](https://togithub.com/dependabot) in [spf13/cobra#1688
-   Bump actions/setup-go from 2 to 3 by [@&#8203;dependabot](https://togithub.com/dependabot) in [spf13/cobra#1660

#### Misc 💭

-   Use `errors.Is()` to check for errors - [@&#8203;Luap99](https://togithub.com/Luap99) [spf13/cobra#1730
-   Prefer ReplaceAll instead of Replace(..., -1) by [@&#8203;WhyNotHugo](https://togithub.com/WhyNotHugo) in [spf13/cobra#1530
-   Add Kubescape to projects - [@&#8203;avinashupadhya99](https://togithub.com/avinashupadhya99) [spf13/cobra#1642
-   Add Pulumi as a project using cobra by [@&#8203;iwahbe](https://togithub.com/iwahbe) in [spf13/cobra#1720
-   Add Polygon Edge as a project using Cobra by [@&#8203;zivkovicmilos](https://togithub.com/zivkovicmilos) in [spf13/cobra#1672

Shoutout to *ALL* our contributors (and all the new first time contributors!!) - great work everyone!! Cobra and it's huge impact wouldn't be possible without you 👏🏼  🚀  🐍

**Full Changelog**: spf13/cobra@v1.4.0...v1.5.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click this checkbox.

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/gapic-showcase).
@Dentrax
Copy link

Dentrax commented Jul 4, 2022

Also fixes #1385

ti-chi-bot bot pushed a commit to PingCAP-QE/ee-apps that referenced this pull request Dec 9, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [github.com/spf13/cobra](https://togithub.com/spf13/cobra) | require |
minor | `v1.1.3` -> `v1.8.0` |

---

### Release Notes

<details>
<summary>spf13/cobra (github.com/spf13/cobra)</summary>

### [`v1.8.0`](https://togithub.com/spf13/cobra/releases/tag/v1.8.0)

[Compare
Source](https://togithub.com/spf13/cobra/compare/v1.7.0...v1.8.0)

#### ✨ Features

- Support usage as plugin for tools like kubectl by
[@&#8203;nirs](https://togithub.com/nirs) in
[spf13/cobra#2018
- this means that programs that utilize a "plugin-like" structure have
much better support and usage (like for completions, command paths,
etc.)
- Move documentation sources to site/content by
[@&#8203;umarcor](https://togithub.com/umarcor) in
[spf13/cobra#1428
- Add 'one required flag' group by
[@&#8203;marevers](https://togithub.com/marevers) in
[spf13/cobra#1952
- this includes a new `MarkFlagsOneRequired` API for flags which can be
used to mark a flag group as required and cause command failure if at
least one is not used when invoked.
- Customizable error message prefix by
[@&#8203;5ouma](https://togithub.com/5ouma) in
[spf13/cobra#2023
- This adds the `SetErrPrefix` and `ErrPrefix` APIs on the `Command`
struct to allow for setting a custom prefix for errors
- feat: add getters for flag completions by
[@&#8203;avirtopeanu-ionos](https://togithub.com/avirtopeanu-ionos) in
[spf13/cobra#1943
- Feature: allow running persistent run hooks of all parents by
[@&#8203;vkhoroz](https://togithub.com/vkhoroz) in
[spf13/cobra#2044
- Improve API to get flag completion function by
[@&#8203;marckhouzam](https://togithub.com/marckhouzam) in
[spf13/cobra#2063

#### 🐛 Bug fixes

- Fix typo in fish completions by
[@&#8203;twpayne](https://togithub.com/twpayne) in
[spf13/cobra#1945
- Fix grammar: 'allows to' by
[@&#8203;supertassu](https://togithub.com/supertassu) in
[spf13/cobra#1978
- powershell: escape variable with curly brackets by
[@&#8203;Luap99](https://togithub.com/Luap99) in
[spf13/cobra#1960
- Don't complete --help flag when flag parsing disabled by
[@&#8203;marckhouzam](https://togithub.com/marckhouzam) in
[spf13/cobra#2061
- Replace all non-alphanumerics in active help env var program prefix by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1940

#### 🔧 Maintenance

- build(deps): bump golangci/golangci-lint-action from 3.4.0 to 3.5.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1971
- build(deps): bump golangci/golangci-lint-action from 3.5.0 to 3.6.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1976
- build(deps): bump golangci/golangci-lint-action from 3.6.0 to 3.7.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#2021
- build(deps): bump actions/setup-go from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1934
- build(deps): bump github.com/cpuguy83/go-md2man/v2 from 2.0.2 to 2.0.3
by [@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#2047
- build(deps): bump actions/checkout from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#2028
- command: temporarily disable G602 due to
[securego/gosec#1005](https://togithub.com/securego/gosec/issues/1005)
by [@&#8203;umarcor](https://togithub.com/umarcor) in
[spf13/cobra#2022

#### 🧪 Testing & CI/CD

- test: make fish_completions_test more robust by
[@&#8203;branchvincent](https://togithub.com/branchvincent) in
[spf13/cobra#1980
- golangci: enable 'unused' and disable deprecated replaced by it by
[@&#8203;umarcor](https://togithub.com/umarcor) in
[spf13/cobra#1983
- cleanup: minor corrections to unit tests by
[@&#8203;JunNishimura](https://togithub.com/JunNishimura) in
[spf13/cobra#2003
- ci: test golang 1.21 by
[@&#8203;nunoadrego](https://togithub.com/nunoadrego) in
[spf13/cobra#2024
- Fix linter errors by
[@&#8203;marckhouzam](https://togithub.com/marckhouzam) in
[spf13/cobra#2052
- Add tests for flag completion registration by
[@&#8203;marckhouzam](https://togithub.com/marckhouzam) in
[spf13/cobra#2053

#### ✏️ Documentation

- doc: fix typo, Deperecated -> Deprecated by
[@&#8203;callthingsoff](https://togithub.com/callthingsoff) in
[spf13/cobra#2000
- Add notes to doc about the execution condition of \*PreRun and
\*PostRun functions by
[@&#8203;haoming29](https://togithub.com/haoming29) in
[spf13/cobra#2041

***

Thank you everyone who contributed to this release and all your hard
work! Cobra and this community would never be possible without all of
you!!!! 🐍

**Full Changelog**:
spf13/cobra@v1.7.0...v1.8.0

### [`v1.7.0`](https://togithub.com/spf13/cobra/releases/tag/v1.7.0)

[Compare
Source](https://togithub.com/spf13/cobra/compare/v1.6.1...v1.7.0)

##### ✨ Features

- Allow to preserve ordering of completions in `bash`, `zsh`, `pwsh`, &
`fish`: [@&#8203;h4ck3rk3y](https://togithub.com/h4ck3rk3y)
[#&#8203;1903](https://togithub.com/spf13/cobra/issues/1903)
- Add support for PowerShell 7.2+ in completions:
[@&#8203;oldium](https://togithub.com/oldium)
[#&#8203;1916](https://togithub.com/spf13/cobra/issues/1916)
- Allow sourcing zsh completion script:
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[#&#8203;1917](https://togithub.com/spf13/cobra/issues/1917)

##### 🐛 Bug fixes

- Don't remove flag values that match sub-command name:
[@&#8203;brianpursley](https://togithub.com/brianpursley)
[#&#8203;1781](https://togithub.com/spf13/cobra/issues/1781)
- Fix powershell completions not returning single word:
[@&#8203;totkeks](https://togithub.com/totkeks)
[#&#8203;1850](https://togithub.com/spf13/cobra/issues/1850)
- Remove masked `template` import variable name:
[@&#8203;yashLadha](https://togithub.com/yashLadha)
[#&#8203;1879](https://togithub.com/spf13/cobra/issues/1879)
- Correctly detect completions with dash in argument:
[@&#8203;oncilla](https://togithub.com/oncilla)
[#&#8203;1817](https://togithub.com/spf13/cobra/issues/1817)

##### 🧪 Testing & CI/CD

- Deprecate Go 1.15 in CI:
[@&#8203;umarcor](https://togithub.com/umarcor)
[#&#8203;1866](https://togithub.com/spf13/cobra/issues/1866)
- Deprecate Go 1.16 in CI:
[@&#8203;umarcor](https://togithub.com/umarcor)
[#&#8203;1926](https://togithub.com/spf13/cobra/issues/1926)
- Add testing for Go 1.20 in CI:
[@&#8203;umarcor](https://togithub.com/umarcor)
[#&#8203;1925](https://togithub.com/spf13/cobra/issues/1925)
- Add tests to illustrate unknown flag bug:
[@&#8203;brianpursley](https://togithub.com/brianpursley)
[#&#8203;1854](https://togithub.com/spf13/cobra/issues/1854)

##### 🔧 Maintenance

- Update main image to better handle dark backgrounds:
[@&#8203;Deleplace](https://togithub.com/Deleplace) and
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[#&#8203;1883](https://togithub.com/spf13/cobra/issues/1883)
- Fix `stale.yaml` mispellings:
[@&#8203;enrichman](https://togithub.com/enrichman)
[#&#8203;1863](https://togithub.com/spf13/cobra/issues/1863)
- Remove stale bot from GitHub actions:
[@&#8203;jpmcb](https://togithub.com/jpmcb)
[#&#8203;1908](https://togithub.com/spf13/cobra/issues/1908)
- Add makefile target for installing dependencies:
[@&#8203;umarcor](https://togithub.com/umarcor)
[#&#8203;1865](https://togithub.com/spf13/cobra/issues/1865)
- Add Sia to projects using Cobra:
[@&#8203;mike76-dev](https://togithub.com/mike76-dev)
[#&#8203;1844](https://togithub.com/spf13/cobra/issues/1844)
- Add `Vitess` and `Arewefastyet` to projects using cobra:
[@&#8203;frouioui](https://togithub.com/frouioui)
[#&#8203;1932](https://togithub.com/spf13/cobra/issues/1932)
- Fixup for Kubescape github org:
[@&#8203;dwertent](https://togithub.com/dwertent)
[#&#8203;1874](https://togithub.com/spf13/cobra/issues/1874)
- Fix route for GitHub workflows badge:
[@&#8203;sh-cho](https://togithub.com/sh-cho)
[#&#8203;1884](https://togithub.com/spf13/cobra/issues/1884)
- Fixup for GoDoc style documentation:
[@&#8203;yashLadha](https://togithub.com/yashLadha)
[#&#8203;1885](https://togithub.com/spf13/cobra/issues/1885)
- Various bash scripting improvements for completion:
[@&#8203;scop](https://togithub.com/scop)
[#&#8203;1702](https://togithub.com/spf13/cobra/issues/1702)
- Add Constellation to projects using Cobra:
[@&#8203;datosh](https://togithub.com/datosh)
[#&#8203;1829](https://togithub.com/spf13/cobra/issues/1829)

##### ✏️ Documentation

- Add documentation about disabling completion descriptions:
[@&#8203;Shihta](https://togithub.com/Shihta)
[#&#8203;1901](https://togithub.com/spf13/cobra/issues/1901)
- Improve `MarkFlagsMutuallyExclusive` example in user guide:
[@&#8203;janhn](https://togithub.com/janhn)
[#&#8203;1904](https://togithub.com/spf13/cobra/issues/1904)
- Update `shell_completions.md`:
[@&#8203;gusega](https://togithub.com/gusega)
[#&#8203;1907](https://togithub.com/spf13/cobra/issues/1907)
- Update copywrite year: [@&#8203;umarcor](https://togithub.com/umarcor)
[#&#8203;1927](https://togithub.com/spf13/cobra/issues/1927)
- Document suggested layout of subcommands:
[@&#8203;lcarva](https://togithub.com/lcarva)
[#&#8203;1930](https://togithub.com/spf13/cobra/issues/1930)
- Replace deprecated ExactValidArgs with MatchAll in doc:
[@&#8203;doniacld](https://togithub.com/doniacld)
[#&#8203;1836](https://togithub.com/spf13/cobra/issues/1836)

***

This release contains several long running fixes, improvements to
powershell completions, and further optimizations for completions.

Thank you everyone who contributed to this release and all your hard
work! Cobra and this community would never be possible without all of
you! 🐍

Full changelog:  spf13/cobra@v1.6.1...v1.7.0

### [`v1.6.1`](https://togithub.com/spf13/cobra/releases/tag/v1.6.1)

[Compare
Source](https://togithub.com/spf13/cobra/compare/v1.6.0...v1.6.1)

##### Bug fixes 🐛

- Fixes a panic when `AddGroup` isn't called before
`AddCommand(my-sub-command)` is executed. This can happen within more
complex cobra file structures that have many different `init`s to be
executed. Now, the check for groups has been moved to `ExecuteC` and
provides more flexibility when working with grouped commands -
[@&#8203;marckhouzam](https://togithub.com/marckhouzam) (and shout out
to [@&#8203;aawsome](https://togithub.com/aawsome),
[@&#8203;andig](https://togithub.com/andig) and
[@&#8203;KINGSABRI](https://togithub.com/KINGSABRI) for a deep
investigation into this! 👏🏼)

### [`v1.6.0`](https://togithub.com/spf13/cobra/releases/tag/v1.6.0)

[Compare
Source](https://togithub.com/spf13/cobra/compare/v1.5.0...v1.6.0)

##### Summer 2022 Release

Some exciting changes make their way to Cobra! Command completions
continue to get better and better (including adding `--help` and
`--version` automatic flags to the completions list). Grouping is now
possible in your help output as well! And you can now use the
`OnFinalize` method to cleanup things when all "work" is done. Checkout
the full changelog below:

***

##### Features 🌠

- Add groups for commands in help:
[@&#8203;aawsome](https://togithub.com/aawsome)
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[#&#8203;1003](https://togithub.com/spf13/cobra/issues/1003)
- Support for case-insensitive command names:
[@&#8203;YuviGold](https://togithub.com/YuviGold)
[#&#8203;1802](https://togithub.com/spf13/cobra/issues/1802)
- Expose `ValidateRequiredFlags` and `ValidateFlagGroups`:
[@&#8203;skeetwu](https://togithub.com/skeetwu)
[#&#8203;1760](https://togithub.com/spf13/cobra/issues/1760)
- Add `--version` flag to help output:
[@&#8203;fnickels](https://togithub.com/fnickels)
[#&#8203;1707](https://togithub.com/spf13/cobra/issues/1707)
- Add `--help` and `--version` flag in completions:
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[#&#8203;1813](https://togithub.com/spf13/cobra/issues/1813)
- Add `OnFinalize` method:
[@&#8203;yann-soubeyrand](https://togithub.com/yann-soubeyrand)
[#&#8203;1788](https://togithub.com/spf13/cobra/issues/1788)
- Allow user to add completion for powershell alias:
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[#&#8203;1621](https://togithub.com/spf13/cobra/issues/1621)
- Make `InitDefaultcompletionCmd` public:
[@&#8203;gssbzn](https://togithub.com/gssbzn)
[#&#8203;1467](https://togithub.com/spf13/cobra/issues/1467)

##### Deprecation 👎🏼

- `ExactValidArgs` is deprecated (but not being removed entirely). This
is abit nuanced, so checkout
[#&#8203;1643](https://togithub.com/spf13/cobra/issues/1643) for further
information and the [updated
`user_guide.md`](https://togithub.com/spf13/cobra/blob/main/user_guide.md)
on how this may affect you (and how you can take advantage of the
*correct* behavior in the validators):
[@&#8203;umarcor](https://togithub.com/umarcor)
[#&#8203;1643](https://togithub.com/spf13/cobra/issues/1643)

##### Bug fixes 🐛

- Fix (bash-v2) `activeHelp` length check syntax:
[@&#8203;scop](https://togithub.com/scop)
[#&#8203;1762](https://togithub.com/spf13/cobra/issues/1762)
- Fix correct command path in `see_also` for yaml documentation:
[@&#8203;zregvart](https://togithub.com/zregvart)
[#&#8203;1771](https://togithub.com/spf13/cobra/issues/1771)
- Fix showing flags that shadow parent persistent flag in child help
messaging: [@&#8203;brianpursley](https://togithub.com/brianpursley)
[#&#8203;1776](https://togithub.com/spf13/cobra/issues/1776)

##### Dependencies 🗳️

- Upgrade to use `gopkg.in/yaml.v3`:
[@&#8203;tklauser](https://togithub.com/tklauser)
[#&#8203;1766](https://togithub.com/spf13/cobra/issues/1766)

##### Testing 🤔

- Test on Golang 1.19: [@&#8203;umarcor](https://togithub.com/umarcor) &
[@&#8203;jpmcb](https://togithub.com/jpmcb)
[#&#8203;1782](https://togithub.com/spf13/cobra/issues/1782)
- Renamed powershell completion tests:
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[#&#8203;1803](https://togithub.com/spf13/cobra/issues/1803)
- Use `action/setup-go` cache:
[@&#8203;umarcor](https://togithub.com/umarcor)
[#&#8203;1783](https://togithub.com/spf13/cobra/issues/1783)
- Add `workflow_dispatch` to CI actions:
[@&#8203;umarcor](https://togithub.com/umarcor)
[#&#8203;1387](https://togithub.com/spf13/cobra/issues/1387)
- Add minimum GitHub token permissions for workflows:
[@&#8203;varunsh-coder](https://togithub.com/varunsh-coder)
[#&#8203;1792](https://togithub.com/spf13/cobra/issues/1792)

##### Docs ✏️

- Fixup spelling for GitHub CLI:
[@&#8203;eltociear](https://togithub.com/eltociear)
[#&#8203;1744](https://togithub.com/spf13/cobra/issues/1744)
- Clarify `SetContext` documentation:
[@&#8203;katexochen](https://togithub.com/katexochen)
[#&#8203;1748](https://togithub.com/spf13/cobra/issues/1748)
- Instruct user to `go install` for binary:
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[#&#8203;1726](https://togithub.com/spf13/cobra/issues/1726)
- User guide cleanup:
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[#&#8203;1656](https://togithub.com/spf13/cobra/issues/1656)
- Document option to hide the default completion command:
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[#&#8203;1779](https://togithub.com/spf13/cobra/issues/1779)

##### Misc 💭

- Add KubeVirt, CloudQuery, Cilium, Okteto, Zitadel, Allero to projects
using cobra: [@&#8203;maiqueb](https://togithub.com/maiqueb)
[#&#8203;1741](https://togithub.com/spf13/cobra/issues/1741),
[@&#8203;yevgenypats](https://togithub.com/yevgenypats)
[#&#8203;1742](https://togithub.com/spf13/cobra/issues/1742),
[@&#8203;tklauser](https://togithub.com/tklauser)
[#&#8203;1745](https://togithub.com/spf13/cobra/issues/1745),
[@&#8203;jLopezbarb](https://togithub.com/jLopezbarb)
[#&#8203;1759](https://togithub.com/spf13/cobra/issues/1759),
[@&#8203;fforootd](https://togithub.com/fforootd)
[#&#8203;1772](https://togithub.com/spf13/cobra/issues/1772),
[@&#8203;dimabru](https://togithub.com/dimabru)
[#&#8203;1819](https://togithub.com/spf13/cobra/issues/1819)
- Use correct stale action `exempt` yaml keys:
[@&#8203;jpmcb](https://togithub.com/jpmcb)
[#&#8203;1800](https://togithub.com/spf13/cobra/issues/1800)
- Add missing license headers:
[@&#8203;umarcor](https://togithub.com/umarcor)
[#&#8203;1809](https://togithub.com/spf13/cobra/issues/1809)

*Note:* Per
[#&#8203;1804](https://togithub.com/spf13/cobra/issues/1804), we will be
moving away from "seasonal" releases and doing more generic point
release targets. Continue to track the milestones and issues in the
`spf13/cobra` GitHub repository for more information!

Great work everyone! Cobra would never be possible without your
contributions! 🐍

**Full Changelog**:
spf13/cobra@v1.5.0...v1.6.0

### [`v1.5.0`](https://togithub.com/spf13/cobra/releases/tag/v1.5.0)

[Compare
Source](https://togithub.com/spf13/cobra/compare/v1.4.0...v1.5.0)

#### Spring 2022 Release 🌥️

Hello everyone! Welcome to another release of cobra. Completions
continue to get better and better. This release adds a few really cool
new features. We also continue to patch versions of our dependencies as
they become available via dependabot. Happy coding!

#### Active help 👐🏼

Shout out to [@&#8203;marckhouzam](https://togithub.com/marckhouzam) for
a big value add: Active Help
[spf13/cobra#1482.
With active help, a program can provide some inline warnings or hints
for users as they hit tab. Now, your CLIs can be even more intuitive to
use!

Currently active help is only supported for bash V2 and zsh. Marc wrote
a whole guide on how to do this, so make sure to give it a good read to
learn how you can add this to your cobra code!
https://github.com/spf13/cobra/blob/master/active_help.md

#### Group flags 🧑🏼‍🤝‍🧑🏼

Cobra now has the ability to mark flags as required or exclusive as a
***group***. Shout out to our newest maintainer
[@&#8203;johnSchnake](https://togithub.com/johnSchnake) for this!
[spf13/cobra#1654
Let's say you have a `username` flag that ***MUST*** be partnered with a
`password` flag. Well, now, you can enforce those as being required
together:

```go
rootCmd.Flags().StringVarP(&u, "username", "u", "", "Username (required if password is set)")
rootCmd.Flags().StringVarP(&pw, "password", "p", "", "Password (required if username is set)")
rootCmd.MarkFlagsRequiredTogether("username", "password")
```

Flags may also be marked as "mutally exclusive" with the
`MarkFlagsMutuallyExclusive(string, string ... )` command API. Refer to
our [user guide
documentation](https://togithub.com/spf13/cobra/blob/master/user_guide.md)
for further info!

#### Completions 👀

- Add backwards-compatibility tests for legacyArgs() by
[@&#8203;marckhouzam](https://togithub.com/marckhouzam) in
[spf13/cobra#1547
- feat: Add how to load completions in your current zsh session by
[@&#8203;ondrejsika](https://togithub.com/ondrejsika) in
[spf13/cobra#1608
- Introduce FixedCompletions by
[@&#8203;emersion](https://togithub.com/emersion) in
[spf13/cobra#1574
- Add shell completion to flag groups by
[@&#8203;marckhouzam](https://togithub.com/marckhouzam) in
[spf13/cobra#1659
- Modify brew prefix path in macOS system by
[@&#8203;imxw](https://togithub.com/imxw) in
[spf13/cobra#1719
- perf(bash-v2): use backslash escape string expansion for tab by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1682
- style(bash-v2): out is not an array variable, do not refer to it as
such by [@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1681
- perf(bash-v2): standard completion optimizations by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1683
- style(bash): out is not an array variable, do not refer to it as such
by [@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1684
- perf(bash-v2): short-circuit descriptionless candidate lists by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1686
- perf(bash-v2): speed up filtering entries with descriptions by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1689
- perf(bash-v2): speed up filtering menu-complete descriptions by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1692
- fix(bash-v2): skip empty completions when filtering descriptions by
[@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1691
- perf(bash-v2): read directly to COMPREPLY on descriptionless short
circuit by [@&#8203;scop](https://togithub.com/scop) in
[spf13/cobra#1700
- fix: Don't complete \_command on zsh by
[@&#8203;twpayne](https://togithub.com/twpayne) in
[spf13/cobra#1690
- Improve fish_completions code quality by
[@&#8203;t29kida](https://togithub.com/t29kida) in
[spf13/cobra#1515
- Fix handling of descriptions for bash v3 by
[@&#8203;marckhouzam](https://togithub.com/marckhouzam) in
[spf13/cobra#1735
- undefined or nil Args default to ArbitraryArgs by
[@&#8203;umarcor](https://togithub.com/umarcor) in
[spf13/cobra#1612
- Add Command.SetContext by
[@&#8203;joshcarp](https://togithub.com/joshcarp) in
[spf13/cobra#1551
- Wrap printf tab with quotes by
[@&#8203;PapaCharlie](https://togithub.com/PapaCharlie) in
[spf13/cobra#1665

#### Documentation 📝

- Fixed typos in completions docs -
[@&#8203;cuishuang](https://togithub.com/cuishuang)
[spf13/cobra#1625
- Removed `CHANGELOG.md` as it isn't updated -
[@&#8203;johnSchnake](https://togithub.com/johnSchnake)
[spf13/cobra#1634
- Minor typo fix in `shell_completion.md` -
[@&#8203;danieldn](https://togithub.com/danieldn)
[spf13/cobra#1678
- Changed branch name in the cobra generator link to 'main' -
[@&#8203;skywalker2909](https://togithub.com/skywalker2909)
[spf13/cobra#1645
- Fix Command.Context comment by
[@&#8203;katexochen](https://togithub.com/katexochen) in
[spf13/cobra#1639
- Change appropriate links from http:// to https:// where applicable -
[@&#8203;deining](https://togithub.com/deining)
[spf13/cobra#1695

#### Testing & CI ⚙️

- Test on Golang 1.18 - [@&#8203;umarcor](https://togithub.com/umarcor)
[spf13/cobra#1635
- Use `RICHGO_FORCE_COLOR` -
[@&#8203;umarcor](https://togithub.com/umarcor)
[spf13/cobra#1647
- Adds size labeler GitHub action by
[@&#8203;jpmcb](https://togithub.com/jpmcb) in
[spf13/cobra#1610
- Update `stale-bot` settings -
[@&#8203;jpmcb](https://togithub.com/jpmcb)
[spf13/cobra#1609

#### Beep boop, bot commits 🤖

- Bumped golangci/golangci-lint-action from 3.1.0 to 3.2.0 -
[@&#8203;dependabot](https://togithub.com/dependabot)
[spf13/cobra#1697
- Bump codelytv/pr-size-labeler from 1.8.0 to 1.8.1 -
[@&#8203;dependabot](https://togithub.com/dependabot)
[spf13/cobra#1661
- Bump actions/stale from 1 to 5 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1618
- Bump actions/cache from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1640
- Bump actions/labeler from 3 to 4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1620
- Bump golangci/golangci-lint-action from 2 to 3.1.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1615
- Bump actions/checkout from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1619
- Bump github.com/cpuguy83/go-md2man/v2 from 2.0.1 to 2.0.2 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1688
- Bump actions/setup-go from 2 to 3 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[spf13/cobra#1660

#### Misc 💭

- Use `errors.Is()` to check for errors -
[@&#8203;Luap99](https://togithub.com/Luap99)
[spf13/cobra#1730
- Prefer ReplaceAll instead of Replace(..., -1) by
[@&#8203;WhyNotHugo](https://togithub.com/WhyNotHugo) in
[spf13/cobra#1530
- Add Kubescape to projects -
[@&#8203;avinashupadhya99](https://togithub.com/avinashupadhya99)
[spf13/cobra#1642
- Add Pulumi as a project using cobra by
[@&#8203;iwahbe](https://togithub.com/iwahbe) in
[spf13/cobra#1720
- Add Polygon Edge as a project using Cobra by
[@&#8203;zivkovicmilos](https://togithub.com/zivkovicmilos) in
[spf13/cobra#1672

Shoutout to *ALL* our contributors (and all the new first time
contributors!!) - great work everyone!! Cobra and it's huge impact
wouldn't be possible without you 👏🏼 🚀 🐍

**Full Changelog**:
spf13/cobra@v1.4.0...v1.5.0

### [`v1.4.0`](https://togithub.com/spf13/cobra/releases/tag/v1.4.0)

[Compare
Source](https://togithub.com/spf13/cobra/compare/v1.3.0...v1.4.0)

### Winter 2022 Release ❄️

Another season, another release!

#### Goodbye viper! 🐍 🚀

The core Cobra library no longer requires Viper and all of its indirect
dependencies. This means that Cobra's dependency tree has been
drastically thinned! The Viper dependency was included because of the
`cobra` CLI generation tool. [This tool has migrated to
`spf13/cobra-cli`](https://togithub.com/spf13/cobra-cli/releases/tag/v1.3.0).

It's *pretty unlikely* you were importing and using **the bootstrapping
CLI tool** as part of your application (after all, it's just a tool to
get going with core `cobra`).

But if you were, replace occurrences of

    "github.com/spf13/cobra/cobra"

with

    "github.com/spf13/cobra-cli"

And in your `go.mod`, you'll want to also include this dependency:

    github.com/spf13/cobra-cli v1.3.0

Again, the maintainers *do not anticipate* this being a breaking change
to users of the core `cobra` library, so minimal work should be required
for users to integrate with this new release. Moreover, this means the
dependency tree for your application using Cobra should no longer
require dependencies that were inherited from Viper. Huzzah! 🥳

If you'd like to read more

- issue:
[spf13/cobra#1597
- PR:
[spf13/cobra#1604

#### Documentation 📝

- Update Go Doc link and badge in README:
[spf13/cobra#1593
- Fix to install command, now targets `@latest`:
[spf13/cobra#1576
- Added MAINTAINERS file:
[spf13/cobra#1545

#### Other 💭

- Bumped license year to 2022 in golden files:
[spf13/cobra#1575
- Added Pixie to projects:
[spf13/cobra#1581
- Updated labeler for new labeling scheme:
[spf13/cobra#1613
& syntax fix:
[spf13/cobra#1624

Shoutout to our awesome contributors helping to make this cobra release
possible!!
[@&#8203;spf13](https://togithub.com/spf13)
[@&#8203;marckhouzam](https://togithub.com/marckhouzam)
[@&#8203;johnSchnake](https://togithub.com/johnSchnake)
[@&#8203;jpmcb](https://togithub.com/jpmcb)
[@&#8203;liggitt](https://togithub.com/liggitt)
[@&#8203;umarcor](https://togithub.com/umarcor)
[@&#8203;hiljusti](https://togithub.com/hiljusti)
[@&#8203;marians](https://togithub.com/marians)
[@&#8203;shyim](https://togithub.com/shyim)
[@&#8203;htroisi](https://togithub.com/htroisi)

### [`v1.3.0`](https://togithub.com/spf13/cobra/releases/tag/v1.3.0)

[Compare
Source](https://togithub.com/spf13/cobra/compare/v1.2.1...v1.3.0)

### v1.3.0 - The Fall 2021 release 🍁

#### Completion fixes & enhancements 💇🏼

In `v1.2.0`, we introduced a new model for completions. Thanks to
everyone for trying it, giving feedback, and providing numerous fixes!
Continue to work with the new model as the old one (as noted in code
comments) will be deprecated in a coming release.

- `DisableFlagParsing` now triggers custom completions for flag names
[#&#8203;1161](https://togithub.com/spf13/cobra/issues/1161)
- Fixed unbound variables in bash completions causing edge case errors
[#&#8203;1321](https://togithub.com/spf13/cobra/issues/1321)
- `help` completion formatting improvements & fixes
[#&#8203;1444](https://togithub.com/spf13/cobra/issues/1444)
- All completions now follow the `help` example: short desc are now
capitalized and removes extra spacing from long description
[#&#8203;1455](https://togithub.com/spf13/cobra/issues/1455)
- Typo fixes in bash & zsh completions
[#&#8203;1459](https://togithub.com/spf13/cobra/issues/1459)
- Fixed mixed tab/spaces indentation in completion scripts. Now just 4
spaces [#&#8203;1473](https://togithub.com/spf13/cobra/issues/1473)
- Support for different bash completion options. Bash completions v2
supports descriptions and requires descriptions to be removed for
`menu-complete`, `menu-complete-backward` and `insert-completions`.
These descriptions are now purposefully removed in support of this
model. [#&#8203;1509](https://togithub.com/spf13/cobra/issues/1509)
- Fix for invalid shell completions when using `~/.cobra.yaml`. Log
message `Using config file: ~/.cobra.yaml` now printed to stderr
[#&#8203;1510](https://togithub.com/spf13/cobra/issues/1510)
- Removes unnecessary trailing spaces from completion command
descriptions
[#&#8203;1520](https://togithub.com/spf13/cobra/issues/1520)
- Option to hide default `completion` command
[#&#8203;1541](https://togithub.com/spf13/cobra/issues/1541)
- Remove `__complete` command for programs without subcommands
[#&#8203;1563](https://togithub.com/spf13/cobra/issues/1563)

#### Generator changes ⚙️

Thanks to [@&#8203;spf13](https://togithub.com/spf13) for providing a
number of changes to the Cobra generator tool, streamlining it for new
users!

- The Cobra generator now *won't* automatically include Viper and cleans
up a number of unused imports when not using Viper.
-   The Cobra generator's default license is now `none`
-   The Cobra generator now works with Go modules
-   Documentation to reflect these changes

#### New Features ⭐

- License can be specified by their SPDX identifiers
[#&#8203;1159](https://togithub.com/spf13/cobra/issues/1159)
- `MatchAll` allows combining several PositionalArgs to work in concert.
This now allows for enabling composing `PositionalArgs`
[#&#8203;896](https://togithub.com/spf13/cobra/issues/896)

#### Bug Fixes 🐛

- Fixed multiple error message from cobra `init` boilerplates
[#&#8203;1463](https://togithub.com/spf13/cobra/issues/1463)
[#&#8203;1552](https://togithub.com/spf13/cobra/issues/1552)
[#&#8203;1557](https://togithub.com/spf13/cobra/issues/1557)

#### Testing 👀

- Now testing golang 1.16.x and 1.17.x in CI
[#&#8203;1425](https://togithub.com/spf13/cobra/issues/1425)
- Fix for running diff test to ignore CR for windows
[#&#8203;949](https://togithub.com/spf13/cobra/issues/949)
- Added helper functions and reduced code reproduction in `args_test`
[#&#8203;1426](https://togithub.com/spf13/cobra/issues/1426)
- Now using official `golangci-lint` github action
[#&#8203;1477](https://togithub.com/spf13/cobra/issues/1477)

#### Security 🔏

- Added GitHub dependabot
[#&#8203;1427](https://togithub.com/spf13/cobra/issues/1427)
-   Now using Viper `v1.10.0`
- There is a known CVE in an *indirect* dependency from `viper`:
[spf13/cobra#1538.
This will be patched in a future release

#### Documentation 📝

- Multiple projects added to the `projects_using_cobra.md` file:
[#&#8203;1377](https://togithub.com/spf13/cobra/issues/1377)
[#&#8203;1501](https://togithub.com/spf13/cobra/issues/1501)
[#&#8203;1454](https://togithub.com/spf13/cobra/issues/1454)
- Removed ToC from main readme file as it is now automagically displayed
by GitHub [#&#8203;1429](https://togithub.com/spf13/cobra/issues/1429)
- Documentation correct for when the `--author` flag is specified
[#&#8203;1009](https://togithub.com/spf13/cobra/issues/1009)
- `shell_completions.md` has an easier to use snippet for copying and
pasting shell completions
[#&#8203;1372](https://togithub.com/spf13/cobra/issues/1372)

#### Other 💭

- Bump version of `cpuguy83/go-md2man` to v2.0.1
[#&#8203;1460](https://togithub.com/spf13/cobra/issues/1460)
- Removed `lesser` typo from the GPL-2.0 license
[#&#8203;880](https://togithub.com/spf13/cobra/issues/880)
- Fixed spelling errors
[#&#8203;1514](https://togithub.com/spf13/cobra/issues/1514)

*Thank you to all our amazing contributors* ⭐🐍🚀

### [`v1.2.1`](https://togithub.com/spf13/cobra/releases/tag/v1.2.1)

[Compare
Source](https://togithub.com/spf13/cobra/compare/v1.2.0...v1.2.1)

##### Bug fixes

- Quickfix for
[spf13/cobra#1437
after v1.2.0 where parallel use of the
`cmd.RegisterFlagCompletionFunc()` (and subsequent map) now works
correctly and flag completions now work again

### [`v1.2.0`](https://togithub.com/spf13/cobra/releases/tag/v1.2.0): -
The completions release

[Compare
Source](https://togithub.com/spf13/cobra/compare/v1.1.3...v1.2.0)

### 🌠 v1.2.0 - The completions release

Welcome to v1.2.0 of Cobra! This release focuses on code completions,
several critical bug fixes, some documentation updates, and security
bumps. Upgrading should be simple but please take note of the
introduction of bash completions V2 and their default use. The v1
completions library is still available, but will be *deprecated* in the
future. Please open an issue with any problems!

***

#### New Features

- Automatically adds a `completion` command for shell completions. If a
`completion` command is already provided, uses that instead. This will
*automatically* provide shell completions for bash, zsh, fish, and
PowerShell
[spf13/cobra#1192
    -   Users can configure the command auto creation:
        -   disable the creation of the completion command
        -   disable completion descriptions
- disable the `--no-descriptions` flag for "always on" completion
descriptions
- Introduction of bash completions V2, a uniform completion approach
which include completion descriptions. The V1 bash completions are still
available *but will be deprecated* in a later release -
[spf13/cobra#1146
- Note that projects providing completion through a different command
name (say a command named "complete") will continue to use v1 for their
own command but will also provide cobra's implicit "completion" command
which will use v2, unless of course, these projects take the time to
disable the default "completion" command as noted above.
- Commands now support context being passed to completions -
[spf13/cobra#1265
- An example can be found here:
[spf13/cobra#1265 (comment)
- Removed dependency on`mitchellh/go-homedir` in favor of core Go
`os.UserHomeDir()` -
spf13/cobra@8eaca5f

#### Bug Fixes

- Fix trailing whitespace not being handled in powershell completion
scripts
[spf13/cobra#1342
- Bash completion variable leak fix
[spf13/cobra#1352
- Fish shell completions correctly ignore trailing empty lines
[spf13/cobra#1284
- PowerShell completions fix for "no file comp directive" -
[spf13/cobra#1363
- Custom completions now correctly handle multiple shorthand flags
together -
[spf13/cobra#1258
- zsh completions now correctly handle `ShellDirectiveCompletionNoSpace`
and file completion all the time -
[spf13/cobra#1213
- Multiple fixes / improvements to the fish shell support -
[spf13/cobra#1249
- Fix home directory config not loading correctly -
[spf13/cobra#1282
- Fix for `RegisterFlagCompletionFunc` as a global var not working in
multi-threaded programs:
[spf13/cobra#1423
- Custom completions correctly do not complete flags after args when
interspersed is false
[#&#8203;1308](https://togithub.com/spf13/cobra/issues/1308)

#### Testing

- Deprecated Travis CI. Now fully using Github Actions -
spf13/cobra@d0f318d
- Added test cases and enhancements (thank you to everyone for taking
the time to add tests to your PRs!)
- Shoutout to [@&#8203;marckhouzam](https://togithub.com/marckhouzam)
and [@&#8203;Luap99](https://togithub.com/Luap99) for their hard work on
a cobra command completions testing library. [Check out the repo
here!](https://togithub.com/marckhouzam/cobra-completion-testing)

#### Security

- Bump viper to 1.8.1. This corrects several issues with vulnerabilities
existing in the dependency tree -
[spf13/cobra#1433

#### Other

- Add PR labeler with pull_request_target to enable tests to run from
forks -
[spf13/cobra#1338
- CI using MSYS2 windows machines pull latest -
[spf13/cobra#1366
- Multiple small fixes to spelling / documentation -
[spf13/cobra#1349
[spf13/cobra#1417
[spf13/cobra#1434

**Thank you to *all* our amazing contributors 🐍🚀**

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/PingCAP-QE/ee-apps).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy44Ny4yIiwidXBkYXRlZEluVmVyIjoiMzcuODcuMiIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/flags-args Changes to functionality around command line flags and args kind/feature A feature request for cobra; new or enhanced behavior lgtm Denotes "looks good to me" from maintainers and signals other collaboratores that a PR is ready size/XL Denotes a PR that exceeds 200 lines. Caution!
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Required if another flag is defined Conflicting and Implied flags
4 participants