Skip to content

Commit b7cfd40

Browse files
authored
Merge pull request #2432 from jakezwang/fix/inverse-bool-external-count
Fix inverse bool flag counting with an external counter
2 parents 7885ee8 + 9d86e5b commit b7cfd40

2 files changed

Lines changed: 33 additions & 5 deletions

File tree

‎flag_bool_with_inverse.go‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,14 @@ func (bif *BoolWithInverseFlag) inversePrefix() string {
8383
}
8484

8585
func (bif *BoolWithInverseFlag) PreParse() error {
86-
count := bif.Config.Count
87-
if count == nil {
88-
count = &bif.count
89-
}
9086
dest := bif.Destination
9187
if dest == nil {
9288
dest = new(bool)
9389
}
9490
*dest = bif.Value
9591
bif.value = &boolValue{
9692
destination: dest,
97-
count: count,
93+
count: bif.Config.Count,
9894
}
9995

10096
// Validate the given default or values set from external sources as well
@@ -153,6 +149,7 @@ func (bif *BoolWithInverseFlag) Set(name, val string) error {
153149
}
154150
bif.nset = true
155151
}
152+
bif.count++
156153

157154
if bif.Validator != nil {
158155
return bif.Validator(bif.value.Get().(bool))

‎flag_bool_with_inverse_test.go‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cli
33
import (
44
"context"
55
"fmt"
6+
"io"
67
"strings"
78
"testing"
89

@@ -572,3 +573,33 @@ func TestBoolWithInverseFlagStringNoPanicWithNoTabStringer(t *testing.T) {
572573
t.Errorf("expected String() to contain the flag name, got %q", got)
573574
}
574575
}
576+
577+
func TestBoolWithInverseFlagCount(t *testing.T) {
578+
for _, externalCount := range []bool{false, true} {
579+
for _, onlyOnce := range []bool{false, true} {
580+
for _, name := range []string{"--env", "--no-env", "-e", "--no-e"} {
581+
t.Run(fmt.Sprintf("external=%v/onlyOnce=%v/%s", externalCount, onlyOnce, name), func(t *testing.T) {
582+
const initialCount = 7
583+
count := initialCount
584+
fl := &BoolWithInverseFlag{Name: "env", Aliases: []string{"e"}, OnlyOnce: onlyOnce}
585+
if externalCount {
586+
fl.Config.Count = &count
587+
}
588+
cmd := &Command{Flags: []Flag{fl}, Writer: io.Discard, ErrWriter: io.Discard}
589+
err := cmd.Run(buildTestContext(t), []string{"prog", name, name})
590+
wantCount := 2
591+
if onlyOnce {
592+
require.ErrorContains(t, err, "can't duplicate this flag")
593+
wantCount = 1
594+
} else {
595+
require.NoError(t, err)
596+
}
597+
require.Equal(t, wantCount, fl.Count())
598+
if externalCount {
599+
require.Equal(t, initialCount+wantCount, count)
600+
}
601+
})
602+
}
603+
}
604+
}
605+
}

0 commit comments

Comments
 (0)