if test -x /usr/bin/git >/dev/null 2>&1; then
    # chdir to a remote's directory (if the remote is on the local FS)
    cdremote() {
        if [ $# -gt 1 ]; then
            echo "Usage: cdremote [remote_name]" >&2
            return 1
        fi

        if [ -z "$1" ]; then
            branch="`git rev-parse --abbrev-ref HEAD`"
            remote="`git config --get branch.$branch.remote`"
        else
            remote="$1"
        fi

        if [ -n "$remote" ] && git config --get remote.$remote.url |
                grep -q '^\(file:/\|/\|\.\./\)'; then # (file:/ or / or ../ at the beginning)
            cdgitpath remote.$remote.url
            return
        fi

        if [ -n "$1" ]; then
            echo "Cannot find directory for remote $1" >&2
            echo "Usage: cdremote [remote_name]" >&2
            return 1
        fi

        _list_remotes '^\(file:/\|/\|\.\./\)' # (file:/ or / or ../ at the beginning)
        if [ ${#GIT_REMOTES[*]} -eq 1 ]; then
            remote=${GIT_REMOTES[0]}
            unset GIT_REMOTES
            cdgitpath remote.$remote.url
        else
            unset GIT_REMOTES
            echo "Cannot find directory for any remote" >&2
            echo "Usage: cdremote [remote_name]" >&2
            return 1
        fi
    }

    # completion for `cd_worktree`

    _cd_worktree_comp() {
        local cur="${COMP_WORDS[COMP_CWORD]}"
        COMPREPLY=(`compgen -W "$(
            git worktree list | awk '{s=$3; gsub("[\\\\[\\\\]]", "", s); print s}'
        )" -- "$cur"`)
    }

    _cd_worktree_comp_loader() {
        _completion_loader git
        unset _cd_worktree_comp_loader
        complete -F _cd_worktree_comp cd_worktree
        return 124
    }

    complete -F _cd_worktree_comp_loader cd_worktree

    # completion for aliases in global .gitconfig

    # fixup rbi rbia rbiap rbip - do refs name completion
    _git_fixup() { __gitcomp_nl "$(__git_refs)" ; }
    _git_rbi() { __gitcomp_nl "$(__git_refs)" ; }
    _git_rbia() { __gitcomp_nl "$(__git_refs)" ; }
    _git_rbiap() { __gitcomp_nl "$(__git_refs)" ; }
    _git_rbip() { __gitcomp_nl "$(__git_refs)" ; }
    #
    # push-to-all-remotes - do branch name completion
    _git_push_to_all_remotes() { __gitcomp_nl "$(__git_heads)" ; }

    _cdgitpath_complete() {
        local cur="${COMP_WORDS[COMP_CWORD]}"
        COMPREPLY=(`compgen -W "$(__git_config_get_set_variables)" -- "$cur"`)
    }

    _git_open() {
        _cdgitpath_complete
    }

    complete -F _cdgitpath_complete cdgitpath git-open

    # list remotes with URLs matching a regexp
    _list_remotes() {
        if [ $# -ne 1 ]; then
            echo "Usage: _list_remotes remote_regexp" >&2
            return 1
        fi
        declare -ag GIT_REMOTES=()
        local remote
        for remote in `git remote`; do
            if git config --get remote.$remote.url | grep -q "$1"; then
                GIT_REMOTES+=($remote)
            fi
        done
    }

    # completion for cdremote and git-open-remote - list remotes with a pattern
    _list_remotes_completion() {
        local cur="${COMP_WORDS[COMP_CWORD]}"
        _list_remotes "$1"
        COMPREPLY=(`compgen -W "${GIT_REMOTES[*]}" -- "$cur"`)
        unset GIT_REMOTES
    }

    # completion for cdremote - list remotes with directories as URLs
    _cdremote_complete() {
        _list_remotes_completion '^\(file:/\|/\|\.\./\)' # (file:/ or / or ../ at the beginning)
        if [ ${#COMPREPLY[*]} -eq 0 ]; then
            _list_remotes_completion .
        fi
    }

    complete -F _cdremote_complete cdremote

    # completion for git-open-remote - list remotes with http(s) URLs
    _git_open_remote() {
        _list_remotes_completion '^http\(s\)\?://'
        if [ ${#COMPREPLY[*]} -eq 0 ]; then
            _list_remotes_completion .
        fi
    }

    complete -F _git_open_remote git-open-remote
fi
