threads / patch / 15601

patchbash: use for-each-ref format 'refname:short'

Subject: [PATCH] bash: use for-each-ref format 'refname:short'

## tl;dr

2 messages between Sep 19, 2008 and Sep 19, 2008. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

SZEDER Gábor· Sep 19, 2008, 22:15 UTC · lore

Using this format simplifies the code for completing refs and (in some cases) improves performance significantly.

For repositories like the current git.git (with more than 200 refs) there is no real performance difference, but for a repository with 2000 refs the total time needed to complete the refs is reduced by ~25% (from around 400ms to around 305ms).

Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
---
 OK, so after the refname:short patch hit master, here is the updated
 patch to use it in bash completion.  The patch itself is the same as
 the original one, except, of course, the for-each-ref format name.  I
 have also adjusted the performance numbers in the commit message.
 contrib/completion/git-completion.bash |   26 ++++++--------------------
 1 files changed, 6 insertions(+), 20 deletions(-)
Show changes to contrib/completion/git-completion.bash +6 −20
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index d3fb6ae..fccb499 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -154,11 +154,8 @@ __git_heads ()
 {
 	local cmd i is_hash=y dir="$(__gitdir "$1")"
 	if [ -d "$dir" ]; then
-		for i in $(git --git-dir="$dir" \
-			for-each-ref --format='%(refname)' \
-			refs/heads ); do
-			echo "${i#refs/heads/}"
-		done
+		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
+			refs/heads
 		return
 	fi
 	for i in $(git ls-remote "$1" 2>/dev/null); do
@@ -175,11 +172,8 @@ __git_tags ()
 {
 	local cmd i is_hash=y dir="$(__gitdir "$1")"
 	if [ -d "$dir" ]; then
-		for i in $(git --git-dir="$dir" \
-			for-each-ref --format='%(refname)' \
-			refs/tags ); do
-			echo "${i#refs/tags/}"
-		done
+		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
+			refs/tags
 		return
 	fi
 	for i in $(git ls-remote "$1" 2>/dev/null); do
@@ -197,16 +191,8 @@ __git_refs ()
 	local cmd i is_hash=y dir="$(__gitdir "$1")"
 	if [ -d "$dir" ]; then
 		if [ -e "$dir/HEAD" ]; then echo HEAD; fi
-		for i in $(git --git-dir="$dir" \
-			for-each-ref --format='%(refname)' \
-			refs/tags refs/heads refs/remotes); do
-			case "$i" in
-				refs/tags/*)    echo "${i#refs/tags/}" ;;
-				refs/heads/*)   echo "${i#refs/heads/}" ;;
-				refs/remotes/*) echo "${i#refs/remotes/}" ;;
-				*)              echo "$i" ;;
-			esac
-		done
+		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
+			refs/tags refs/heads refs/remotes
 		return
 	fi
 	for i in $(git ls-remote "$dir" 2>/dev/null); do
-- 
1.6.0.2.294.g50836f
Shawn O. Pearce· Sep 19, 2008, 23:51 UTC · re: SZEDER Gábor · lore

Re: [PATCH] bash: use for-each-ref format 'refname:short'

SZEDER GGGbor <szeder@ira.uka.de> wrote:
Show 9 quoted lines
> Using this format simplifies the code for completing refs and (in some
> cases) improves performance significantly.
> 
> For repositories like the current git.git (with more than 200 refs)
> there is no real performance difference, but for a repository with 2000
> refs the total time needed to complete the refs is reduced by ~25% (from
> around 400ms to around 305ms).
> 
> Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
Nice improvement.
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Show 59 quoted lines
>  OK, so after the refname:short patch hit master, here is the updated
>  patch to use it in bash completion.  The patch itself is the same as
>  the original one, except, of course, the for-each-ref format name.  I
>  have also adjusted the performance numbers in the commit message.
> 
>  contrib/completion/git-completion.bash |   26 ++++++--------------------
>  1 files changed, 6 insertions(+), 20 deletions(-)
> 
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index d3fb6ae..fccb499 100755
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -154,11 +154,8 @@ __git_heads ()
>  {
>  	local cmd i is_hash=y dir="$(__gitdir "$1")"
>  	if [ -d "$dir" ]; then
> -		for i in $(git --git-dir="$dir" \
> -			for-each-ref --format='%(refname)' \
> -			refs/heads ); do
> -			echo "${i#refs/heads/}"
> -		done
> +		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
> +			refs/heads
>  		return
>  	fi
>  	for i in $(git ls-remote "$1" 2>/dev/null); do
> @@ -175,11 +172,8 @@ __git_tags ()
>  {
>  	local cmd i is_hash=y dir="$(__gitdir "$1")"
>  	if [ -d "$dir" ]; then
> -		for i in $(git --git-dir="$dir" \
> -			for-each-ref --format='%(refname)' \
> -			refs/tags ); do
> -			echo "${i#refs/tags/}"
> -		done
> +		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
> +			refs/tags
>  		return
>  	fi
>  	for i in $(git ls-remote "$1" 2>/dev/null); do
> @@ -197,16 +191,8 @@ __git_refs ()
>  	local cmd i is_hash=y dir="$(__gitdir "$1")"
>  	if [ -d "$dir" ]; then
>  		if [ -e "$dir/HEAD" ]; then echo HEAD; fi
> -		for i in $(git --git-dir="$dir" \
> -			for-each-ref --format='%(refname)' \
> -			refs/tags refs/heads refs/remotes); do
> -			case "$i" in
> -				refs/tags/*)    echo "${i#refs/tags/}" ;;
> -				refs/heads/*)   echo "${i#refs/heads/}" ;;
> -				refs/remotes/*) echo "${i#refs/remotes/}" ;;
> -				*)              echo "$i" ;;
> -			esac
> -		done
> +		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
> +			refs/tags refs/heads refs/remotes
>  		return
>  	fi
>  	for i in $(git ls-remote "$dir" 2>/dev/null); do
-- 
Shawn.

← back to recent threads