@@ -398,34 +398,74 @@ const (
398398)
399399
400400// argName returns the flag name from a --key or --key=value argument.
401+ // Returns "" for bare values that don't start with --.
401402func argName (arg string ) string {
403+ if ! strings .HasPrefix (arg , "--" ) {
404+ return ""
405+ }
402406 arg = strings .TrimPrefix (arg , "--" )
403407 if i := strings .Index (arg , "=" ); i >= 0 {
404408 return arg [:i ]
405409 }
406410 return arg
407411}
408412
413+ type flagGroup struct {
414+ name string
415+ elems []string
416+ }
417+
418+ // parseArgs groups a flat argument list into logical flags.
419+ // "--key=val" is one group; "--key val" (space-separated) is one group;
420+ // "--bool-flag" is one group.
421+ func parseArgs (args []string ) []flagGroup {
422+ var groups []flagGroup
423+ for i := 0 ; i < len (args ); i ++ {
424+ n := argName (args [i ])
425+ if n == "" {
426+ continue
427+ }
428+ g := flagGroup {name : n , elems : []string {args [i ]}}
429+ // --key value: flag without "=" whose next element is a value, not another flag
430+ if ! strings .Contains (args [i ], "=" ) && i + 1 < len (args ) && ! strings .HasPrefix (args [i + 1 ], "--" ) {
431+ g .elems = append (g .elems , args [i + 1 ])
432+ i ++
433+ }
434+ // --key=value or --bool-flag: single-element group (no special handling needed)
435+ groups = append (groups , g )
436+ }
437+ return groups
438+ }
439+
409440// mergeArgs merges newArgs into oldArgs. Existing flags whose name
410441// matches a new flag are replaced; unmatched new flags are appended.
442+ // Handles both --key=value and --key value forms.
411443func mergeArgs (oldArgs , newArgs []string ) []string {
412- newByName := make (map [string ]string , len (newArgs ))
413- for _ , a := range newArgs {
414- newByName [argName (a )] = a
444+ newGroups := parseArgs (newArgs )
445+ newByName := make (map [string ]flagGroup , len (newGroups ))
446+ for _ , g := range newGroups {
447+ if g .name != "" {
448+ newByName [g .name ] = g
449+ }
415450 }
416451
452+ oldGroups := parseArgs (oldArgs )
417453 var result []string
418- for _ , a := range oldArgs {
419- if replacement , ok := newByName [argName (a )]; ok {
420- result = append (result , replacement )
421- delete (newByName , argName (a ))
422- } else {
423- result = append (result , a )
454+ for _ , g := range oldGroups {
455+ if g .name != "" {
456+ if replacement , ok := newByName [g .name ]; ok {
457+ result = append (result , replacement .elems ... )
458+ delete (newByName , g .name )
459+ continue
460+ }
424461 }
462+ result = append (result , g .elems ... )
425463 }
426- for _ , a := range newArgs {
427- if _ , ok := newByName [argName (a )]; ok {
428- result = append (result , a )
464+ for _ , g := range newGroups {
465+ if g .name != "" {
466+ if _ , ok := newByName [g .name ]; ok {
467+ result = append (result , g .elems ... )
468+ }
429469 }
430470 }
431471 return result
0 commit comments