# 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:
