#
# bash-completion file for CMake
# Provided by Eric NOULARD - eric.noulard@gmail.com
#
# see http://bash-completion.alioth.debian.org/
# and http://www.cmake.org
#
# We will try to complete cmake commands options
# at 2 (or may be 3 levels)
#  [cmake|cpack|ctest] <level0> <level1> <level2>
#
#  level0 is top level cmake/cpack/ctest options
#  level1 is the first argument of level0 option
#  level2 is the seconf argument of level1 argument
#   FIXME: I don't know how to handle level2
#
# The file has been proposed for inclusion in the bash-completion package
# https://alioth.debian.org/tracker/?func=detail&atid=413095&aid=312632&group_id=100114
# In the meantime,
#   1) If you want to test bash completion for cmake/cpack/ctest
#      just source the current file at bash prompt
#      . ./cmake-completion
#
#   2) If you want to install it for good copy this file to
#      cp cmake-completion /etc/bash_completion.d/cmake
#

#
# cmake command
#
# have cmake &&
_cmake()
{
    local cur prev opts words cword
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    # seems to be only available on bash-completion 1.2
    #_get_comp_words_by_ref cur prev

    # cmake command line option we want to complete
    opts=`cmake --help | grep "^  \-.*=\ .*" | cut -d" " -f 3 | cut -d= -f 1 | cut -d[ -f 1`

    #
    #  Complete the arguments to some of
    #  the most commonly used commands (Level 1).
    #
    case "${prev}" in
        -E)
            local running=$(for x in `cmake -E |&  grep "^  " | cut -d" " -f 3`; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        # FIXME: don't know how to handle multi words completion
        # or more precisely word that contains space in them like "Unix Makefiles"
	# -G)
        #     local running=$(for x in `cmake --help | grep "^  .*=\ .*" | grep -v "^  -" | cut -d"=" -f 1 | grep -v "^   "`; do echo \"${x}\" ; done )
        #     COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
        #     return 0
        #     ;;
        --help-command)
            local running=$(for x in `cmake --help-command-list | grep -v "cmake version"`; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        --help-module)
            local running=$(for x in `cmake --help-module-list | grep -v "cmake version"`; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
         --help-policy)
            local running=$(for x in `cmake --help-policies | grep "^  CMP"`; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
         --help-property)
            local running=$(for x in `cmake --help-property-list | grep -v "cmake version"`; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
         --help-variable)
            local running=$(for x in `cmake --help-variable-list | grep -v "cmake version"`; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        *)
            ;;
    esac

    #
    #  Complete the arguments to some of
    #  the most commonly used commands (Level 2).
    #   ?? How to do that ..

    #
    # Complete the option (Level 0 - right after cmake)
    #
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
} &&
complete -F _cmake -o default cmake

#
# cpack command
#
#have cpack &&
_cpack()
{
    local cur prev opts words cword
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    # seems to be only available on bash-completion 1.2
    #_get_comp_words_by_ref cur prev

    # cpack command line option we want to complete
    opts=`cpack --help | grep "^  \-.*=\ .*"  | cut -d" " -f 3 | cut -d= -f 1`
    opts="${opts} --help -V"

    #
    #  Complete the arguments to some of
    #  the most commonly used commands (Level 1).
    #
    case "${prev}" in
        -G)
            local running=$(for x in `cpack --help | grep "^  .*=\ .*" | grep -v "^  -" | cut -d" " -f 3`; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        --config)
            COMPREPLY=( $(compgen -f ${cur}) )
            return 0
            ;;
        --help-variable)
            local running=$(for x in `cpack --help-variable-list | grep -v "cpack version" `; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        --help-command)
            local running=$(for x in `cpack --help-command-list | grep -v "cpack version" `; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        *)
            ;;
    esac

    #
    # Complete the option (Level 0 - right after cpack)
    #
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
} &&
complete -F _cpack -o default cpack

#
# ctest command
#
# have ctest &&
_ctest()
{
    local cur prev opts words cword
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    # seems to be only available on bash-completion 1.2
    #_get_comp_words_by_ref cur prev

    # cmake command line option we want to complete
    opts=`ctest --help | grep "\-\-.*" | cut -d" " -f 3 | sed s/,/\\\n/g`

    #
    #  Complete the arguments to some of
    #  the most commonly used commands (Level 1).
    #
    case "${prev}" in
        --help-command)
            local running=$(for x in `ctest --help-command-list | grep -v "ctest version" `; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        -R|-E)
            local running=$(for x in `ctest -N 2> /dev/null | grep "^  Test" | cut -d: -f 2`; do echo ${x} ; done )
            COMPREPLY=( $(compgen -W "${running}" -- ${cur}) )
            return 0
            ;;
        *)
            ;;
    esac

    #
    #  Complete the arguments to some of
    #  the most commonly used commands (Level 2).
    #   ?? How to do that ..

    #
    # Complete the option (Level 0 - right after cmake)
    #
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
} &&
complete -F _ctest -o default ctest

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
