Skip to content

Commit

Permalink
internal/flags: fix issue with stringslice migration (#25830)
Browse files Browse the repository at this point in the history
This fixes a cornercase bug where the flag migration would mess
up the value of StringSlice flags.
  • Loading branch information
holiman authored Sep 29, 2022
1 parent f651d6d commit 07e0704
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion internal/flags/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,10 +94,34 @@ func MigrateGlobalFlags(ctx *cli.Context) {
}

func doMigrateFlags(ctx *cli.Context) {
// Figure out if there are any aliases of commands. If there are, we want
// to ignore them when iterating over the flags.
var aliases = make(map[string]bool)
for _, fl := range ctx.Command.Flags {
for _, alias := range fl.Names()[1:] {
aliases[alias] = true
}
}
for _, name := range ctx.FlagNames() {
for _, parent := range ctx.Lineage()[1:] {
if parent.IsSet(name) {
ctx.Set(name, parent.String(name))
// When iterating across the lineage, we will be served both
// the 'canon' and alias formats of all commmands. In most cases,
// it's fine to set it in the ctx multiple times (one for each
// name), however, the Slice-flags are not fine.
// The slice-flags accumulate, so if we set it once as
// "foo" and once as alias "F", then both will be present in the slice.
if _, isAlias := aliases[name]; isAlias {
continue
}
// If it is a string-slice, we need to set it as
// "alfa, beta, gamma" instead of "[alfa beta gamma]", in order
// for the backing StringSlice to parse it properly.
if result := parent.StringSlice(name); len(result) > 0 {
ctx.Set(name, strings.Join(result, ","))
} else {
ctx.Set(name, parent.String(name))
}
break
}
}
Expand Down

0 comments on commit 07e0704

Please sign in to comment.