Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: git completion horribly slow in kernel tree
- X-seq: zsh-workers 24396
- From: "Mikael Magnusson" <mikachu@xxxxxxxxx>
- To: zsh-workers@xxxxxxxxxx
- Subject: Re: git completion horribly slow in kernel tree
- Date: Mon, 14 Jan 2008 22:39:58 +0100
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; bh=ECUe10sTAh0q+EX37+xRnoYQmRMHA8/tmWvuLtJ7Wgk=; b=EckEZN1Uw4z+/+CRZsDijGMilsmw5N2AdJbkGajFrzXANmcJlKOKIFv0w28KzQLE+l39FybcU+QGgwUww5TrsWerMvC/GR1l0x1i5+BPa2oRcE7ti6q+VQ0Ak2Cy8w1CxC+IOxczTRqod8Tp0esMa/85xK1FQar5pBfVYu+9G1c=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=vp/1usp0UhgyMwdHgHs4dQCXvpGbFE3uzzzpH3D3EaubnratzefG+rCA50TajrnPurpxxwZ2O1YmRxP/tYL71Je5oRNvILDEAMyGNMfoosqSDD8Lm5e0+KzrBUi5AbWMaz/+jVzpzg/v6AcNAPlfM32fDsozPycKuQIy34MvpNk=
- In-reply-to: <slrnfongql.jes.joerg@xxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <slrnfongql.jes.joerg@xxxxxxxxxxxx>
On 14/01/2008, Jörg Sommer <joerg@xxxxxxxxxxxx> wrote:
> Hi,
>
> using completion for git in the kernel tree is horribly slow. It takes
> more than ten seconds to get the answer that no completion for "git log
> o" is available. The reason might be that git ls-files gives 23,000 file
> names and zsh puts them in an array. It there any chance to speed this
> up?
I tried to fix that once but I gave up because I don't use any git
trees that large usually. basically the problem is _git calls
git-ls-tree with -r, which means recursive. I have this patch lying
around but it isn't finished. I don't remember what isn't finished
either but maybe it helps someone anyway?
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index 5f71848..0f3db0e 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -826,12 +826,12 @@ _git-diff-tree () {
# new tree:
# ...
_alternative \
- "original tree:original tree:__git_tree_files $line[1]" \
- "new tree:new tree:__git_tree_files $line[2]" && ret=0
+ "original tree:original tree:__git_tree_files . $line[1]" \
+ "new tree:new tree:__git_tree_files . $line[2]" && ret=0
else
_alternative \
': :__git_tree_ishs' \
- ": :__git_tree_files $line[1]" && ret=0
+ ": :__git_tree_files . $line[1]" && ret=0
fi
;;
esac
@@ -924,7 +924,7 @@ _git-ls-tree () {
case $state in
files)
- __git_tree_files $line[1] && ret=0
+ __git_tree_files . $line[1] && ret=0
;;
esac
}
@@ -1366,7 +1366,7 @@ _git-archive () {
case $state in
(files)
- __git_tree_files $line[1] && ret=0
+ __git_tree_files . $line[1] && ret=0
;;
esac
}
@@ -1504,7 +1504,7 @@ _git-checkout () {
case $state in
(files)
if [[ -n $line[1] ]]; then
- __git_tree_files $line[1] && ret=0
+ __git_tree_files . $line[1] && ret=0
else
__git_cached_files && ret=0
fi
@@ -1690,13 +1690,13 @@ _git-grep () {
else
_alternative \
'tree:tree:__git_trees' \
- "tree file:tree-files:__git_tree_files
$line[first_tree,last_tree]" && ret=0
+ "tree file:tree-files:__git_tree_files .
$line[first_tree,last_tree]" && ret=0
fi
else
if (( first_tree == 0 )); then
__git_cached_files
else
- __git_tree_files $line[first_tree,last_tree]
+ __git_tree_files . $line[first_tree,last_tree]
fi
fi
;;
@@ -1836,7 +1836,7 @@ _git-reset () {
if [[ $words[2] == --mixed ]]; then
commit_arg=':commit:__git_revisions'
- path_arg="*:file:__git_tree_files $words[3]"
+ path_arg="*:file:__git_tree_files . $words[3]"
else
commit_arg='::commit:__git_revisions'
fi
@@ -2559,7 +2559,7 @@ __git_command_successful () {
__git_objects () {
compset -P '*:'
if [[ -n $IPREFIX ]]; then
- __git_tree_files ${IPREFIX%:}
+ __git_tree_files "$PREFIX" "${IPREFIX%:}"
else
_alternative \
'revisions:revision:__git_revisions' \
@@ -2652,13 +2652,16 @@ __git_tree_files () {
zparseopts -D -E -a multi_parts_opts M: J: V: 1 2 n F: X:
- local tree
+ local tree Path
integer at_least_one_tree_added
local -a tree_files
+ Path=${1%/*}/
+ [[ $Path = / ]] && Path=.
+ shift
(( at_least_one_tree_added = 0 ))
for tree in $*; do
- tree_files+=(${(ps:\0:)"$(_call_program tree-files git ls-tree
--name-only -z -r $tree 2>/dev/null)"})
+ tree_files+=(${(ps:\0:)"$(_call_program tree-files git ls-tree
--name-only -z $tree $Path 2>/dev/null)"})
__git_command_successful && (( at_least_one_tree_added = 1 ))
done
--
Mikael Magnusson
Messages sorted by:
Reverse Date,
Date,
Thread,
Author