From e302525d58d45d930b1f4d68aae8f8c09a41dac5 Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Sun, 16 Oct 2022 19:02:49 -0400 Subject: [PATCH] Fix:(issue_1263) FlagNames should return names set via env as well --- context.go | 24 ++++++++++++++++++++++-- flag_test.go | 4 ++++ sliceflag_test.go | 4 ++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/context.go b/context.go index 315c2fb..dbf50e4 100644 --- a/context.go +++ b/context.go @@ -82,7 +82,27 @@ func (cCtx *Context) IsSet(name string) bool { func (cCtx *Context) LocalFlagNames() []string { var names []string cCtx.flagSet.Visit(makeFlagNameVisitor(&names)) - return names + // Check the flags which have been set via env or file + if cCtx.Command != nil && cCtx.Command.Flags != nil { + for _, f := range cCtx.Command.Flags { + if f.IsSet() { + names = append(names, f.Names()...) + } + } + } + + // Sort out the duplicates since flag could be set via multiple + // paths + m := map[string]struct{}{} + var unames []string + for _, name := range names { + if _, ok := m[name]; !ok { + m[name] = struct{}{} + unames = append(unames, name) + } + } + + return unames } // FlagNames returns a slice of flag names used by the this context and all of @@ -90,7 +110,7 @@ func (cCtx *Context) LocalFlagNames() []string { func (cCtx *Context) FlagNames() []string { var names []string for _, pCtx := range cCtx.Lineage() { - pCtx.flagSet.Visit(makeFlagNameVisitor(&names)) + names = append(names, pCtx.LocalFlagNames()...) } return names } diff --git a/flag_test.go b/flag_test.go index 6e03582..d46c1a7 100644 --- a/flag_test.go +++ b/flag_test.go @@ -239,6 +239,10 @@ func TestFlagsFromEnv(t *testing.T) { t.Errorf("Flag %s not set", f.Names()[0]) } + // check that flag names are returned when set via env as well + if !reflect.DeepEqual(ctx.FlagNames(), test.flag.Names()) { + t.Errorf("Not enough flag names %+v", ctx.FlagNames()) + } return nil }, } diff --git a/sliceflag_test.go b/sliceflag_test.go index 179020b..8337417 100644 --- a/sliceflag_test.go +++ b/sliceflag_test.go @@ -156,8 +156,8 @@ func ExampleMultiStringFlag() { //--- //Setting all flags via environment... // - //Flag names: [] - //Local flag names: [] + //Flag names: ["flag-one" "1" "two" "2" "flag-three" "3" "flag-four" "4"] + //Local flag names: ["flag-one" "1" "two" "2" "flag-three" "3" "flag-four" "4"] //Context values: //"flag-one"=["v 9" "v 10"] //"two"=["v 11" "v 12"]