From 4bbff841690954ed86c147147151c0144dcf1765 Mon Sep 17 00:00:00 2001 From: Sascha Grunert Date: Thu, 29 Aug 2019 14:45:32 +0200 Subject: [PATCH] Escape single quotes in fish shell completion Single quotes can break the generated fish shell completion and should be escaped correctly. Signed-off-by: Sascha Grunert --- docs_test.go | 2 +- fish.go | 10 ++++++++-- testdata/expected-doc-full.man | 2 +- testdata/expected-doc-full.md | 2 +- testdata/expected-doc-no-commands.md | 2 +- testdata/expected-fish-full.fish | 2 +- 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/docs_test.go b/docs_test.go index 25afd23909..6ffc995cb8 100644 --- a/docs_test.go +++ b/docs_test.go @@ -11,7 +11,7 @@ func testApp() *App { app.Flags = []Flag{ StringFlag{ Name: "socket, s", - Usage: "some usage text", + Usage: "some 'usage' text", Value: "value", TakesFile: true, }, diff --git a/fish.go b/fish.go index 166435c0d2..1121a209d3 100644 --- a/fish.go +++ b/fish.go @@ -78,7 +78,8 @@ func (a *App) prepareFishCommands(commands []Command, allCommands *[]string, pre )) if command.Usage != "" { - completion.WriteString(fmt.Sprintf(" -d '%s'", command.Usage)) + completion.WriteString(fmt.Sprintf(" -d '%s'", + escapeSingleQuotes(command.Usage))) } if !command.HideHelp { @@ -144,7 +145,8 @@ func (a *App) prepareFishFlags(flags []Flag, previousCommands []string) []string } if flag.GetUsage() != "" { - completion.WriteString(fmt.Sprintf(" -d '%s'", flag.GetUsage())) + completion.WriteString(fmt.Sprintf(" -d '%s'", + escapeSingleQuotes(flag.GetUsage()))) } completions = append(completions, completion.String()) @@ -182,3 +184,7 @@ func (a *App) fishSubcommandHelper(allCommands []string) string { return fishHelper } + +func escapeSingleQuotes(input string) string { + return strings.Replace(input, `'`, `\'`, -1) +} diff --git a/testdata/expected-doc-full.man b/testdata/expected-doc-full.man index a2d0e6dbac..5190698fa3 100644 --- a/testdata/expected-doc-full.man +++ b/testdata/expected-doc-full.man @@ -49,7 +49,7 @@ greet [GLOBAL OPTIONS] command [COMMAND OPTIONS] [ARGUMENTS...] \fB\-\-flag, \-\-fl, \-f\fP="": .PP -\fB\-\-socket, \-s\fP="": some usage text (default: value) +\fB\-\-socket, \-s\fP="": some 'usage' text (default: value) .SH COMMANDS diff --git a/testdata/expected-doc-full.md b/testdata/expected-doc-full.md index 8fb9f589d5..23d7c23745 100644 --- a/testdata/expected-doc-full.md +++ b/testdata/expected-doc-full.md @@ -32,7 +32,7 @@ greet [GLOBAL OPTIONS] command [COMMAND OPTIONS] [ARGUMENTS...] **--flag, --fl, -f**="": -**--socket, -s**="": some usage text (default: value) +**--socket, -s**="": some 'usage' text (default: value) # COMMANDS diff --git a/testdata/expected-doc-no-commands.md b/testdata/expected-doc-no-commands.md index dba7bb067e..18d8e357e8 100644 --- a/testdata/expected-doc-no-commands.md +++ b/testdata/expected-doc-no-commands.md @@ -32,5 +32,5 @@ greet [GLOBAL OPTIONS] command [COMMAND OPTIONS] [ARGUMENTS...] **--flag, --fl, -f**="": -**--socket, -s**="": some usage text (default: value) +**--socket, -s**="": some 'usage' text (default: value) diff --git a/testdata/expected-fish-full.fish b/testdata/expected-fish-full.fish index bda03228f2..b18d51e8fe 100644 --- a/testdata/expected-fish-full.fish +++ b/testdata/expected-fish-full.fish @@ -9,7 +9,7 @@ function __fish_greet_no_subcommand --description 'Test if there has been any su return 0 end -complete -c greet -n '__fish_greet_no_subcommand' -l socket -s s -r -d 'some usage text' +complete -c greet -n '__fish_greet_no_subcommand' -l socket -s s -r -d 'some \'usage\' text' complete -c greet -n '__fish_greet_no_subcommand' -f -l flag -s fl -s f -r complete -c greet -n '__fish_greet_no_subcommand' -f -l another-flag -s b -d 'another usage text' complete -c greet -n '__fish_greet_no_subcommand' -f -l help -s h -d 'show help'