Handle linebreaks in custom completions. (#1162)

If a command/flag description contains
a linebreak then the shell completion script
will interpret this as new command/flag.

To fix this we only use the first line
from the description in the output.

Signed-off-by: Paul Holzinger <paul.holzinger@web.de>
This commit is contained in:
Luap99 2020-09-09 19:27:42 +02:00 committed by GitHub
parent 50258f15eb
commit 8a63648dd9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 1 deletions

View File

@ -132,6 +132,12 @@ func (c *Command) initCompleteCmd(args []string) {
comp = strings.Split(comp, "\t")[0] comp = strings.Split(comp, "\t")[0]
} }
// Make sure we only write the first line to the output.
// This is needed if a description contains a linebreak.
// Otherwise the shell scripts will interpret the other lines as new flags
// and could therefore provide a wrong completion.
comp = strings.Split(comp, "\n")[0]
// Finally trim the completion. This is especially important to get rid // Finally trim the completion. This is especially important to get rid
// of a trailing tab when there are no description following it. // of a trailing tab when there are no description following it.
// For example, a sub-command without a description should not be completed // For example, a sub-command without a description should not be completed

View File

@ -561,7 +561,7 @@ func TestFlagNameCompletionInGoWithDesc(t *testing.T) {
} }
rootCmd.AddCommand(childCmd) rootCmd.AddCommand(childCmd)
rootCmd.Flags().IntP("first", "f", -1, "first flag") rootCmd.Flags().IntP("first", "f", -1, "first flag\nlonger description for flag")
rootCmd.PersistentFlags().BoolP("second", "s", false, "second flag") rootCmd.PersistentFlags().BoolP("second", "s", false, "second flag")
childCmd.Flags().String("subFlag", "", "sub flag") childCmd.Flags().String("subFlag", "", "sub flag")