changeset 18793:a821ec835223

completion: selectively use debugpathcomplete in bash_completion The current bash_completion code can be very slow in a large working directory. It always uses "hg status" to generate possibly matching files, which checks the status of every file. We often don't care about status when completing, so that cost is very high. As the new debugpathcomplete command does not check the status of files, it offers much better performance for commands that only care about completing names.
author Bryan O'Sullivan <bryano@fb.com>
date Thu, 21 Mar 2013 16:31:29 -0700
parents 10669e24eb6c
children 63dc020e8cb7
files contrib/bash_completion
diffstat 1 files changed, 11 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/contrib/bash_completion	Thu Mar 21 16:31:28 2013 -0700
+++ b/contrib/bash_completion	Thu Mar 21 16:31:29 2013 -0700
@@ -80,6 +80,14 @@
     done
 }
 
+_hg_debugpathcomplete()
+{
+    local files="$(_hg_cmd debugpathcomplete $1 "$cur")"
+    local IFS=$'\n'
+    compopt -o filenames 2>/dev/null
+    COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$files' -- "$cur"))
+}
+
 _hg_status()
 {
     local files="$(_hg_cmd status -n$1 "glob:$cur**")"
@@ -241,16 +249,16 @@
 	    _hg_status "mar"
 	;;
 	remove)
-	    _hg_status "mcd"
+	    _hg_debugpathcomplete -n
 	;;
 	forget)
-	    _hg_status "a"
+	    _hg_debugpathcomplete -fa
 	;;
 	diff)
 	    _hg_status "mar"
 	;;
 	revert)
-	    _hg_status "mard"
+	    _hg_debugpathcomplete
 	;;
 	clone)
 	    local count=$(_hg_count_non_option)