[POC PATCH 5/5] completion: avoid compgen to fix expansion issues in __gitcomp_nl()
- From
SZEDER Gábor <szeder@ira.uka.de>
- Date
- Sep 28, 2012, 10:09 UTC
- Message-ID
- <1348826975-2225-5-git-send-email-szeder@ira.uka.de>
- In-Reply-To
- <1348826975-2225-1-git-send-email-szeder@ira.uka.de>
compgen performs expansion on all words in the list given to its -W option. This breaks completion in various ways if one of those words can be expanded, as demonstrated by failing tests added in a previous commit.
In __gitcomp_nl() we use only a small subset of compgen's functionality: to filter matching possible completion words, and to add a prefix and/or suffix to each of them. Since the list of words is newline-separated, we can do all these just as well with a little sed script. This way we can get rid of compgen and its additional expansion of all words and don't need to perform excessive quoting to circumvent it.
Signed-off-by: SZEDER Gábor <szeder@ira.uka.de> ---
We can also get rid of compgen in __gitcomp(); I already have working code for that, but it still needs a bit of cleanup and commit messages.
contrib/completion/git-completion.bash | 6 +++++- t/t9902-completion.sh | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index be800e09..2df865fd 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -261,7 +261,11 @@ __gitcomp () __gitcomp_nl () { local IFS=$'\n' - COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}")) + COMPREPLY=($(echo "$1" |sed -n "/^${3-$cur}/ { + s/^/${2-}/ + s/$/${4- }/ + p + }")) } __git_heads () diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index 4af2a149..0ee91f64 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -209,7 +209,7 @@ test_expect_success '__gitcomp_nl - suffix' ' test_cmp expected out ' -test_expect_failure '__gitcomp_nl - expandable words' ' +test_expect_success '__gitcomp_nl - expandable words' ' sed -e "s/Z$//" >expected <<-\EOF && $foo Z $(bar) Z
-- 1.7.12.1.438.g7dfa67b