fix(context): copy StringSlice Flag correctly

main
Yicheng Qin 10 years ago
parent 4097aa09fe
commit ce13660ae0

@ -197,6 +197,7 @@ func lookupBool(name string, set *flag.FlagSet) bool {
return false
}
func lookupBoolT(name string, set *flag.FlagSet) bool {
f := set.Lookup(name)
if f != nil {
@ -210,6 +211,14 @@ func lookupBoolT(name string, set *flag.FlagSet) bool {
return false
}
func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {
switch ff.Value.(type) {
case *StringSlice:
default:
set.Set(name, ff.Value.String())
}
}
func normalizeFlags(flags []Flag, set *flag.FlagSet) error {
visited := make(map[string]bool)
set.Visit(func(f *flag.Flag) {
@ -235,7 +244,9 @@ func normalizeFlags(flags []Flag, set *flag.FlagSet) error {
}
for _, name := range parts {
name = strings.Trim(name, " ")
set.Set(name, ff.Value.String())
if !visited[name] {
copyFlag(name, ff, set)
}
}
}
return nil

@ -2,6 +2,7 @@ package cli_test
import (
"github.com/codegangsta/cli"
"reflect"
"testing"
)
@ -101,6 +102,22 @@ func TestParseMultiString(t *testing.T) {
}).Run([]string{"run", "-s", "10"})
}
func TestParseMultiStringSlice(t *testing.T) {
(&cli.App{
Flags: []cli.Flag{
cli.StringSliceFlag{Name: "serve, s", Value: &cli.StringSlice{}},
},
Action: func(ctx *cli.Context) {
if !reflect.DeepEqual(ctx.StringSlice("serve"), []string{"10", "20"}) {
t.Errorf("main name not set")
}
if !reflect.DeepEqual(ctx.StringSlice("s"), []string{"10", "20"}) {
t.Errorf("short name not set")
}
},
}).Run([]string{"run", "-s", "10", "-s", "20"})
}
func TestParseMultiInt(t *testing.T) {
a := cli.App{
Flags: []cli.Flag{

Loading…
Cancel
Save