completion: let 'for-each-ref' strip the remote name from remote branches
authorSZEDER Gábor <szeder.dev@gmail.com>
Thu, 23 Mar 2017 15:29:19 +0000 (16:29 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 23 Mar 2017 18:18:22 +0000 (11:18 -0700)
The code listing unique remote branches for 'git checkout's tracking
DWIMery uses a shell parameter expansion in a loop iterating over each
listed ref to remove the remote's name from the remote branches, i.e.
the leading path component from the short ref. When listing refs from
a configured remote repository, '| sed s///' is used for the same
purpose.

Let 'git for-each-ref' strip one more leading path component from the
refs, i.e. use the format 'refname:strip=3' instead of '=2', making
that parameter expansion and 'sed' execution unnecessary.

This speeds up refs completion for 'git checkout'. Uniquely
completing a branch for 'git checkout maste<TAB>' in a repo with 100k
remote branches, all packed, best of five:

On Linux, near the beginning of this series, for reference:

$ time __git_complete_refs --cur=maste --track

real 0m8.185s
user 0m6.896s
sys 0m1.616s

Before this patch:

real 0m2.714s
user 0m2.344s
sys 0m0.436s

After:

real 0m1.993s
user 0m1.740s
sys 0m0.304s

On Windows, near the beginning:

real 1m8.421s
user 0m7.591s
sys 0m3.557s

Before this patch:

real 0m8.191s
user 0m4.638s
sys 0m2.918s

After:

real 0m6.187s
user 0m3.358s
sys 0m2.121s

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
No differences found