# svk completion by Guillaume Rousse <guillomovitch@zarb.org>

have svk &&
_svk()
{
    local cur prev commands options command

    COMPREPLY=()
    cur=`_get_cword`

    commands='add admin annotate ann blame praise cat checkout co cleanup \
        cmerge cm commit ci copy cp delete del remove rm depotmap \
        depot describe desc diff di help h ? import info list ls log \
        merge mirror mi mkdir move mv ren rename patch propdel pd pdel \
        propedit pe pedit propget pg pget proplist pl plist propset ps \
        pset pull push resolved revert smerge sm status st stat switch \
        sw sync sy update up verify'

    if [[ $COMP_CWORD -eq 1 ]] ; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '--version' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W "$commands" -- "$cur" ) )
        fi
    else

        prev=${COMP_WORDS[COMP_CWORD-1]}
        case $prev in
            -@(F|-file|-targets))
                _filedir
                return 0;
                ;;
            --encoding)
                COMPREPLY=( $( compgen -W \
                    '$( iconv --list | sed -e "s@//@@;" )' -- "$cur" ) )
                return 0;
                ;;
        esac

        command=${COMP_WORDS[1]}

        if [[ "$cur" == -* ]]; then
            # possible options for the command
            case $command in
                add)
                    options=' --non-recursive -N -q --quiet'
                    ;;
                @(blame|annotate|ann|praise))
                    options='-r --revisions -x --cross'
                    ;;
                cat)
                    options='-r --revision'
                    ;;
                @(checkout|co))
                    options='-r --revision -q --quiet -N --non-recursive -l \
                        --list -d --detach --export --relocate --purge'
                    ;;
                cleanup)
                    options='-a --all'
                    ;;
                @(cmerge|cm))
                    options='-c --change -l --log -r --revision -a --auto \
                        --verbatim --no-ticket -m --message -F --file \
                        --template --encoding -P --patch -S --sign -C \
                        --check-only --direct'
                    ;;
                @(commit|ci))
                    options='--import -m --message -F --file --encoding \
                        --template -P --patch -S --sign -C --check-only -N \
                        --non-recursive --direct'
                    ;;
                @(copy|cp))
                    options='-r --revision -p --parent -q --quiet -m --message \
                        -F --file --template --encoding -P --patch -S --sign \
                        -C --check-only --direct'
                    ;;
                @(delete|del|remove|rm))
                    options='-k --keep-local -m --message -F --file --encoding \
                        --template -P --patch -S --sign -C --check-only \
                        --direct'
                    ;;
                @(depotmap|depot))
                    options='-i --init -l --list -d --detach --relocate'
                    ;;
                @(diff|di))
                    options='-r --revision -s --summarize -b --verbose -N \
                        --non-recursive'
                    ;;
                import)
                    options='-f --from-checkout -t --to-checkout -m --message \
                        -F --file --template --encoding -P --patch -S --sign \
                        -C --check-only -N --non-recursive --direct'
                    ;;
                @(list|ls))
                    options='-r --revision -v --verbose -R --recursive -d \
                        --depth -f --full-path'
                    ;;
                log)
                    options='-r --revision -l --limit -q --quiet -x --cross \
                        -v --verbose'
                    ;;
                merge)
                    options='-r --revision -c --change -I --incremental -a \
                        --auto -l --log -s --sync -t --to -f --from \
                        --verbatim --no-ticket --track-rename -m --message \
                        -F --file --template --encoding -P --patch -S --sign \
                        -C --check-only --direct'
                    ;;
                @(mirror|mi))
                    options='-l --list -d --detach --relocate --recover \
                        --unlock --upgrade'
                    ;;
                mkdir)
                    options='-p --parent -m --message -F --file --template \
                        --encoding -P --patch -S --sign -C --check-only \
                        --direct'
                    ;;
                @(move|mv|rename|ren))
                    options='-r --revision -p --parent -q --quiet -m \
                        --message -F --file --encoding --template -P --patch \
                        -S --sign -C --check-only --direct'
                    ;;
                patch)
                    options='--depot'
                    ;;
                @(propdel|propset|pdel|pset|pd|ps))
                    options='-R --recursive -r --revision --revprop -m \
                        --message -F --file --template --encoding -P --patch \
                        -S --sign -C --check-only -q --quiet --direct'
                    ;;
                @(propedit|pedit|pe))
                    options='-R --recursive -r --revision --revprop -m \
                        --message -F --file --template --encoding -P --patch \
                        -S --sign -C --check-only --direct'
                    ;;
                @(propget|pget|pg))
                    options='-R --recursive -r --revision --revprop --strict'
                    ;;
                @(proplist|plist|pl))
                    options='-R --recursive -v --verbose \
                        -r --revision --revprop'
                    ;;
                pull)
                    options='-a --all -l --lump'
                    ;;
                push)
                    options='-f --from -l --lump -C --check -P --patch -S \
                        --sign --verbatim'
                    ;;
                resolved)
                    options='-R --recursive'
                    ;;
                revert)
                    options='-R --recursive -q --quiet'
                    ;;
                @(smerge|sm))
                    options='-I --incremental -l --log -B --baseless -b \
                        --base -s --sync -t --to -f --from --verbatim \
                        --no-ticket --track-rename --host --remoterev -m \
                        --message -F --file --template --encoding -P --patch \
                        -S --sign -C --check-only --direct'
                    ;;
                @(status|stat|st))
                    options='-q --quiet --no-ignore -N --non-recursive -v \
                        --verbose'
                    ;;
                @(switch|sw))
                    options='-r --revision -d --detach -q --quiet'
                    ;;
                @(sync|sy))
                    options='-a --all -s --skipto -t --torev'
                    ;;
                @(update|up))
                    options='-r --revision -N --non-recursive -C --check-only \
                        -s --sync -m --merge -q --quiet'
                    ;;
            esac
            options="$options --help -h"

            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
        else
            case $command in
                @(help|h|\?))
                    COMPREPLY=( $( compgen -W "$commands \
                        environment commands intro" -- "$cur" ) )
                    ;;
                admin)
                    COMPREPLY=( $( compgen -W 'help deltify dump hotcopy \
                        list-dblogs list-unused-dblogs load lstxns recover \
                        rmtxns setlog verify rmcache' -- "$cur" ) )
                    ;;
                patch)
                    COMPREPLY=( $( compgen -W '--ls --list --cat --view \
                        --regen --regenerate --up --update --apply --rm \
                        --delete' -- "$cur" ) )
                    ;;
                sync)
                    COMPREPLY=( $( compgen -W "$( svk mirror --list \
                        2>/dev/null | awk '/^\//{print $1}' )" -- "$cur" ) )
                    ;;
                @(co|checkout|push|pull))
                    if [[ "$cur" == //*/* ]]; then
                        path=${cur%/*}/
                    else
                        path=//
                    fi
                    COMPREPLY=( $( compgen -W "$( svk list $path 2>/dev/null | \
                        sed -e 's|\(.*\)|'$path'\1|')" -- "$cur" ) )
                    ;;
                *)
                    _filedir
                    ;;
            esac
        fi
    fi

    return 0
} &&
complete -F _svk $filenames svk

# 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
