git/contrib
SZEDER Gábor b2b6811451 completion: don't disambiguate short refs
When the completion script lists short refs it does so using the 'git
for-each-ref' format 'refname:short', which makes sure that all listed
refs are unambiguous.  While disambiguating refs is technically
correct in this case, as opposed to the cases discussed in the
previous patch, this disambiguation involves several stat() syscalls
for each ref, thus, unfortunately, comes at a steep cost especially on
Windows and/or when there are a lot of refs to be listed.  A user of
Git for Windows reported[1] 'git checkout <TAB>' taking ~11 seconds in
a repository with just about 4000 refs.

However, it's questionable whether ambiguous refs are really that bad
to justify that much extra cost:

  - Ambiguous refs are not that common,
  - even if a repository contains ambiguous refs, they only hurt when
    the user actually happens to want to do something with one of the
    ambiguous refs, and
  - the issue can be easily circumvented by renaming those ambiguous
    refs.

  - On the other hand, apparently not that many refs are needed to
    make refs completion unacceptably slow on Windows,
  - and this slowness bites each and every time the user attempts refs
    completion, even when the repository doesn't contain any ambiguous
    refs.
  - Furthermore, circumventing the issue might not be possible or
    might be considerably more difficult and requires various
    trade-offs (e.g. working in a repository with only a few selected
    important refs while keeping a separate repository with all refs
    for reference).

Arguably, in this case the benefits of technical correctness are
rather minor compared to the price we pay for it, and we are better
off opting for performance over correctness.

Use the 'git for-each-ref' format 'refname:strip=2' to list short refs
to spare the substantial cost of disambiguating.

This speeds up refs completion considerably.  Uniquely completing a
branch in a repository with 100k local branches, all packed, best of
five:

  On Linux, before:

    $ time __git_complete_refs --cur=maste

    real    0m1.662s
    user    0m1.368s
    sys     0m0.296s

  After:

    real    0m0.831s
    user    0m0.808s
    sys     0m0.028s

  On Windows, before:

    real    0m12.457s
    user    0m1.016s
    sys     0m0.092s

  After:

    real    0m1.480s
    user    0m1.031s
    sys     0m0.060s

[1] - https://github.com/git-for-windows/git/issues/524

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-03-23 11:18:22 -07:00
..
buildsystems mark Windows build scripts executable 2013-11-25 15:01:22 -08:00
coccinelle Merge branch 'rs/absolute-pathdup' 2017-02-02 13:36:55 -08:00
completion completion: don't disambiguate short refs 2017-03-23 11:18:22 -07:00
contacts contacts: add a Makefile to generate docs and install 2014-10-15 15:18:27 -07:00
credential Merge branch 'mm/credential-libsecret' 2016-10-26 13:14:45 -07:00
diff-highlight diff-highlight: avoid highlighting combined diffs 2016-08-31 09:59:53 -07:00
emacs emacs: make 'git-status' work with separate git dirs 2012-11-26 09:34:28 -08:00
examples Merge branch 'js/difftool-builtin' 2017-01-31 13:15:00 -08:00
fast-import import-tars: support hard links 2016-08-03 09:46:11 -07:00
git-jump contrib/git-jump: fix typo in README 2016-07-22 12:34:51 -07:00
git-shell-commands Add sample commands for git-shell 2010-08-12 15:16:31 -07:00
hg-to-git hg-to-git: --allow-empty-message in git commit 2013-07-23 12:17:23 -07:00
hooks git-multimail: update to release 1.4.0 2016-08-17 11:36:08 -07:00
long-running-filter docs: warn about possible '=' in clean/smudge filter process values 2016-12-06 11:29:52 -08:00
mw-to-git Spelling fixes 2016-08-11 14:35:42 -07:00
persistent-https contrib/persistent-https: use Git version for build label 2016-07-22 10:59:03 -07:00
remote-helpers Revert "Merge branch 'jc/graduate-remote-hg-bzr' (early part)" 2014-05-20 14:48:11 -07:00
stats contrib: update stats/mailmap script 2012-12-12 11:09:11 -08:00
subtree Spelling fixes 2016-08-11 14:35:42 -07:00
svn-fe contrib/svn-fe: fix Makefile 2014-08-28 15:41:28 -07:00
thunderbird-patch-inline contrib/thunderbird-patch-inline/appp.sh: use the $( ... ) construct for command substitution 2015-12-27 15:33:13 -08:00
update-unicode update_unicode.sh: remove the plane filter 2016-12-14 09:48:07 -08:00
workdir git-new-workdir: don't fail if the target directory is empty 2014-12-03 12:49:24 -08:00
convert-grafts-to-replace-refs.sh contrib: add convert-grafts-to-replace-refs.sh 2014-07-21 12:05:53 -07:00
git-resurrect.sh git-sh-setup.sh: add variable to use the stuck-long mode 2014-02-03 12:11:10 -08:00
README
remotes2config.sh contrib: Make remotes2config.sh script more robust 2007-12-04 14:35:08 -08:00
rerere-train.sh Escape Git's exec path in contrib/rerere-train.sh script 2015-11-20 06:43:00 -05:00

Contributed Software

Although these pieces are available as part of the official git
source tree, they are in somewhat different status.  The
intention is to keep interesting tools around git here, maybe
even experimental ones, to give users an easier access to them,
and to give tools wider exposure, so that they can be improved
faster.

I am not expecting to touch these myself that much.  As far as
my day-to-day operation is concerned, these subdirectories are
owned by their respective primary authors.  I am willing to help
if users of these components and the contrib/ subtree "owners"
have technical/design issues to resolve, but the initiative to
fix and/or enhance things _must_ be on the side of the subtree
owners.  IOW, I won't be actively looking for bugs and rooms for
enhancements in them as the git maintainer -- I may only do so
just as one of the users when I want to scratch my own itch.  If
you have patches to things in contrib/ area, the patch should be
first sent to the primary author, and then the primary author
should ack and forward it to me (git pull request is nicer).
This is the same way as how I have been treating gitk, and to a
lesser degree various foreign SCM interfaces, so you know the
drill.

I expect that things that start their life in the contrib/ area
to graduate out of contrib/ once they mature, either by becoming
projects on their own, or moving to the toplevel directory.  On
the other hand, I expect I'll be proposing removal of disused
and inactive ones from time to time.

If you have new things to add to this area, please first propose
it on the git mailing list, and after a list discussion proves
there are some general interests (it does not have to be a
list-wide consensus for a tool targeted to a relatively narrow
audience -- for example I do not work with projects whose
upstream is svn, so I have no use for git-svn myself, but it is
of general interest for people who need to interoperate with SVN
repositories in a way git-svn works better than git-svnimport),
submit a patch to create a subdirectory of contrib/ and put your
stuff there.

-jc