Merge pull request #28251 from hashicorp/jbardin/auto-complete

don't error when given autocomplete commands
This commit is contained in:
James Bardin 2021-03-31 14:58:32 -04:00 committed by GitHub
commit 51c7aff475
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 1 deletions

View File

@ -357,7 +357,12 @@ func wrappedMain() int {
// where a command isn't found, because it's likely more helpful to // where a command isn't found, because it's likely more helpful to
// mention what specifically went wrong, rather than just printing out // mention what specifically went wrong, rather than just printing out
// a big block of usage information.) // a big block of usage information.)
if cmd := cliRunner.Subcommand(); cmd != "" {
// Check if this is being run via shell auto-complete, which uses the
// binary name as the first argument and won't be listed as a subcommand.
autoComplete := os.Getenv("COMP_LINE") != ""
if cmd := cliRunner.Subcommand(); cmd != "" && !autoComplete {
// Due to the design of cli.CLI, this special error message only works // Due to the design of cli.CLI, this special error message only works
// for typos of top-level commands. For a subcommand typo, like // for typos of top-level commands. For a subcommand typo, like
// "terraform state posh", cmd would be "state" here and thus would // "terraform state posh", cmd would be "state" here and thus would

View File

@ -253,6 +253,34 @@ func TestMain_cliArgsFromEnvAdvanced(t *testing.T) {
} }
} }
// verify that we output valid autocomplete results
func TestMain_autoComplete(t *testing.T) {
// Restore original CLI args
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
// Set up test command and restore that
Commands = make(map[string]cli.CommandFactory)
defer func() {
Commands = nil
}()
// Set up test command and restore that
Commands["foo"] = func() (cli.Command, error) {
return &testCommandCLI{}, nil
}
os.Setenv("COMP_LINE", "terraform versio")
defer os.Unsetenv("COMP_LINE")
// Run it!
os.Args = []string{"terraform", "terraform", "versio"}
exit := wrappedMain()
if exit != 0 {
t.Fatalf("unexpected exit status %d; want 0", exit)
}
}
type testCommandCLI struct { type testCommandCLI struct {
Args []string Args []string
} }