Merge branch 'master' into pass-through-regression

This commit is contained in:
lynn (they) 2019-10-16 22:00:49 -07:00 committed by GitHub
commit c30b1cf90b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 10 deletions

View File

@ -691,7 +691,7 @@ The code above will use the "load" string as a flag name to get the file name of
a yaml file from the cli.Context. It will then use that file name to initialize a yaml file from the cli.Context. It will then use that file name to initialize
the yaml input source for any flags that are defined on that command. As a note the yaml input source for any flags that are defined on that command. As a note
the "load" flag used would also have to be defined on the command flags in order the "load" flag used would also have to be defined on the command flags in order
for this code snipped to work. for this code snippet to work.
Currently only YAML, JSON, and TOML files are supported but developers can add support Currently only YAML, JSON, and TOML files are supported but developers can add support
for other input sources by implementing the altsrc.InputSourceContext for their for other input sources by implementing the altsrc.InputSourceContext for their

View File

@ -1,3 +1,5 @@
#compdef $PROG
_cli_zsh_autocomplete() { _cli_zsh_autocomplete() {
local -a opts local -a opts

View File

@ -70,8 +70,13 @@ func TestParseAndRunShortOpts(t *testing.T) {
{[]string{"foo", "test", "-af"}, nil, []string{}}, {[]string{"foo", "test", "-af"}, nil, []string{}},
{[]string{"foo", "test", "-cf"}, nil, []string{}}, {[]string{"foo", "test", "-cf"}, nil, []string{}},
{[]string{"foo", "test", "-acf"}, nil, []string{}}, {[]string{"foo", "test", "-acf"}, nil, []string{}},
{[]string{"foo", "test", "--acf"}, errors.New("flag provided but not defined: -acf"), nil},
{[]string{"foo", "test", "-invalid"}, errors.New("flag provided but not defined: -invalid"), nil}, {[]string{"foo", "test", "-invalid"}, errors.New("flag provided but not defined: -invalid"), nil},
{[]string{"foo", "test", "-acf", "-invalid"}, errors.New("flag provided but not defined: -invalid"), nil},
{[]string{"foo", "test", "--invalid"}, errors.New("flag provided but not defined: -invalid"), nil},
{[]string{"foo", "test", "-acf", "--invalid"}, errors.New("flag provided but not defined: -invalid"), nil},
{[]string{"foo", "test", "-acf", "arg1", "-invalid"}, nil, []string{"arg1", "-invalid"}}, {[]string{"foo", "test", "-acf", "arg1", "-invalid"}, nil, []string{"arg1", "-invalid"}},
{[]string{"foo", "test", "-acf", "arg1", "--invalid"}, nil, []string{"arg1", "--invalid"}},
{[]string{"foo", "test", "-acfi", "not-arg", "arg1", "-invalid"}, nil, []string{"arg1", "-invalid"}}, {[]string{"foo", "test", "-acfi", "not-arg", "arg1", "-invalid"}, nil, []string{"arg1", "-invalid"}},
{[]string{"foo", "test", "-i", "ivalue"}, nil, []string{}}, {[]string{"foo", "test", "-i", "ivalue"}, nil, []string{}},
{[]string{"foo", "test", "-i", "ivalue", "arg1"}, nil, []string{"arg1"}}, {[]string{"foo", "test", "-i", "ivalue", "arg1"}, nil, []string{"arg1"}},

View File

@ -22,28 +22,35 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string) error {
} }
errStr := err.Error() errStr := err.Error()
trimmed := strings.TrimPrefix(errStr, "flag provided but not defined: ") trimmed := strings.TrimPrefix(errStr, "flag provided but not defined: -")
if errStr == trimmed { if errStr == trimmed {
return err return err
} }
// regenerate the initial args with the split short opts // regenerate the initial args with the split short opts
newArgs := []string{} argsWereSplit := false
for i, arg := range args { for i, arg := range args {
if arg != trimmed { // skip args that are not part of the error message
newArgs = append(newArgs, arg) if name := strings.TrimLeft(arg, "-"); name != trimmed {
continue continue
} }
shortOpts := splitShortOptions(set, trimmed) // if we can't split, the error was accurate
shortOpts := splitShortOptions(set, arg)
if len(shortOpts) == 1 { if len(shortOpts) == 1 {
return err return err
} }
// add each short option and all remaining arguments // swap current argument with the split version
newArgs = append(newArgs, shortOpts...) args = append(args[:i], append(shortOpts, args[i+1:]...)...)
newArgs = append(newArgs, args[i+1:]...) argsWereSplit = true
args = newArgs break
}
// This should be an impossible to reach code path, but in case the arg
// splitting failed to happen, this will prevent infinite loops
if !argsWereSplit {
return err
} }
// Since custom parsing failed, replace the flag set before retrying // Since custom parsing failed, replace the flag set before retrying