# lib/stackforge
#
# Functions to install stackforge libraries that we depend on so
# that we can try their git versions during devstack gate.
#
# This is appropriate for python libraries that release to pypi and are
# expected to be used beyond OpenStack like, but are requirements
# for core services in global-requirements.
#    * wsme
#    * pecan
#
# This is not appropriate for stackforge projects which are early stage
# OpenStack tools

# Dependencies:
# ``functions`` file

# ``stack.sh`` calls the entry points in this order:
#
# install_stackforge

# Save trace setting
XTRACE=$(set +o | grep xtrace)
set +o xtrace


# Defaults
# --------
WSME_DIR=$DEST/wsme
PECAN_DIR=$DEST/pecan

# Entry Points
# ------------

# install_stackforge() - Collect source and prepare
function install_stackforge() {
    # TODO(sdague): remove this once we get to Icehouse, this just makes
    # for a smoother transition of existing users.
    cleanup_stackforge

    git_clone $WSME_REPO $WSME_DIR $WSME_BRANCH
    setup_develop_no_requirements_update $WSME_DIR

    git_clone $PECAN_REPO $PECAN_DIR $PECAN_BRANCH
    setup_develop_no_requirements_update $PECAN_DIR
}

# cleanup_stackforge() - purge possibly old versions of stackforge libraries
function cleanup_stackforge() {
    # this means we've got an old version installed, lets get rid of it
    # otherwise python hates itself
    for lib in wsme pecan; do
        if ! python -c "import $lib" 2>/dev/null; then
            echo "Found old $lib... removing to ensure consistency"
            local PIP_CMD=$(get_pip_command)
            pip_install $lib
            sudo $PIP_CMD uninstall -y $lib
        fi
    done
}

# Restore xtrace
$XTRACE

# Local variables:
# mode: shell-script
# End:
