The compgen Bash-builtin performs expansion on all words in the wordlist given to its -W option, breaking Git's completion script when words passed to __gitcomp() contain expandable substrings. In __gitcomp() we only use a small subset ot compgen's functionality, namely the filtering of matching possible completion words and adding a prefix to each of those words; suffix is added by the __gitcomp_1() helper function instead. Now, since we already have to iterate over all words in the wordlist to append a trailing space if necessary, we can check in the same loop whether a word matches the word to be completed and store matching words with possible prefix and/or suffix in the COMPREPLY array. This way we achieve the same functionality without the compgen builtin and, more importantly, without it's problematic expansions. An additional benefit, especially for Windows/MSysGit users, is the loss of two subshells, one to run __gitcomp_1() and the other to run the compgen builtin. Note, that like the previous patch for __gitcomp_nl(), this patch doesn't quote expandable words either, but that could be implemented later on top by unquoting $cur and then quoting what get stored in COMPREPLY. Also update the function's description a bit. Signed-off-by: SZEDER Gábor <szeder@xxxxxxxxxx> --- contrib/completion/git-completion.bash | 27 ++++++++++++++++++++------- t/t9902-completion.sh | 2 +- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 65196ddd..283ef99b 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -225,12 +225,13 @@ _get_comp_words_by_ref () fi fi -# Generates completion reply with compgen, appending a space to possible -# completion words, if necessary. +# Generates completion reply for the word in $cur, appending a space to +# possible completion words, if necessary. # It accepts 1 to 4 arguments: # 1: List of possible completion words. # 2: A prefix to be added to each possible completion word (optional). -# 3: Generate possible completion matches for this word (optional). +# 3: Generate possible completion matches for this word instead of $cur +# (optional). # 4: A suffix to be appended to each possible completion word (optional). __gitcomp () { @@ -241,10 +242,22 @@ __gitcomp () COMPREPLY=() ;; *) - local IFS=$'\n' - COMPREPLY=($(compgen -P "${2-}" \ - -W "$(__gitcomp_1 "${1-}" "${4-}")" \ - -- "$cur_")) + local i=0 c IFS=$' \t\n' + for c in $1; do + case $c in + "$cur_"*) + c="$c${4-}" + case $c in + --*=*|*.) ;; + *) c="$c " ;; + esac + COMPREPLY[$i]="${2-}$c" + i=$((++i)) + ;; + *) + ;; + esac + done ;; esac } diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index fa289324..d08f4259 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -156,7 +156,7 @@ test_expect_success '__gitcomp - suffix' ' test_cmp expected out ' -test_expect_failure '__gitcomp - doesnt fail because of invalid variable name' ' +test_expect_success '__gitcomp - doesnt fail because of invalid variable name' ' ( __gitcomp "$invalid_variable_name" ) -- 1.8.0.220.g4d14ece -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html