Skip to content

Commit 326b6b0

Browse files
committed
fix: --long= should not consume the next argument
1 parent 4e42878 commit 326b6b0

File tree

3 files changed

+18
-17
lines changed

3 files changed

+18
-17
lines changed

Diff for: flag_set.go

+11-17
Original file line numberDiff line numberDiff line change
@@ -241,16 +241,8 @@ func (fs *FlagSet) parseShortFlag(arg string, args []string) ([]string, error) {
241241
}
242242

243243
func (fs *FlagSet) parseLongFlag(arg string, args []string) ([]string, error) {
244-
var (
245-
name string
246-
value string
247-
)
248-
249-
if equals := strings.IndexRune(arg, '='); equals > 0 {
250-
arg, value = arg[:equals], arg[equals+1:]
251-
}
252-
253-
name = strings.TrimPrefix(arg, "--")
244+
name, value, eqFound := strings.Cut(arg, "=")
245+
name = strings.TrimPrefix(name, "--")
254246

255247
f := fs.findLongFlag(name)
256248
if f == nil {
@@ -264,22 +256,24 @@ func (fs *FlagSet) parseLongFlag(arg string, args []string) ([]string, error) {
264256
}
265257
}
266258

267-
if value == "" {
259+
if eqFound && f.isBoolFlag && value == "" {
260+
value = "true" // `--debug=` amounts to `--debug=true`
261+
}
262+
263+
if value == "" && !eqFound {
268264
switch {
269265
case f.isBoolFlag:
270-
value = "true" // `-b` or `--foo` default to true
266+
value = "true" // `--foo` defaults to true
271267
if len(args) > 0 {
272268
if _, err := strconv.ParseBool(args[0]); err == nil {
273-
value = args[0] // `-b true` or `--foo false` should also work
269+
value = args[0] // `--foo false` should also work
274270
args = args[1:]
275271
}
276272
}
277-
case !f.isBoolFlag && len(args) > 0:
273+
case len(args) > 0:
278274
value, args = args[0], args[1:]
279-
case !f.isBoolFlag && len(args) <= 0:
280-
return nil, fmt.Errorf("missing value")
281275
default:
282-
panic("unreachable")
276+
return nil, fmt.Errorf("missing value")
283277
}
284278
}
285279

Diff for: flag_set_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ func TestFlagSet_Bool(t *testing.T) {
8383
{args: []string{"--help"}, wantX: false, wantY: true, wantErr: ff.ErrHelp},
8484
{args: []string{"--xflag", "-h"}, wantX: true, wantY: true, wantErr: ff.ErrHelp},
8585
{args: []string{"-y", "--help"}, wantX: false, wantY: false, wantErr: ff.ErrHelp},
86+
{args: []string{"--xflag=", "--help"}, wantX: true, wantY: true, wantErr: ff.ErrHelp},
8687
} {
8788
t.Run(strings.Join(test.args, " "), func(t *testing.T) {
8889
fs := ff.NewFlagSet(t.Name())

Diff for: parse_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,12 @@ func TestParse_FlagSet(t *testing.T) {
233233
Args: []string{`--str`, `foo`, `--help`, `-b`},
234234
Want: fftest.Vars{S: "foo", B: false, WantParseErrorIs: ff.ErrHelp},
235235
},
236+
{
237+
Name: "--str= -a",
238+
Constructors: []fftest.Constructor{fftest.CoreConstructor},
239+
Args: []string{`--str=`, `-a`},
240+
Want: fftest.Vars{S: "", A: true},
241+
},
236242
{
237243
Name: "-s foo -f 1.23",
238244
Constructors: []fftest.Constructor{fftest.CoreConstructor},

0 commit comments

Comments
 (0)