Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix:(issue_1500). Fix slice flag value duplication issue #1502

Merged
merged 4 commits into from Oct 6, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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
12 changes: 4 additions & 8 deletions 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 All @@ -56,13 +59,6 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComple
if !argsWereSplit {
return err
}

// Since custom parsing failed, replace the flag set before retrying
newSet, err := ip.newFlagSet()
if err != nil {
return err
}
*set = *newSet
}
}

Expand Down