Skip to content

Commit 335d72b

Browse files
committed
fix: treat "-vn=" in a short option group as an empty value
1 parent 2f64589 commit 335d72b

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

‎command_parse.go‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,9 @@ func (cmd *Command) parseFlags(args Args) (Args, error) {
248248
return &stringSliceArgs{posArgs}, err
249249
}
250250
} else if index == lastIndex { // last flag can take an arg
251-
if flagVal == "" {
251+
// as with a single flag, an explicit "=" with nothing after
252+
// it is an empty value, not a request to read the next arg
253+
if flagVal == "" && !valFromEqual {
252254
if len(rargs) == 1 {
253255
return &stringSliceArgs{posArgs}, fmt.Errorf("%s%s", argumentNotProvidedErrMsg, string(c))
254256
}

‎command_test.go‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6948,6 +6948,48 @@ func TestFlagEqualsEmptyValue(t *testing.T) {
69486948
assert.Equal(t, "", val)
69496949
assert.Equal(t, []string{"positional"}, args)
69506950
})
6951+
6952+
t.Run("-vn= in a short option group sets empty string", func(t *testing.T) {
6953+
var val string
6954+
var verbose bool
6955+
var args []string
6956+
6957+
cmd := &Command{
6958+
UseShortOptionHandling: true,
6959+
Flags: []Flag{
6960+
&BoolFlag{Name: "v", Destination: &verbose},
6961+
&StringFlag{Name: "n", Destination: &val, Value: "default"},
6962+
},
6963+
Action: func(_ context.Context, cmd *Command) error {
6964+
args = cmd.Args().Slice()
6965+
return nil
6966+
},
6967+
}
6968+
6969+
err := cmd.Run(buildTestContext(t), []string{"app", "-vn=", "positional"})
6970+
assert.NoError(t, err)
6971+
assert.True(t, verbose)
6972+
assert.Equal(t, "", val)
6973+
assert.Equal(t, []string{"positional"}, args)
6974+
})
6975+
6976+
t.Run("-vn= at the end of a short option group sets empty string", func(t *testing.T) {
6977+
var val string
6978+
var verbose bool
6979+
6980+
cmd := &Command{
6981+
UseShortOptionHandling: true,
6982+
Flags: []Flag{
6983+
&BoolFlag{Name: "v", Destination: &verbose},
6984+
&StringFlag{Name: "n", Destination: &val, Value: "default"},
6985+
},
6986+
}
6987+
6988+
err := cmd.Run(buildTestContext(t), []string{"app", "-vn="})
6989+
assert.NoError(t, err)
6990+
assert.True(t, verbose)
6991+
assert.Equal(t, "", val)
6992+
})
69516993
}
69526994

69536995
// TestCommand_NoDefaultCmdArgMatchingFlag tests the argument set

0 commit comments

Comments
 (0)