git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/4] Cache the list of merge strategies and available commands during load.

From
Shawn O. Pearce <spearce@spearce.org>
Date
Nov 27, 2006, 20:11 UTC
Message-ID
<20061127201152.GC7308@spearce.org>
In-Reply-To
<139669072795537547ec26b69115509100dcd7ec.1164658223.git.spearce@spearce.org>

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>
---
 This is by request of Junio.  :-)
 contrib/completion/git-completion.bash |   20 +++++++++++++++++++-
 1 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index d4eb138..ba3adb6 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 ()
 {
-- 
1.4.4.1.ge3fb
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 2 of 3 in “Teach bash about git-commit's options.”
  1. 2/4 Teach bash about git-commit's options.Shawn O. Pearce, Nov 27, 2006
  2. 3/4 Cache the list of merge strategies and available commands during load.Shawn O. Pearce, Nov 27, 2006
  3. 4/4 Teach bash about git-am/git-apply and their whitespace options.Shawn O. Pearce, Nov 27, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.