# HG changeset patch # User Bryan O'Sullivan # Date 1363888278 25200 # Node ID 1e28a7f58f33729994be240335ba490a3f92e5d5 # Parent fff3a811451082b9f47909c38e7c6d3b15177b34 completion: add a debuglabelcomplete command When completing a "label" (a symbolic name for a commit), the bash_completion script currently has to invoke hg three times. For a large repository, the cost of starting up and loading all the necessary context over and over is very high. For instance, in mozilla-central: time (export HGPLAIN=1; hg tags -q; hg bookmarks -q; hg branches) >/dev/null 0.446 sec Compare with the debuglabelcomplete command that this commit adds: time hg debuglabelcomplete >/dev/null 0.148 sec This greatly helps responsiveness. diff -r fff3a8114510 -r 1e28a7f58f33 contrib/bash_completion --- a/contrib/bash_completion Thu Mar 21 09:13:16 2013 -0700 +++ b/contrib/bash_completion Thu Mar 21 10:51:18 2013 -0700 @@ -88,20 +88,6 @@ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$files' -- "$cur")) } -_hg_tags() -{ - local tags="$(_hg_cmd tags -q)" - local IFS=$'\n' - COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$tags' -- "$cur")) -} - -_hg_branches() -{ - local branches="$(_hg_cmd branches -q)" - local IFS=$'\n' - COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$branches' -- "$cur")) -} - _hg_bookmarks() { local bookmarks="$(_hg_cmd bookmarks -q)" @@ -111,9 +97,9 @@ _hg_labels() { - _hg_tags - _hg_branches - _hg_bookmarks + local labels="$(_hg_cmd debuglabelcomplete "$cur")" + local IFS=$'\n' + COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$labels' -- "$cur")) } # this is "kind of" ugly... diff -r fff3a8114510 -r 1e28a7f58f33 mercurial/commands.py --- a/mercurial/commands.py Thu Mar 21 09:13:16 2013 -0700 +++ b/mercurial/commands.py Thu Mar 21 10:51:18 2013 -0700 @@ -2072,6 +2072,22 @@ flags = repo.known([bin(s) for s in ids]) ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags]))) +@command('debuglabelcomplete', [], _('LABEL...')) +def debuglabelcomplete(ui, repo, *args): + '''complete "labels" - tags, open branch names, bookmark names''' + + labels = set() + labels.update(t[0] for t in repo.tagslist()) + labels.update(repo[n].branch() for n in repo.heads()) + labels.update(repo._bookmarks.keys()) + completions = set() + if not args: + args = [''] + for a in args: + completions.update(l for l in labels if l.startswith(a)) + ui.write('\n'.join(sorted(completions))) + ui.write('\n') + @command('debugobsolete', [('', 'flags', 0, _('markers flag')), ] + commitopts2,