mirror of
https://github.com/spf13/cobra
synced 2025-04-27 09:07:19 +00:00
fix: reset flags' value to default if flags have been parsed
This commit is contained in:
parent
3d8ac432bd
commit
934601d616
2 changed files with 58 additions and 0 deletions
|
@ -1830,6 +1830,12 @@ func (c *Command) ParseFlags(args []string) error {
|
|||
// do it here after merging all flags and just before parse
|
||||
c.Flags().ParseErrorsWhitelist = flag.ParseErrorsWhitelist(c.FParseErrWhitelist)
|
||||
|
||||
// if flag has been parsed, we should reset flags' value to default
|
||||
if c.Flags().Parsed() {
|
||||
c.Flags().Visit(func(f *flag.Flag) {
|
||||
f.Value.Set(f.DefValue)
|
||||
})
|
||||
}
|
||||
err := c.Flags().Parse(args)
|
||||
// Print warnings if they occurred (e.g. deprecated flag messages).
|
||||
if c.flagErrorBuf.Len()-beforeErrorBufLen > 0 && err == nil {
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
package cobra
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
@ -193,3 +194,54 @@ func TestValidateFlagGroups(t *testing.T) {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestSetArgs(t *testing.T) {
|
||||
getCMD := func() *Command {
|
||||
cmd := &Command{
|
||||
Use: "testcmd",
|
||||
RunE: func(cmd *Command, args []string) error {
|
||||
a, _ := cmd.Flags().GetBool("a")
|
||||
b, _ := cmd.Flags().GetBool("b")
|
||||
c, _ := cmd.Flags().GetBool("c")
|
||||
switch {
|
||||
case a && b, a && c, b && c:
|
||||
return fmt.Errorf("a,b,c only one could be true")
|
||||
}
|
||||
return nil
|
||||
},
|
||||
}
|
||||
f := cmd.Flags()
|
||||
f.BoolP("a", "a", false, "a,b,c only one could be true")
|
||||
f.BoolP("b", "b", false, "a,b,c only one could be true")
|
||||
f.Bool("c", false, "a,b,c only one could be true")
|
||||
return cmd
|
||||
}
|
||||
|
||||
cmd := getCMD()
|
||||
|
||||
// step 1
|
||||
cmd.SetArgs([]string{
|
||||
"--a=true",
|
||||
})
|
||||
assertNoErr(t, cmd.Execute())
|
||||
// step 2
|
||||
cmd.SetArgs([]string{
|
||||
"--b=true",
|
||||
})
|
||||
t.Log(cmd.Flags().Changed("a"))
|
||||
assertNoErr(t, cmd.Execute())
|
||||
|
||||
// step 3
|
||||
cmd.SetArgs([]string{
|
||||
"--c=true",
|
||||
})
|
||||
assertNoErr(t, cmd.Execute())
|
||||
|
||||
// step 4
|
||||
cmd.SetArgs([]string{
|
||||
"--a=false",
|
||||
"--b=false",
|
||||
"--c=true",
|
||||
})
|
||||
assertNoErr(t, cmd.Execute())
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue