# svk(1) completion                                        -*- shell-script -*-

_svk()
{
    local cur prev words cword
    _init_completion || return

    local commands options command

    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 [[ $cword -eq 1 ]] ; then
        if [[ "$cur" == -* ]]; then
            COMPREPLY=( $( compgen -W '--version' -- "$cur" ) )
        else
            COMPREPLY=( $( compgen -W "$commands" -- "$cur" ) )
        fi
    else
        case $prev in
            -F|--file|--targets)
                _filedir
                return 0
                ;;
            --encoding)
                COMPREPLY=( $( compgen -W \
                    '$( iconv --list | command sed -e "s@//@@;" )' -- "$cur" ) )
                return 0
                ;;
        esac

        command=${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+=" --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 "$( $1 mirror --list \
                        2>/dev/null | awk '/^\//{print $1}' )" -- "$cur" ) )
                    ;;
                co|checkout|push|pull)
                    if [[ "$cur" == //*/* ]]; then
                        path=${cur%/*}/
                    else
                        path=//
                    fi
                    COMPREPLY=( $( compgen -W "$( $1 list $path 2>/dev/null | \
                        command sed -e 's|\(.*\)|'$path'\1|')" -- "$cur" ) )
                    ;;
                *)
                    _filedir
                    ;;
            esac
        fi
    fi

    return 0
} &&
complete -F _svk svk

# ex: ts=4 sw=4 et filetype=sh
