aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2006-11-27 15:11:52 -0500
committerJunio C Hamano <junkio@cox.net>2006-11-27 12:57:21 -0800
commitb51ec6bddb572def384a21a18d5919a488e06ffb (patch)
treee963d4f18547b4115ff73825499220611e1e43ab
parentce1e39d29ee373786ceda9e79d0906a6451ab5a5 (diff)
downloadgit-b51ec6bddb572def384a21a18d5919a488e06ffb.tar.gz
git-b51ec6bddb572def384a21a18d5919a488e06ffb.tar.xz
Cache the list of merge strategies and available commands during load.
Since the user's git installation is not likely to grow a new command or merge strategy in the lifespan of the current shell process we can save time during completion operations by caching these lists during sourcing of the completion support. If the git executable is not available or we run into errors while caching at load time then we defer these to runtime and generate the list on the fly. This might happen if the user doesn't put git into their PATH until after the completion script gets sourced. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
-rwxr-xr-xcontrib/completion/git-completion.bash20
1 files changed, 19 insertions, 1 deletions
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 16b8dda17..902f80b93 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -18,7 +18,13 @@
# 2) Added the following line to your .bashrc:
# source ~/.git-completion.sh
#
-# 3) Consider changing your PS1 to also show the current branch:
+# 3) You may want to make sure the git executable is available
+# in your PATH before this script is sourced, as some caching
+# is performed while the script loads. If git isn't found
+# at source time then all lookups will be done on demand,
+# which may be slightly slower.
+#
+# 4) Consider changing your PS1 to also show the current branch:
# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
#
# The argument to __git_ps1 will be displayed only if you
@@ -150,6 +156,10 @@ __git_remotes ()
__git_merge_strategies ()
{
+ if [ -n "$__git_merge_strategylist" ]; then
+ echo "$__git_merge_strategylist"
+ return
+ fi
sed -n "/^all_strategies='/{
s/^all_strategies='//
s/'//
@@ -157,6 +167,8 @@ __git_merge_strategies ()
q
}" "$(git --exec-path)/git-merge"
}
+__git_merge_strategylist=
+__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
__git_complete_file ()
{
@@ -214,6 +226,10 @@ __git_complete_revlist ()
__git_commands ()
{
+ if [ -n "$__git_commandlist" ]; then
+ echo "$__git_commandlist"
+ return
+ fi
local i IFS=" "$'\n'
for i in $(git help -a|egrep '^ ')
do
@@ -263,6 +279,8 @@ __git_commands ()
esac
done
}
+__git_commandlist=
+__git_commandlist="$(__git_commands 2>/dev/null)"
__git_aliases ()
{