Skip to content

Commit 7d13e0a

Browse files
felipecgitster
authored andcommitted
completion: get rid of compgen
The functionality we use from compgen is not much, we can do the same manually, with drastic improvements in speed, especially when dealing with only a few words. This patch also has the sideffect that brekage reported by Jeroen Meijer and SZEDER Gábor gets fixed because we no longer expand the resulting words. Here are some numbers filtering N amount of words: == 1 == original: 0.002s new: 0.000s == 10 == original: 0.002s new: 0.000s == 100 == original: 0.003s new: 0.002s == 1000 == original: 0.012s new: 0.011s == 10000 == original: 0.056s new: 0.066s == 100000 == original: 2.669s new: 0.622s If the results are not narrowed: == 1 == original: 0.002s new: 0.000s == 10 == original: 0.002s new: 0.001s == 100 == original: 0.004s new: 0.004s == 1000 == original: 0.020s new: 0.015s == 10000 == original: 0.101s new: 0.355s == 100000 == original: 2.850s new: 31.941s So, unless 'git checkout <tab>' usually gives you more than 10000 results, you'll get an improvement :) Other possible solutions perform better after 1000 words, but worst if less than that: COMPREPLY=($(awk -v cur="$3" -v pre="$2" -v suf="$4" '$0 ~ cur { print pre$0suf }' <<< "$1" )) COMPREPLY=($(printf -- "$2%s$4\n" $1 | grep "^$2$3")) Signed-off-by: Felipe Contreras <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 43369a2 commit 7d13e0a

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

contrib/completion/git-completion.bash

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,16 @@ fi
197197

198198
__gitcompadd ()
199199
{
200-
COMPREPLY=($(compgen -W "$1" -P "$2" -S "$4" -- "$3"))
200+
local i=0
201+
for x in $1; do
202+
if [[ "$x" == "$3"* ]]; then
203+
COMPREPLY[i++]="$2$x$4"
204+
fi
205+
done
201206
}
202207

203-
# Generates completion reply with compgen, appending a space to possible
204-
# completion words, if necessary.
208+
# Generates completion reply, appending a space to possible completion words,
209+
# if necessary.
205210
# It accepts 1 to 4 arguments:
206211
# 1: List of possible completion words.
207212
# 2: A prefix to be added to each possible completion word (optional).
@@ -221,8 +226,8 @@ __gitcomp ()
221226
esac
222227
}
223228

224-
# Generates completion reply with compgen from newline-separated possible
225-
# completion words by appending a space to all of them.
229+
# Generates completion reply from newline-separated possible completion words
230+
# by appending a space to all of them.
226231
# It accepts 1 to 4 arguments:
227232
# 1: List of possible completion words, separated by a single newline.
228233
# 2: A prefix to be added to each possible completion word (optional).

t/t9902-completion.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ test_expect_success '__gitcomp - suffix' '
165165
EOF
166166
'
167167

168-
test_expect_failure '__gitcomp - doesnt fail because of invalid variable name' '
168+
test_expect_success '__gitcomp - doesnt fail because of invalid variable name' '
169169
__gitcomp "$invalid_variable_name"
170170
'
171171

@@ -204,7 +204,7 @@ test_expect_success '__gitcomp_nl - no suffix' '
204204
EOF
205205
'
206206

207-
test_expect_failure '__gitcomp_nl - doesnt fail because of invalid variable name' '
207+
test_expect_success '__gitcomp_nl - doesnt fail because of invalid variable name' '
208208
__gitcomp_nl "$invalid_variable_name"
209209
'
210210

@@ -332,7 +332,7 @@ test_expect_success 'complete tree filename with spaces' '
332332
EOF
333333
'
334334

335-
test_expect_failure 'complete tree filename with metacharacters' '
335+
test_expect_success 'complete tree filename with metacharacters' '
336336
echo content >"name with \${meta}" &&
337337
git add . &&
338338
git commit -m meta &&

0 commit comments

Comments
 (0)