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.
--- 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...
--- 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,