diff --git a/go/libraries/utils/argparser/parser.go b/go/libraries/utils/argparser/parser.go index ce392175f2..c38b290cfe 100644 --- a/go/libraries/utils/argparser/parser.go +++ b/go/libraries/utils/argparser/parser.go @@ -225,12 +225,20 @@ func (ap *ArgParser) sortedValueOptions() []string { return vos } -func (ap *ArgParser) matchValueOption(arg string) (match *Option, value *string) { +func (ap *ArgParser) matchValueOption(arg string, isLongFormFlag bool) (match *Option, value *string) { + for _, on := range ap.sortedValueOptions() { lo := len(on) isMatch := len(arg) >= lo && arg[:lo] == on if isMatch { v := arg[lo:] + if len(v) > 0 && !strings.Contains(optNameValDelimChars, v[:1]) { // checks if the value and the param is in the same string + // we only allow joint param and value for long form flags (ie "--" flags), similar to Git's behavior + if !isLongFormFlag { + return nil, nil + } + } + v = strings.TrimLeft(v, optNameValDelimChars) if len(v) > 0 { value = &v @@ -252,6 +260,7 @@ func (ap *ArgParser) Parse(args []string) (*ArgParseResults, error) { i := 0 for ; i < len(args); i++ { arg := args[i] + isLongFormFlag := len(arg) >= 2 && arg[:2] == "--" if len(arg) == 0 || arg[0] != '-' || arg == "--" { // empty strings should get passed through like other naked words list = append(list, arg) @@ -274,7 +283,7 @@ func (ap *ArgParser) Parse(args []string) (*ArgParseResults, error) { results[opt.Name] = "" } - opt, value := ap.matchValueOption(rest) + opt, value := ap.matchValueOption(rest, isLongFormFlag) if opt == nil { if rest == "" { diff --git a/go/libraries/utils/argparser/parser_test.go b/go/libraries/utils/argparser/parser_test.go index 10c77424b2..afa4604303 100644 --- a/go/libraries/utils/argparser/parser_test.go +++ b/go/libraries/utils/argparser/parser_test.go @@ -78,6 +78,20 @@ func TestArgParser(t *testing.T) { map[string]string{"param": "value"}, []string{"arg1"}, }, + { + NewArgParser().SupportsString("param", "p", "", ""), + []string{"-pvalue"}, + UnknownArgumentParam{"pvalue"}, + map[string]string{}, + []string{}, + }, + { + NewArgParser().SupportsString("param", "p", "", ""), + []string{"--paramvalue"}, + nil, + map[string]string{"param": "value"}, + []string{}, + }, } for _, test := range tests {