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