completions: do not detect arguments with dash as 2nd char as flag (#1817)
Fixes #1816 Previously, arguments with a dash as the second character (e.g., 1-ff00:0:1) were detected as a flag by mistake. This resulted in auto completion misbehaving if such an argument was last in the argument list during invocation.
This commit is contained in:
		@ -692,7 +692,7 @@ Loop:
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func isFlagArg(arg string) bool {
 | 
					func isFlagArg(arg string) bool {
 | 
				
			||||||
	return ((len(arg) >= 3 && arg[1] == '-') ||
 | 
						return ((len(arg) >= 3 && arg[0:2] == "--") ||
 | 
				
			||||||
		(len(arg) >= 2 && arg[0] == '-' && arg[1] != '-'))
 | 
							(len(arg) >= 2 && arg[0] == '-' && arg[1] != '-'))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -3115,3 +3115,67 @@ func TestCompletionCobraFlags(t *testing.T) {
 | 
				
			|||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestArgsNotDetectedAsFlagsCompletionInGo(t *testing.T) {
 | 
				
			||||||
 | 
						// Regression test that ensures the bug described in
 | 
				
			||||||
 | 
						// https://github.com/spf13/cobra/issues/1816 does not occur anymore.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						root := Command{
 | 
				
			||||||
 | 
							Use: "root",
 | 
				
			||||||
 | 
							ValidArgsFunction: func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
 | 
				
			||||||
 | 
								return []string{"service", "1-123", "11-123"}, ShellCompDirectiveNoFileComp
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						completion := `service
 | 
				
			||||||
 | 
					1-123
 | 
				
			||||||
 | 
					11-123
 | 
				
			||||||
 | 
					:4
 | 
				
			||||||
 | 
					Completion ended with directive: ShellCompDirectiveNoFileComp
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						testcases := []struct {
 | 
				
			||||||
 | 
							desc           string
 | 
				
			||||||
 | 
							args           []string
 | 
				
			||||||
 | 
							expectedOutput string
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								desc:           "empty",
 | 
				
			||||||
 | 
								args:           []string{""},
 | 
				
			||||||
 | 
								expectedOutput: completion,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								desc:           "service only",
 | 
				
			||||||
 | 
								args:           []string{"service", ""},
 | 
				
			||||||
 | 
								expectedOutput: completion,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								desc:           "service last",
 | 
				
			||||||
 | 
								args:           []string{"1-123", "service", ""},
 | 
				
			||||||
 | 
								expectedOutput: completion,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								desc:           "two digit prefixed dash last",
 | 
				
			||||||
 | 
								args:           []string{"service", "11-123", ""},
 | 
				
			||||||
 | 
								expectedOutput: completion,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								desc:           "one digit prefixed dash last",
 | 
				
			||||||
 | 
								args:           []string{"service", "1-123", ""},
 | 
				
			||||||
 | 
								expectedOutput: completion,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, tc := range testcases {
 | 
				
			||||||
 | 
							t.Run(tc.desc, func(t *testing.T) {
 | 
				
			||||||
 | 
								args := []string{ShellCompNoDescRequestCmd}
 | 
				
			||||||
 | 
								args = append(args, tc.args...)
 | 
				
			||||||
 | 
								output, err := executeCommand(&root, args...)
 | 
				
			||||||
 | 
								switch {
 | 
				
			||||||
 | 
								case err == nil && output != tc.expectedOutput:
 | 
				
			||||||
 | 
									t.Errorf("expected: %q, got: %q", tc.expectedOutput, output)
 | 
				
			||||||
 | 
								case err != nil:
 | 
				
			||||||
 | 
									t.Errorf("Unexpected error %q", err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user