# HG changeset patch # User Bryan O'Sullivan # Date 2013-03-21 23:31:29 # Node ID a821ec835223492b9605e4804abfaaec8700cbb3 # Parent 10669e24eb6c664f13110cf6012e381778c730b3 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. diff --git a/contrib/bash_completion b/contrib/bash_completion --- a/contrib/bash_completion +++ b/contrib/bash_completion @@ -80,6 +80,14 @@ shopt -s extglob 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 @@ shopt -s extglob _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)