Skip to content

Commit 41c4f5f

Browse files
authored
Merge pull request urfave#2297 from idelchi/issue_2293
Fix:(issue_2293) --flag="" no longer rejected as missing argument
2 parents d3f9586 + 195aaff commit 41c4f5f

2 files changed

Lines changed: 46 additions & 4 deletions

File tree

command_parse.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ func (cmd *Command) parseFlags(args Args) (Args, error) {
163163

164164
tracef("processing non bool flag (fName=%[1]q)", flagName)
165165
// not a bool flag so need to get the next arg
166-
if flagVal == "" {
167-
if len(rargs) == 1 || valFromEqual {
166+
if flagVal == "" && !valFromEqual {
167+
if len(rargs) == 1 {
168168
return &stringSliceArgs{posArgs}, fmt.Errorf("%s%s", argumentNotProvidedErrMsg, firstArg)
169169
}
170170
flagVal = rargs[1]

command_test.go

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2849,12 +2849,12 @@ func TestFlagAction(t *testing.T) {
28492849
{
28502850
name: "flag_string_error",
28512851
args: []string{"app", "--f_string="},
2852-
err: "flag needs an argument: --f_string=",
2852+
err: "empty string",
28532853
},
28542854
{
28552855
name: "flag_string_error2",
28562856
args: []string{"app", "--f_string=", "--f_bool"},
2857-
err: "flag needs an argument: --f_string=",
2857+
err: "empty string",
28582858
},
28592859
{
28602860
name: "flag_string_slice",
@@ -5623,3 +5623,45 @@ func TestCommand_ExclusiveFlagsPersistent(t *testing.T) {
56235623
})
56245624
}
56255625
}
5626+
5627+
func TestFlagEqualsEmptyValue(t *testing.T) {
5628+
t.Run("--flag= sets empty string", func(t *testing.T) {
5629+
var val string
5630+
5631+
cmd := &Command{
5632+
Flags: []Flag{
5633+
&StringFlag{
5634+
Name: "name",
5635+
Destination: &val,
5636+
},
5637+
},
5638+
}
5639+
5640+
err := cmd.Run(buildTestContext(t), []string{"app", "--name="})
5641+
assert.NoError(t, err)
5642+
assert.Equal(t, "", val)
5643+
})
5644+
5645+
t.Run("--flag= does not consume next positional arg", func(t *testing.T) {
5646+
var val string
5647+
var args []string
5648+
5649+
cmd := &Command{
5650+
Flags: []Flag{
5651+
&StringFlag{
5652+
Name: "name",
5653+
Destination: &val,
5654+
},
5655+
},
5656+
Action: func(_ context.Context, cmd *Command) error {
5657+
args = cmd.Args().Slice()
5658+
return nil
5659+
},
5660+
}
5661+
5662+
err := cmd.Run(buildTestContext(t), []string{"app", "--name=", "positional"})
5663+
assert.NoError(t, err)
5664+
assert.Equal(t, "", val)
5665+
assert.Equal(t, []string{"positional"}, args)
5666+
})
5667+
}

0 commit comments

Comments
 (0)