diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 207572621f..0c89d9a4ce 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -929,31 +929,41 @@ func setEthash(ctx *cli.Context, cfg *eth.Config) { } } +// checkExclusive verifies that only a single isntance of the provided flags was +// set by the user. Each flag might optionally be followed by a string type to +// specialize it further. func checkExclusive(ctx *cli.Context, args ...interface{}) { set := make([]string, 0, 1) - for i, arg := range args { - if flag, ok := arg.(cli.Flag); ok { - if ctx.GlobalIsSet(flag.GetName()) { - // Check if next arg extends current - if len(args) > i+1 { - switch option := args[i+1].(type) { - case cli.Flag: - set = append(set, `"--`+flag.GetName()+`"`) - case string: - if ctx.GlobalString(flag.GetName()) == option { - set = append(set, `"--`+flag.GetName()+` `+option+`"`) - } - default: - Fatalf("Received wrong type in checkExclusive") - } - } else { - set = append(set, `"--`+flag.GetName()+`"`) + for i := 0; i < len(args); i++ { + // Make sure the next argument is a flag and skip if not set + flag, ok := args[i].(cli.Flag) + if !ok { + panic(fmt.Sprintf("invalid argument, not cli.Flag type: %T", args[i])) + } + // Check if next arg extends current and expand its name if so + name := flag.GetName() + + if i+1 < len(args) { + switch option := args[i+1].(type) { + case string: + // Extended flag, expand the name and shift the arguments + if ctx.GlobalString(flag.GetName()) == option { + name += "=" + option } + i++ + + case cli.Flag: + default: + panic(fmt.Sprintf("invalid argument, not cli.Flag or string extension: %T", args[i+1])) } } + // Mark the flag if it's set + if ctx.GlobalIsSet(flag.GetName()) { + set = append(set, "--"+name) + } } if len(set) > 1 { - Fatalf("flags %v can't be used at the same time", strings.Join(set, ", ")) + Fatalf("Flags %v can't be used at the same time", strings.Join(set, ", ")) } }