#!/bin/sh

virtualenv_sh_verify_workon_home || return 1

if [ -z "${1:-}" ]; then
    virtualenv_sh_workon_list
    return 1
fi

_activate="$WORKON_HOME/$1/bin/activate"
if [ ! -f "$_activate" ]; then
    echo "ERROR: '$WORKON_HOME/$1' is not a virtualenv." >&2
    return 1
fi

if type deactivate >/dev/null 2>&1; then
    deactivate
fi

virtualenv_sh_run_hook "preactivate" "$1"

# virtualenv's scripts choke on nounset
virtualenv_sh_save_options && set +o nounset
. "$_activate"
virtualenv_sh_restore_options

# Save the deactivate function from virtualenv under a different name
_virtualenv_sh_original_deactivate=`typeset -f deactivate | sed 's/deactivate/virtualenv_deactivate/g'`
eval "$_virtualenv_sh_original_deactivate"
unset -f deactivate >/dev/null 2>&1

# Replace the deactivate() function with a wrapper.
eval 'deactivate () {
    old_env=${VIRTUAL_ENV##*/}
    
    # Call the local hook before the global so we can undo
    # any settings made by the local postactivate first.
    virtualenv_sh_run_hook "predeactivate" "${old_env}"
    
    # Call the original function.
    virtualenv_sh_save_options && set +o nounset
    virtualenv_deactivate "$@"
    virtualenv_sh_restore_options

    virtualenv_sh_run_hook "postdeactivate" "${old_env}"

    if [ ! "${1:-}" = "nondestructive" ]; then
        # Remove this function
        unset -f virtualenv_deactivate >/dev/null 2>&1
        unset -f deactivate >/dev/null 2>&1
    fi
}'

virtualenv_sh_run_hook "postactivate"
