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

[PATCH v2 06/13] bash prompt: run 'git rev-parse --git-dir' directly instead of __gitdir()

From
SZEDER Gábor <szeder@ira.uka.de>
Date
Jun 18, 2013, 02:16 UTC
Message-ID
<1371521826-3225-7-git-send-email-szeder@ira.uka.de>
In-Reply-To
<1371521826-3225-1-git-send-email-szeder@ira.uka.de>
From: SZEDER Gábor <szeder@ira.uka.de>

__git_ps1() finds out the path to the repository by using the __gitdir() helper function. __gitdir() is basically just a wrapper around 'git rev-parse --git-dir', extended with support for recognizing a remote repository given as argument, to use the path given on the command line, and with a few shortcuts to recognize a git repository in cwd or at $GIT_DIR quickly without actually running 'git rev-parse'. However, the former two is only necessary for the completion script but makes no sense for the bash prompt, while the latter shortcuts are performance optimizations __git_ps1() can do without (they just avoid the overhead of fork()+exec()ing a git process).

Run 'git rev-parse --git-dir' directly in __git_ps1(), because it will allow this patch series to combine several $(git rev-parse ...) command substitutions in the main code path, and the overall performance benefit will far outweight the loss of those few shortcuts in __gitdir(). Furthermore, since __gitdir() is not needed anymore for the prompt, remove it from the prompt script finally eliminating its duplication between the prompt and completion scripts. Also remove the comment from the completion script warning about this code duplication.

Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
---
 contrib/completion/git-completion.bash |  2 --
 contrib/completion/git-prompt.sh       | 28 ++--------------------------
 2 files changed, 2 insertions(+), 28 deletions(-)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 56c52c66..e0c8d6a1 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -33,8 +33,6 @@ esac
 # returns location of .git repo
 __gitdir ()
 {
-	# Note: this function is duplicated in git-prompt.sh
-	# When updating it, make sure you update the other one to match.
 	if [ -z "${1-}" ]; then
 		if [ -n "${__git_dir-}" ]; then
 			echo "$__git_dir"
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 96b496cc..0fc1d317 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -80,30 +80,6 @@
 # GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on
 # the colored output of "git status -sb".
 
-# __gitdir accepts 0 or 1 arguments (i.e., location)
-# returns location of .git repo
-__gitdir ()
-{
-	# Note: this function is duplicated in git-completion.bash
-	# When updating it, make sure you update the other one to match.
-	if [ -z "${1-}" ]; then
-		if [ -n "${__git_dir-}" ]; then
-			echo "$__git_dir"
-		elif [ -n "${GIT_DIR-}" ]; then
-			test -d "${GIT_DIR-}" || return 1
-			echo "$GIT_DIR"
-		elif [ -d .git ]; then
-			echo .git
-		else
-			git rev-parse --git-dir 2>/dev/null
-		fi
-	elif [ -d "$1/.git" ]; then
-		echo "$1/.git"
-	else
-		echo "$1"
-	fi
-}
-
 # stores the divergence from upstream in $p
 # used by GIT_PS1_SHOWUPSTREAM
 __git_ps1_show_upstream ()
@@ -335,8 +311,8 @@ __git_ps1 ()
 		;;
 	esac
 
-	local g="$(__gitdir)"
-	if [ -z "$g" ]; then
+	local g=
+	if ! g="$(git rev-parse --git-dir 2>/dev/null)"; then
 		if [ $pcmode = yes ]; then
 			#In PC mode PS1 always needs to be set
 			PS1="$ps1pc_start$ps1pc_end"
-- 
1.8.3.1.487.g8f4672d
Previous: SZEDER GáborNext: Eric Sunshine
Message 8 of 22 in “bash prompt speedup”
  1. 00/13 bash prompt speedupSZEDER Gábor, Jun 18, 2013
  2. 01/13 bash prompt: fix redirection coding style in testsSZEDER Gábor, Jun 18, 2013
  3. 02/13 bash prompt: fix here document indentation in interactive rebase testSZEDER Gábor, Jun 18, 2013
  4. Jeff KingJun 18, 2013
  5. 03/13 completion, bash prompt: move __gitdir() tests to completion test suiteSZEDER Gábor, Jun 18, 2013
  6. 04/13 bash prompt: add a test for symbolic link symbolic refsSZEDER Gábor, Jun 18, 2013
  7. 05/13 bash prompt: return early from __git_ps1() when not in a git repositorySZEDER Gábor, Jun 18, 2013
  8. 06/13 bash prompt: run 'git rev-parse --git-dir' directly instead of __gitdir()SZEDER Gábor, Jun 18, 2013
  9. Eric SunshineJun 18, 2013
  10. 07/13 bash prompt: use bash builtins to find out rebase stateSZEDER Gábor, Jun 18, 2013
  11. 08/13 bash prompt: use bash builtins to find out current branchSZEDER Gábor, Jun 18, 2013
  12. 09/13 bash prompt: use bash builtins to get detached HEAD abbrev. object nameSZEDER Gábor, Jun 18, 2013
  13. 10/13 bash prompt: combine 'git rev-parse' executionsSZEDER Gábor, Jun 18, 2013
  14. Jeff KingJun 18, 2013
  15. SZEDER GáborJun 18, 2013
  16. fixup! bash prompt: use bash builtins to find out current branchSZEDER Gábor, Jun 18, 2013
  17. 11/13 bash prompt: use bash builtins to check stash stateSZEDER Gábor, Jun 18, 2013
  18. 12/13 bash prompt: avoid command substitution when checking for untracked filesSZEDER Gábor, Jun 18, 2013
  19. 13/13 bash prompt: avoid command substitution when finalizing gitstringSZEDER Gábor, Jun 18, 2013
  20. SZEDER GáborJun 18, 2013
  21. Junio C HamanoJun 18, 2013
  22. Simon OosthoekJun 18, 2013

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.