From 9d86e5bc6fe381c3cf780b2deb3ddb917795a87e Mon Sep 17 00:00:00 2001 From: Jake Wang Date: Fri, 18 Sep 2026 19:17:46 -0400 Subject: [PATCH] Fix inverse bool flag counting with an external counter --- flag_bool_with_inverse.go | 7 ++----- flag_bool_with_inverse_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/flag_bool_with_inverse.go b/flag_bool_with_inverse.go index d57225dc17..da45e54f85 100644 --- a/flag_bool_with_inverse.go +++ b/flag_bool_with_inverse.go @@ -83,10 +83,6 @@ func (bif *BoolWithInverseFlag) inversePrefix() string { } func (bif *BoolWithInverseFlag) PreParse() error { - count := bif.Config.Count - if count == nil { - count = &bif.count - } dest := bif.Destination if dest == nil { dest = new(bool) @@ -94,7 +90,7 @@ func (bif *BoolWithInverseFlag) PreParse() error { *dest = bif.Value bif.value = &boolValue{ destination: dest, - count: count, + count: bif.Config.Count, } // Validate the given default or values set from external sources as well @@ -153,6 +149,7 @@ func (bif *BoolWithInverseFlag) Set(name, val string) error { } bif.nset = true } + bif.count++ if bif.Validator != nil { return bif.Validator(bif.value.Get().(bool)) diff --git a/flag_bool_with_inverse_test.go b/flag_bool_with_inverse_test.go index bb9849cae9..895c33d7ec 100644 --- a/flag_bool_with_inverse_test.go +++ b/flag_bool_with_inverse_test.go @@ -3,6 +3,7 @@ package cli import ( "context" "fmt" + "io" "strings" "testing" @@ -572,3 +573,33 @@ func TestBoolWithInverseFlagStringNoPanicWithNoTabStringer(t *testing.T) { t.Errorf("expected String() to contain the flag name, got %q", got) } } + +func TestBoolWithInverseFlagCount(t *testing.T) { + for _, externalCount := range []bool{false, true} { + for _, onlyOnce := range []bool{false, true} { + for _, name := range []string{"--env", "--no-env", "-e", "--no-e"} { + t.Run(fmt.Sprintf("external=%v/onlyOnce=%v/%s", externalCount, onlyOnce, name), func(t *testing.T) { + const initialCount = 7 + count := initialCount + fl := &BoolWithInverseFlag{Name: "env", Aliases: []string{"e"}, OnlyOnce: onlyOnce} + if externalCount { + fl.Config.Count = &count + } + cmd := &Command{Flags: []Flag{fl}, Writer: io.Discard, ErrWriter: io.Discard} + err := cmd.Run(buildTestContext(t), []string{"prog", name, name}) + wantCount := 2 + if onlyOnce { + require.ErrorContains(t, err, "can't duplicate this flag") + wantCount = 1 + } else { + require.NoError(t, err) + } + require.Equal(t, wantCount, fl.Count()) + if externalCount { + require.Equal(t, initialCount+wantCount, count) + } + }) + } + } + } +}