From 542793a53421ea6d9a9b0b6d46cb7c6deb3ea03f Mon Sep 17 00:00:00 2001 From: Johannes Altmanninger Date: Tue, 25 Mar 2025 09:58:32 +0100 Subject: [PATCH] completions/git: fix arg completion for third-party git commands, again Commit 50e595503e (completions/git: fix completions for third-party git commands, 2025-03-03) wasn't quite right, as we can see in the linked reproduction: $ fish_trace=1 complete -C 'git machete add --onto ' ----> complete -C git-machete\ add\n--onto\ The recursive completion invocation contains a spurious newline, which means that "--onto" is the command name. The newline is produced by "string escape -- add --onto" inside a command substitution. Fix this by interpreting newlines as list separators, and then joining by spaces. Fixes #11319 (cherry picked from commit 360cfdb7ae7af9a73cc3f357a78bd35b5b12e829) --- share/completions/git.fish | 4 ++-- tests/checks/git.fish | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/share/completions/git.fish b/share/completions/git.fish index 592d358b2..89057e342 100644 --- a/share/completions/git.fish +++ b/share/completions/git.fish @@ -2571,9 +2571,9 @@ function __fish_git_complete_custom_command -a subcommand set -e cmd[1] # Drop "git". set -l subcommand_args if argparse -s (__fish_git_global_optspecs) -- $cmd - set subcommand_args $argv[2..] # Drop the subcommand. + set subcommand_args (string escape -- $argv[2..]) # Drop the subcommand. end - complete -C "git-$subcommand $(string escape -- $subcommand_args) "(commandline -ct) + complete -C "git-$subcommand $subcommand_args "(commandline -ct) end # source git-* commands' autocompletion file if exists diff --git a/tests/checks/git.fish b/tests/checks/git.fish index 5e3d71cf3..4af64cd4f 100644 --- a/tests/checks/git.fish +++ b/tests/checks/git.fish @@ -51,6 +51,10 @@ complete -C'git frobnicate --onto ' #CHECK: onto1 #CHECK: onto2 +complete -C'git frobnicate graft --onto ' +#CHECK: onto1 +#CHECK: onto2 + complete -C'git ' | grep '^add'\t # (note: actual tab character in the check here) #CHECK: add Add file contents to the staging area