#compdef trial conch mktap cftp tapconvert twistd ckeygen lore pyhtmlizer websetroot tap2deb tkmktap tkconch manhole tap2rpm

# This file is meant to be in your zsh function path. i.e. in one of those
# directories listed in your $fpath variable.
#
# e.g. /usr/local/share/zsh/site-functions/
#
# It is responsible for passing completion control to the correct
# completion function for the version of Twisted that is
# currently in use.
#
# Goals:
#
# We want to detect any changes to PYTHONPATH since the last time we ran.
# That way we can re-locate the completion functions so that we are sure
# to be completing for the right version of twisted.

local dir old_fpath python_code run

function debug () {
    echo $1 >> /tmp/debug
}

#debug "START _twisted_stub"

function load_twisted_completions() {
    python_code='
import twisted, os.path
dir = os.path.dirname(twisted.__file__)
print dir + os.sep + os.path.join("python", "zsh")
'
    dir=$(python -c "$python_code")
    #debug "Trying to load twisted functions from $dir"
    if [[ -r $dir/_twistd ]]; then
        old_fpath=($fpath)
        fpath=( $dir $fpath )
        autoload +X _trial _conch _mktap _cftp _tapconvert _twistd _ckeygen
        autoload +X _lore _pyhtmlizer _websetroot _tap2deb _tkmktap _tkconch
        autoload +X _manhole _tap2rpm
        fpath=($old_fpath)
    else
        echo 'ERROR: Cannot find twisted completion function files in'
        echo "$dir"
        return 1
    fi
}

function twisted_run () {
    # run completion function for current command
    eval _$words[1]
}

function twisted_save_load_run () {
    # save PYTHONPATH, load twisted completions, and run the completion
    # function for the current command
    PYTHONPATH_last=$PYTHONPATH
    load_twisted_completions && twisted_run
}


if [[ -n $PYTHONPATH_last ]]; then
    #debug "PYTHONPATH_last is set to $PYTHONPATH_last"
    #check if it's the same as the last time we ran
    if [[ $PYTHONPATH == $PYTHONPATH_last ]]; then
        #debug "PYTHONPATH == PYTHONPATH_last"
        # it's the same, which means we've already loaded completion
        # functions and nothing has changed.
        twisted_run
    else
        twisted_save_load_run
    fi
else
    twisted_save_load_run
fi

#debug "END _twisted_stub"
#
