diff --git a/lib/git/aliases.sh b/lib/git/aliases.sh index a1f7762..1fd9760 100644 --- a/lib/git/aliases.sh +++ b/lib/git/aliases.sh @@ -158,5 +158,7 @@ if [ $shell = "bash" ]; then # If you know how to rewrite _git_index_tab_completion() for zsh, please send me a pull request! complete -o nospace -F _git_index_tab_completion git_index complete -o nospace -F _git_index_tab_completion $git_index_alias +else + compdef _git_index_tab_completion git_index $git_index_alias fi diff --git a/lib/git/repo_index.sh b/lib/git/repo_index.sh index ce5f37e..44964f9 100644 --- a/lib/git/repo_index.sh +++ b/lib/git/repo_index.sh @@ -281,40 +281,75 @@ function _git_index_batch_cmd() { } -# Bash tab completion function for git_index() -function _git_index_tab_completion() { - _check_git_index - local curw - IFS=$'\n' - COMPREPLY=() - curw=${COMP_WORDS[COMP_CWORD]} +if [ $shell = 'bash' ]; then + # Bash tab completion function for git_index() + function _git_index_tab_completion() { + _check_git_index + local curw + IFS=$'\n' + COMPREPLY=() + curw=${COMP_WORDS[COMP_CWORD]} - # If the first part of $curw matches a high-level directory, - # then match on sub-directories for that project - local project=$(echo "$curw" | cut -d "/" -f1) - local base_path=$(\grep "/$project$" "$GIT_REPO_DIR/.git_index" | sed 's/ /\\ /g') + # If the first part of $curw matches a high-level directory, + # then match on sub-directories for that project + local project=$(echo "$curw" | cut -d "/" -f1) + local base_path=$(\grep "/$project$" "$GIT_REPO_DIR/.git_index" | sed 's/ /\\ /g') - # If matching project path was found and curr string contains a /, then complete project sub-directories - if [[ -n "$base_path" && $curw == */* ]]; then - local search_path=$(echo "$curw" | sed "s:^${project/\\/\\\\\\}::") - COMPREPLY=($(compgen -d "$base_path$search_path" | \grep -v "/.git" | sed -e "s:$base_path:$project:" -e "s:$:/:" )) + # If matching project path was found and curr string contains a /, then complete project sub-directories + if [[ -n "$base_path" && $curw == */* ]]; then + local search_path=$(echo "$curw" | sed "s:^${project/\\/\\\\\\}::") + COMPREPLY=($(compgen -d "$base_path$search_path" | \grep -v "/.git" | sed -e "s:$base_path:$project:" -e "s:$:/:" )) - # If curr string starts with /, tab complete top-level directories in root project dir - elif ([ $shell = "bash" ] && [ "${curw:0:1}" = "/" ]) || \ - ([ $shell = "zsh" ] && [ "${curw[1,1]}" = "/" ]); then - COMPREPLY=($(compgen -d "$GIT_REPO_DIR$curw" | sed -e "s:$GIT_REPO_DIR/::" -e "s:^:/:")) + # If curr string starts with /, tab complete top-level directories in root project dir + elif [ "${curw:0:1}" = "/" ]; then + COMPREPLY=($(compgen -d "$GIT_REPO_DIR$curw" | sed -e "s:$GIT_REPO_DIR/::" -e "s:^:/:")) - # If curr string starts with --, tab complete commands - elif ([ $shell = "bash" ] && [ "${curw:0:2}" = "--" ]) || \ - ([ $shell = "zsh" ] && [ "${curw[1,2]}" = "--" ]); then - local commands="--list\n--rebuild\n--update-all\n--batch-cmd\n--count-by-host" - COMPREPLY=($(compgen -W '$(echo -e "\n"$commands)' -- $curw)) + # If curr string starts with --, tab complete commands + elif [ "${curw:0:2}" = "--" ]; then + local commands="--list\n--rebuild\n--update-all\n--batch-cmd\n--count-by-host" + COMPREPLY=($(compgen -W '$(echo -e "\n"$commands)' -- $curw)) - # Else, tab complete the entries in .git_index - else - COMPREPLY=($(compgen -W '$(sed -e "s:.*/::" -e "s:$:/:" "$GIT_REPO_DIR/.git_index" | sort)' -- $curw)) - fi - IFS=$' \t\n' - return 0 -} + # Else, tab complete the entries in .git_index + else + COMPREPLY=($(compgen -W '$(sed -e "s:.*/::" -e "s:$:/:" "$GIT_REPO_DIR/.git_index" | sort)' -- $curw)) + fi + IFS=$' \t\n' + return 0 + } +else + function _git_index_tab_completion() { + typeset -A opt_args + local state state_descr context line + _arguments \ + "--rebuild[Rebuild repository index]" \ + "--update-all[Update all indexed repositories]" \ + "--update-all-with-notifications[Update all indexed repositories with notifications]" \ + "--list[List all repositories currently present in the index]" \ + "--count-by-host[Count all repositories per host]" \ + "--batch-cmd+[Run a command on all repositories]:command:->command" \ + "1::Git projects:->projects" \ + && return 0 + + + case "$state" in + projects) + # Only check and rebuild index if necessary + _check_git_index + if [[ $PREFIX == /* ]]; then + PREFIX=$PREFIX[2,-1] + _files -X "Files in project directory" -W $GIT_REPO_DIR + else + compadd -X "Git projects" $(sed -e 's:.*/::' -e 's:$:/:' "$GIT_REPO_DIR/.git_index") && return 0 + fi + ;; + command) + local ret=1 + _call_function ret _command_names + return ret + ;; + esac + + return 1 + } +fi