Skip to content

Commit

Permalink
completion: get rid of compgen
Browse files Browse the repository at this point in the history
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 <felipe.contreras@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Felipe Contreras authored and Junio C Hamano committed Apr 15, 2013
1 parent 43369a2 commit 7d13e0a
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 8 deletions.
15 changes: 10 additions & 5 deletions contrib/completion/git-completion.bash
Original file line number Diff line number Diff line change
Expand Up @@ -197,11 +197,16 @@ fi

__gitcompadd ()
{
COMPREPLY=($(compgen -W "$1" -P "$2" -S "$4" -- "$3"))
local i=0
for x in $1; do
if [[ "$x" == "$3"* ]]; then
COMPREPLY[i++]="$2$x$4"
fi
done
}

# Generates completion reply with compgen, appending a space to possible
# completion words, if necessary.
# Generates completion reply, 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).
Expand All @@ -221,8 +226,8 @@ __gitcomp ()
esac
}

# Generates completion reply with compgen from newline-separated possible
# completion words by appending a space to all of them.
# Generates completion reply from newline-separated possible completion words
# by appending a space to all of them.
# It accepts 1 to 4 arguments:
# 1: List of possible completion words, separated by a single newline.
# 2: A prefix to be added to each possible completion word (optional).
Expand Down
6 changes: 3 additions & 3 deletions t/t9902-completion.sh
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ test_expect_success '__gitcomp - suffix' '
EOF
'

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"
'

Expand Down Expand Up @@ -204,7 +204,7 @@ test_expect_success '__gitcomp_nl - no suffix' '
EOF
'

test_expect_failure '__gitcomp_nl - doesnt fail because of invalid variable name' '
test_expect_success '__gitcomp_nl - doesnt fail because of invalid variable name' '
__gitcomp_nl "$invalid_variable_name"
'

Expand Down Expand Up @@ -332,7 +332,7 @@ test_expect_success 'complete tree filename with spaces' '
EOF
'

test_expect_failure 'complete tree filename with metacharacters' '
test_expect_success 'complete tree filename with metacharacters' '
echo content >"name with \${meta}" &&
git add . &&
git commit -m meta &&
Expand Down

0 comments on commit 7d13e0a

Please sign in to comment.