| # gclient_completion.sh |
| # |
| # This adds completion to bash shells for gclient commands. It is |
| # meant for developers and not needed for inclusion by any automated |
| # processes that will, of course, specify the full command, not rely |
| # on or benefit from tab-completion. |
| # |
| # Requires: |
| # bash-completion package for _get_comp_words_by_ref. |
| # newer versions of sed for the improved regular expression handling. |
| # |
| # On Mac, this is accomplished by installing fink (www.finkproject.org) |
| # then doing sudo apt-get update ; sudo apt-get install sed |
| # |
| # Usage: |
| # Put something like the following in your .bashrc: |
| # . $PATH_TO_DEPOT_TOOLS/gclient_completion.sh |
| # |
| |
| |
| # Parses commands from gclient -h. |
| __gclient_commands () { |
| gclient -h 2> /dev/null | sed -n 's/^\s*\x1b\[32m\(.*\)\x1b\[39m.*$/\1/p' |
| } |
| |
| # Caches variables in __gclient_all_commands. |
| # Adds "update" command, which is not listed. |
| __gclient_compute_all_commands () { |
| test -n "$__gclient_all_commands" || |
| __gclient_all_commands="$(__gclient_commands) update" |
| } |
| |
| # Since gclient fetch is a passthrough to git, let the completions |
| # come from git's completion if it's defined. |
| if [[ -n _git_fetch ]]; then |
| _gclient_fetch=_git_fetch |
| fi |
| |
| # Completion callback for gclient cmdlines. |
| _gclient () { |
| local cur prev words cword |
| _get_comp_words_by_ref -n =: cur prev words cword |
| |
| # Find the command by ignoring flags. |
| local i c=1 cword_adjust=0 command |
| while [ $c -lt $cword ]; do |
| i="${words[$c]}" |
| case "$i" in |
| -*) |
| ((cword_adjust++)) |
| : ignore options ;; |
| *) command="$i"; break ;; |
| esac |
| ((c++)) |
| done |
| |
| # If there is a completion function for the command, use it and |
| # return. |
| local completion_func="_gclient_${command//-/_}" |
| local -f $completion_func >/dev/null && $completion_func && return |
| |
| # If the command or hasn't been given, provide completions for all |
| # commands. Also provide all commands as completion for the help |
| # command. |
| # echo "command=$command" >> /tmp/comp.log |
| case "$command" in |
| ""|help) |
| if [[ "$command" != help || $((cword - cword_adjust)) -le 2 ]]; then |
| __gclient_compute_all_commands |
| COMPREPLY=($(compgen -W "$__gclient_all_commands" $cur)) |
| fi |
| ;; |
| *) : just use the default ;; |
| esac |
| } && |
| complete -F _gclient -o default gclient |