From 2bcf1dd46e03d857b1bbb81e1199d1a0f8d72875 Mon Sep 17 00:00:00 2001 From: Tim Soethout Date: Thu, 19 Mar 2026 11:14:04 +0100 Subject: [PATCH 1/2] Fix: correct function and variable naming in fish completion script --- autocomplete/fish_autocomplete | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autocomplete/fish_autocomplete b/autocomplete/fish_autocomplete index 7aa7d0a8ba..6714f75e0b 100644 --- a/autocomplete/fish_autocomplete +++ b/autocomplete/fish_autocomplete @@ -1,6 +1,6 @@ # This is a shell completion script auto-generated by https://github.com/urfave/cli for fish. -function __%[1]_perform_completion +function __%[1]s_perform_completion # Extract all args except the last one set -l args (commandline -opc) # Extract the last arg (partial input) @@ -18,18 +18,18 @@ function __%[1]_perform_completion end for line in $results - if not string match -q -- "%[1]*" $line + if not string match -q -- "%[1]s*" $line set -l parts (string split -m 1 ":" -- "$line") if test (count $parts) -eq 2 - printf "%s\t%s\n" "$parts[1]" "$parts[2]" + printf "%%s\t%%s\n" "$parts[1]" "$parts[2]" else - printf "%s\n" "$line" + printf "%%s\n" "$line" end end end end -# Clear existing completions for %[1] -complete -c %[1] -e +# Clear existing completions for %[1]s +complete -c %[1]s -e # Register completion function -complete -c %[1] -f -a '(__%[1]_perform_completion)' \ No newline at end of file +complete -c %[1]s -f -a '(__%[1]s_perform_completion)' \ No newline at end of file From ace427c4b3cbed12cf7f7871a78b6f7e727962fd Mon Sep 17 00:00:00 2001 From: Tim Soethout Date: Mon, 23 Mar 2026 10:12:00 +0100 Subject: [PATCH 2/2] commit regression test --- completion_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/completion_test.go b/completion_test.go index 17112d02fa..62ed465dc9 100644 --- a/completion_test.go +++ b/completion_test.go @@ -63,6 +63,36 @@ func TestCompletionShell(t *testing.T) { } } +func TestCompletionFishFormat(t *testing.T) { + // Regression test for https://github.com/urfave/cli/issues/2285 + // Fish completion was broken due to incorrect format specifiers + + cmd := &Command{ + Name: "myapp", + EnableShellCompletion: true, + } + + r := require.New(t) + + // Test the fish shell completion renderer directly + fishRender := shellCompletions["fish"] + r.NotNil(fishRender, "fish completion renderer should exist") + + output, err := fishRender(cmd, "myapp") + r.NoError(err) + + // Verify the function name is correctly formatted + r.Contains(output, "function __myapp_perform_completion", "function name should contain app name") + + // Verify no format errors (like %! or (string=) which indicate broken fmt.Sprintf) + r.NotContains(output, "%!", "output should not contain format errors") + r.NotContains(output, "(string=", "output should not contain invalid fish syntax") + + // Verify the complete commands reference the app correctly + r.Contains(output, "complete -c myapp", "complete command should reference app name") + r.Contains(output, "(__myapp_perform_completion)", "completion function should be registered") +} + func TestCompletionSubcommand(t *testing.T) { tests := []struct { name string