This commit is contained in:
Ben Congdon 2022-02-28 17:01:20 -04:00 committed by GitHub
commit 4f45d8667b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 0 deletions

View file

@ -1491,6 +1491,13 @@ func (c *Command) LocalFlags() *flag.FlagSet {
addToLocal := func(f *flag.Flag) {
if c.lflags.Lookup(f.Name) == nil && c.parentsPflags.Lookup(f.Name) == nil {
c.lflags.AddFlag(f)
// If `f` has already been changed, re-add its value to the flag set,
// otherwise `c.lflags` has no record of the flags value.
if f.Changed {
f.Changed = false
c.lflags.Set(f.Name, f.Value.String())
}
}
}
c.Flags().VisitAll(addToLocal)

View file

@ -2058,3 +2058,44 @@ func TestFParseErrWhitelistSiblingCommand(t *testing.T) {
}
checkStringContains(t, output, "unknown flag: --unknown")
}
func TestLocalFlagsInChildRun(t *testing.T) {
root := &Command{
Use: "root",
Run: emptyRun,
}
root.Flags().BoolP("boola", "a", false, "a boolean flag")
var setFlags []string
var allFlags []string
c := &Command{
Use: "child",
Run: func(cmd *Command, args []string) {
cmd.LocalFlags().Visit(func(f *pflag.Flag) {
setFlags = append(setFlags, f.Name)
})
cmd.LocalFlags().VisitAll(func(f *pflag.Flag) {
allFlags = append(allFlags, f.Name)
})
},
}
c.Flags().BoolP("boolb", "b", false, "a boolean flag")
c.Flags().BoolP("boolc", "c", false, "a boolean flag")
root.AddCommand(c)
_, err := executeCommand(root, "child", "--boolb")
if err != nil {
t.Fatal("unexpected error: ", err.Error())
}
if len(setFlags) != 1 || setFlags[0] != "boolb" {
t.Errorf(`expected setFlags to be ["boolb"], but was: %v`, setFlags)
}
expectedAllFlags := []string{"boolb", "boolc", "help"}
for i, f := range expectedAllFlags {
if allFlags[i] != f {
t.Errorf("Expected: %s, got: %s", f, allFlags[i])
}
}
}