Skip to content

Commit 9b025d0

Browse files
authored
Merge pull request #186 from ipfs/fix/option-alias
fix: normalize options when parsing them
2 parents 0722d72 + 7c76a73 commit 9b025d0

File tree

3 files changed

+20
-357
lines changed

3 files changed

+20
-357
lines changed

cli/parse.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ L:
140140
if err != nil {
141141
return err
142142
}
143+
143144
kvType, err := getOptType(k, optDefs)
144145
if err != nil {
145146
return err // shouldn't happen b/c k,v was parsed from optsDef
@@ -409,17 +410,17 @@ func splitkv(opt string) (k, v string, ok bool) {
409410
}
410411
}
411412

412-
func parseOpt(opt, value string, opts map[string]cmds.Option) (interface{}, error) {
413+
func parseOpt(opt, value string, opts map[string]cmds.Option) (string, interface{}, error) {
413414
optDef, ok := opts[opt]
414415
if !ok {
415-
return nil, fmt.Errorf("unknown option %q", opt)
416+
return "", nil, fmt.Errorf("unknown option %q", opt)
416417
}
417418

418419
v, err := optDef.Parse(value)
419420
if err != nil {
420-
return nil, err
421+
return "", nil, err
421422
}
422-
return v, nil
423+
return optDef.Name(), v, nil
423424
}
424425

425426
type kv struct {
@@ -433,7 +434,7 @@ func (st *parseState) parseShortOpts(optDefs map[string]cmds.Option) ([]kv, erro
433434

434435
if ok {
435436
// split at = successful
436-
v, err := parseOpt(k, vStr, optDefs)
437+
k, v, err := parseOpt(k, vStr, optDefs)
437438
if err != nil {
438439
return nil, err
439440
}
@@ -453,7 +454,7 @@ func (st *parseState) parseShortOpts(optDefs map[string]cmds.Option) ([]kv, erro
453454
case od.Type() == cmds.Bool:
454455
// single char flags for bools
455456
kvs = append(kvs, kv{
456-
Key: flag,
457+
Key: od.Name(),
457458
Value: true,
458459
})
459460
j++
@@ -462,23 +463,23 @@ func (st *parseState) parseShortOpts(optDefs map[string]cmds.Option) ([]kv, erro
462463
// single char flag for non-bools (use the rest of the flag as value)
463464
rest := k[j+1:]
464465

465-
v, err := parseOpt(flag, rest, optDefs)
466+
k, v, err := parseOpt(flag, rest, optDefs)
466467
if err != nil {
467468
return nil, err
468469
}
469470

470-
kvs = append(kvs, kv{Key: flag, Value: v})
471+
kvs = append(kvs, kv{Key: k, Value: v})
471472
break LOOP
472473

473474
case st.i < len(st.cmdline)-1:
474475
// single char flag for non-bools (use the next word as value)
475476
st.i++
476-
v, err := parseOpt(flag, st.cmdline[st.i], optDefs)
477+
k, v, err := parseOpt(flag, st.cmdline[st.i], optDefs)
477478
if err != nil {
478479
return nil, err
479480
}
480481

481-
kvs = append(kvs, kv{Key: flag, Value: v})
482+
kvs = append(kvs, kv{Key: k, Value: v})
482483
break LOOP
483484

484485
default:
@@ -507,7 +508,7 @@ func (st *parseState) parseLongOpt(optDefs map[string]cmds.Option) (string, inte
507508
}
508509
}
509510

510-
optval, err := parseOpt(k, v, optDefs)
511+
k, optval, err := parseOpt(k, v, optDefs)
511512
return k, optval, err
512513
}
513514

cli/parse_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ func TestOptionParsing(t *testing.T) {
8080
cmd := &cmds.Command{
8181
Options: []cmds.Option{
8282
cmds.StringOption("string", "s", "a string"),
83+
cmds.StringOption("flag", "alias", "multiple long"),
8384
cmds.BoolOption("bool", "b", "a bool"),
8485
cmds.StringsOption("strings", "r", "strings array"),
8586
},
@@ -156,6 +157,11 @@ func TestOptionParsing(t *testing.T) {
156157
test("defaults", kvs{"opt": "def"}, words{})
157158
test("defaults -o foo", kvs{"opt": "foo"}, words{})
158159

160+
test("--flag=foo", kvs{"flag": "foo"}, words{})
161+
test("--alias=foo", kvs{"flag": "foo"}, words{})
162+
testFail("--flag=bar --alias=foo")
163+
testFail("--alias=bar --flag=foo")
164+
159165
testFail("--bad-flag")
160166
testFail("--bad-flag=")
161167
testFail("--bad-flag=xyz")
@@ -636,7 +642,8 @@ func TestFileArgs(t *testing.T) {
636642
cmd: words{"fileOp", "--ignore", path.Base(tmpFile2.Name()), tmpDir1, tmpFile1.Name()}, f: nil,
637643
args: words{tmpDir1, tmpFile1.Name(), tmpFile3.Name()},
638644
parseErr: fmt.Errorf(notRecursiveFmtStr, tmpDir1, "r"),
639-
}, {
645+
},
646+
{
640647
cmd: words{"fileOp", tmpFile1.Name(), "--ignore", path.Base(tmpFile2.Name()), "--ignore"}, f: nil,
641648
args: words{tmpDir1, tmpFile1.Name(), tmpFile3.Name()},
642649
parseErr: fmt.Errorf("missing argument for option %q", "ignore"),

0 commit comments

Comments
 (0)