Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
dms3
go-dms3-cmds
Commits
9b025d03
Unverified
Commit
9b025d03
authored
Mar 20, 2020
by
Steven Allen
Committed by
GitHub
Mar 20, 2020
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #186 from ipfs/fix/option-alias
fix: normalize options when parsing them
parents
0722d72b
7c76a735
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
20 additions
and
357 deletions
+20
-357
cli/parse.go
cli/parse.go
+12
-11
cli/parse_test.go
cli/parse_test.go
+8
-1
go.sum
go.sum
+0
-345
No files found.
cli/parse.go
View file @
9b025d03
...
...
@@ -140,6 +140,7 @@ L:
if
err
!=
nil
{
return
err
}
kvType
,
err
:=
getOptType
(
k
,
optDefs
)
if
err
!=
nil
{
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) {
}
}
func
parseOpt
(
opt
,
value
string
,
opts
map
[
string
]
cmds
.
Option
)
(
interface
{},
error
)
{
func
parseOpt
(
opt
,
value
string
,
opts
map
[
string
]
cmds
.
Option
)
(
string
,
interface
{},
error
)
{
optDef
,
ok
:=
opts
[
opt
]
if
!
ok
{
return
nil
,
fmt
.
Errorf
(
"unknown option %q"
,
opt
)
return
""
,
nil
,
fmt
.
Errorf
(
"unknown option %q"
,
opt
)
}
v
,
err
:=
optDef
.
Parse
(
value
)
if
err
!=
nil
{
return
nil
,
err
return
""
,
nil
,
err
}
return
v
,
nil
return
optDef
.
Name
(),
v
,
nil
}
type
kv
struct
{
...
...
@@ -433,7 +434,7 @@ func (st *parseState) parseShortOpts(optDefs map[string]cmds.Option) ([]kv, erro
if
ok
{
// split at = successful
v
,
err
:=
parseOpt
(
k
,
vStr
,
optDefs
)
k
,
v
,
err
:=
parseOpt
(
k
,
vStr
,
optDefs
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -453,7 +454,7 @@ func (st *parseState) parseShortOpts(optDefs map[string]cmds.Option) ([]kv, erro
case
od
.
Type
()
==
cmds
.
Bool
:
// single char flags for bools
kvs
=
append
(
kvs
,
kv
{
Key
:
flag
,
Key
:
od
.
Name
()
,
Value
:
true
,
})
j
++
...
...
@@ -462,23 +463,23 @@ func (st *parseState) parseShortOpts(optDefs map[string]cmds.Option) ([]kv, erro
// single char flag for non-bools (use the rest of the flag as value)
rest
:=
k
[
j
+
1
:
]
v
,
err
:=
parseOpt
(
flag
,
rest
,
optDefs
)
k
,
v
,
err
:=
parseOpt
(
flag
,
rest
,
optDefs
)
if
err
!=
nil
{
return
nil
,
err
}
kvs
=
append
(
kvs
,
kv
{
Key
:
flag
,
Value
:
v
})
kvs
=
append
(
kvs
,
kv
{
Key
:
k
,
Value
:
v
})
break
LOOP
case
st
.
i
<
len
(
st
.
cmdline
)
-
1
:
// single char flag for non-bools (use the next word as value)
st
.
i
++
v
,
err
:=
parseOpt
(
flag
,
st
.
cmdline
[
st
.
i
],
optDefs
)
k
,
v
,
err
:=
parseOpt
(
flag
,
st
.
cmdline
[
st
.
i
],
optDefs
)
if
err
!=
nil
{
return
nil
,
err
}
kvs
=
append
(
kvs
,
kv
{
Key
:
flag
,
Value
:
v
})
kvs
=
append
(
kvs
,
kv
{
Key
:
k
,
Value
:
v
})
break
LOOP
default
:
...
...
@@ -507,7 +508,7 @@ func (st *parseState) parseLongOpt(optDefs map[string]cmds.Option) (string, inte
}
}
optval
,
err
:=
parseOpt
(
k
,
v
,
optDefs
)
k
,
optval
,
err
:=
parseOpt
(
k
,
v
,
optDefs
)
return
k
,
optval
,
err
}
...
...
cli/parse_test.go
View file @
9b025d03
...
...
@@ -80,6 +80,7 @@ func TestOptionParsing(t *testing.T) {
cmd
:=
&
cmds
.
Command
{
Options
:
[]
cmds
.
Option
{
cmds
.
StringOption
(
"string"
,
"s"
,
"a string"
),
cmds
.
StringOption
(
"flag"
,
"alias"
,
"multiple long"
),
cmds
.
BoolOption
(
"bool"
,
"b"
,
"a bool"
),
cmds
.
StringsOption
(
"strings"
,
"r"
,
"strings array"
),
},
...
...
@@ -156,6 +157,11 @@ func TestOptionParsing(t *testing.T) {
test
(
"defaults"
,
kvs
{
"opt"
:
"def"
},
words
{})
test
(
"defaults -o foo"
,
kvs
{
"opt"
:
"foo"
},
words
{})
test
(
"--flag=foo"
,
kvs
{
"flag"
:
"foo"
},
words
{})
test
(
"--alias=foo"
,
kvs
{
"flag"
:
"foo"
},
words
{})
testFail
(
"--flag=bar --alias=foo"
)
testFail
(
"--alias=bar --flag=foo"
)
testFail
(
"--bad-flag"
)
testFail
(
"--bad-flag="
)
testFail
(
"--bad-flag=xyz"
)
...
...
@@ -636,7 +642,8 @@ func TestFileArgs(t *testing.T) {
cmd
:
words
{
"fileOp"
,
"--ignore"
,
path
.
Base
(
tmpFile2
.
Name
()),
tmpDir1
,
tmpFile1
.
Name
()},
f
:
nil
,
args
:
words
{
tmpDir1
,
tmpFile1
.
Name
(),
tmpFile3
.
Name
()},
parseErr
:
fmt
.
Errorf
(
notRecursiveFmtStr
,
tmpDir1
,
"r"
),
},
{
},
{
cmd
:
words
{
"fileOp"
,
tmpFile1
.
Name
(),
"--ignore"
,
path
.
Base
(
tmpFile2
.
Name
()),
"--ignore"
},
f
:
nil
,
args
:
words
{
tmpDir1
,
tmpFile1
.
Name
(),
tmpFile3
.
Name
()},
parseErr
:
fmt
.
Errorf
(
"missing argument for option %q"
,
"ignore"
),
...
...
go.sum
View file @
9b025d03
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment