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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



SZEDER GGGbor <szeder@xxxxxxxxxx> wrote:
> 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@xxxxxxxxxx>

Nice improvement.

Acked-by: Shawn O. Pearce <spearce@xxxxxxxxxxx>


>  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.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux