Skip to content

Commit

Permalink
Fix:(issue_1500). Fix slice flag value duplication issue
Browse files Browse the repository at this point in the history
  • Loading branch information
dearchap committed Sep 29, 2022
1 parent de83493 commit 3c641d4
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 9 deletions.
31 changes: 31 additions & 0 deletions app_test.go
Expand Up @@ -956,6 +956,37 @@ func TestApp_UseShortOptionHandlingSubCommand_missing_value(t *testing.T) {
expect(t, err, errors.New("flag needs an argument: -n"))
}

func TestApp_UseShortOptionAfterSliceFlag(t *testing.T) {
var one, two bool
var name string
var sliceValDest StringSlice
var sliceVal []string
expected := "expectedName"

app := newTestApp()
app.UseShortOptionHandling = true
app.Flags = []Flag{
&StringSliceFlag{Name: "env", Aliases: []string{"e"}, Destination: &sliceValDest},
&BoolFlag{Name: "one", Aliases: []string{"o"}},
&BoolFlag{Name: "two", Aliases: []string{"t"}},
&StringFlag{Name: "name", Aliases: []string{"n"}},
}
app.Action = func(c *Context) error {
sliceVal = c.StringSlice("env")
one = c.Bool("one")
two = c.Bool("two")
name = c.String("name")
return nil
}

_ = app.Run([]string{"", "-e", "foo", "-on", expected})
expect(t, sliceVal, []string{"foo"})
expect(t, sliceValDest.Value(), []string{"foo"})
expect(t, one, true)
expect(t, two, false)
expect(t, name, expected)
}

func TestApp_Float64Flag(t *testing.T) {
var meters float64

Expand Down
42 changes: 34 additions & 8 deletions godoc-current.txt
Expand Up @@ -458,6 +458,8 @@ type BoolFlag struct {
EnvVars []string

Count *int

Action func(*Context, bool) error
}
BoolFlag is a flag with type bool

Expand Down Expand Up @@ -565,7 +567,6 @@ type Command struct {
// cli.go uses text/template to render templates. You can
// render custom help text by setting this variable.
CustomHelpTemplate string

// Has unexported fields.
}
Command is a subcommand for a cli.App.
Expand All @@ -584,13 +585,6 @@ func (c *Command) Run(ctx *Context) (err error)
Run invokes the command given the context, parses ctx.Args() to generate
command-specific flags

func (c *Command) VisibleCategories() []CommandCategory
VisibleCategories returns a slice of categories and commands that are
Hidden=false

func (c *Command) VisibleCommands() []*Command
VisibleCommands returns a slice of the Commands with Hidden=false

func (c *Command) VisibleFlagCategories() []VisibleFlagCategory
VisibleFlagCategories returns a slice containing all the visible flag
categories with the flags they contain
Expand Down Expand Up @@ -776,6 +770,8 @@ type DurationFlag struct {

Aliases []string
EnvVars []string

Action func(*Context, time.Duration) error
}
DurationFlag is a flag with type time.Duration

Expand Down Expand Up @@ -952,6 +948,8 @@ type Float64Flag struct {

Aliases []string
EnvVars []string

Action func(*Context, float64) error
}
Float64Flag is a flag with type float64

Expand Down Expand Up @@ -1038,6 +1036,8 @@ type Float64SliceFlag struct {

Aliases []string
EnvVars []string

Action func(*Context, []float64) error
}
Float64SliceFlag is a flag with type *Float64Slice

Expand Down Expand Up @@ -1115,6 +1115,8 @@ type GenericFlag struct {
EnvVars []string

TakesFile bool

Action func(*Context, interface{}) error
}
GenericFlag is a flag with type Generic

Expand Down Expand Up @@ -1181,6 +1183,8 @@ type Int64Flag struct {
EnvVars []string

Base int

Action func(*Context, int64) error
}
Int64Flag is a flag with type int64

Expand Down Expand Up @@ -1267,6 +1271,8 @@ type Int64SliceFlag struct {

Aliases []string
EnvVars []string

Action func(*Context, []int64) error
}
Int64SliceFlag is a flag with type *Int64Slice

Expand Down Expand Up @@ -1338,6 +1344,8 @@ type IntFlag struct {
EnvVars []string

Base int

Action func(*Context, int) error
}
IntFlag is a flag with type int

Expand Down Expand Up @@ -1428,6 +1436,8 @@ type IntSliceFlag struct {

Aliases []string
EnvVars []string

Action func(*Context, []int) error
}
IntSliceFlag is a flag with type *IntSlice

Expand Down Expand Up @@ -1533,6 +1543,8 @@ type PathFlag struct {
EnvVars []string

TakesFile bool

Action func(*Context, Path) error
}
PathFlag is a flag with type Path

Expand Down Expand Up @@ -1673,6 +1685,8 @@ type StringFlag struct {
EnvVars []string

TakesFile bool

Action func(*Context, string) error
}
StringFlag is a flag with type string

Expand Down Expand Up @@ -1761,6 +1775,8 @@ type StringSliceFlag struct {
EnvVars []string

TakesFile bool

Action func(*Context, []string) error
}
StringSliceFlag is a flag with type *StringSlice

Expand Down Expand Up @@ -1867,6 +1883,8 @@ type TimestampFlag struct {
Layout string

Timezone *time.Location

Action func(*Context, *time.Time) error
}
TimestampFlag is a flag with type *Timestamp

Expand Down Expand Up @@ -1932,6 +1950,8 @@ type Uint64Flag struct {
EnvVars []string

Base int

Action func(*Context, uint64) error
}
Uint64Flag is a flag with type uint64

Expand Down Expand Up @@ -2018,6 +2038,8 @@ type Uint64SliceFlag struct {

Aliases []string
EnvVars []string

Action func(*Context, []uint64) error
}
Uint64SliceFlag is a flag with type *Uint64Slice

Expand Down Expand Up @@ -2080,6 +2102,8 @@ type UintFlag struct {
EnvVars []string

Base int

Action func(*Context, uint) error
}
UintFlag is a flag with type uint

Expand Down Expand Up @@ -2170,6 +2194,8 @@ type UintSliceFlag struct {

Aliases []string
EnvVars []string

Action func(*Context, []uint) error
}
UintSliceFlag is a flag with type *UintSlice

Expand Down
5 changes: 4 additions & 1 deletion parse.go
Expand Up @@ -46,7 +46,10 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComple
}

// swap current argument with the split version
args = append(args[:i], append(shortOpts, args[i+1:]...)...)
// do not include args that parsed correctly so far as it would
// trigger Value.Set() on those args and would result in
// duplicates for slice type flags
args = append(shortOpts, args[i+1:]...)
argsWereSplit = true
break
}
Expand Down

0 comments on commit 3c641d4

Please sign in to comment.