diff --git a/src/main/resources/scripts/gvm b/src/main/resources/scripts/gvm deleted file mode 100755 index dc3454ca..00000000 --- a/src/main/resources/scripts/gvm +++ /dev/null @@ -1,476 +0,0 @@ -#!/bin/bash - -# -# Copyright 2012 Marco Vermeulen -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# -# function definitions -# - -function __gvmtool_help { - echo "" - echo "Usage: gvm [version]" - echo "" - echo " command : install, uninstall, list, use, current, version, default, selfupdate, broadcast or help" - echo " candidate : groovy, grails, griffon, gradle, vert.x" - echo " version : optional, defaults to latest stable if not provided" - echo "" - echo "eg: gvm install groovy" -} - -function __gvmtool_check_candidate_present { - if [ -z "$1" ]; then - echo -e "\nNo candidate provided." - __gvmtool_help - return 1 - fi -} - -function __gvmtool_check_version_present { - if [ -z "$1" ]; then - echo -e "\nNo candidate version provided." - __gvmtool_help - return 1 - fi -} - -function __gvmtool_determine_version { - if [[ "${GVM_ONLINE}" == "false" && -n "$1" && -d "${GVM_DIR}/${CANDIDATE}/$1" ]]; then - VERSION="$1" - - elif [[ "${GVM_ONLINE}" == "false" && -z "$1" && -L "${GVM_DIR}/${CANDIDATE}/current" ]]; then - VERSION=$(readlink "${GVM_DIR}/${CANDIDATE}/current" | sed -e "s!${GVM_DIR}/${CANDIDATE}/!!g") - - elif [[ "${GVM_ONLINE}" == "false" && -n "$1" ]]; then - echo "Stop! ${CANDIDATE} ${1} is not available in aeroplane mode." - return 1 - - elif [[ "${GVM_ONLINE}" == "false" && -z "$1" ]]; then - echo "${OFFLINE_MESSAGE}" - return 1 - - elif [[ "${GVM_ONLINE}" == "true" && -z "$1" ]]; then - VERSION=$(curl -s "${GVM_SERVICE}/candidates/${CANDIDATE}/default") - - else - VERSION_VALID=$(curl -s "${GVM_SERVICE}/candidates/${CANDIDATE}/$1") - if [[ ${VERSION_VALID} == 'valid' ]]; then - VERSION="$1" - else - echo "" - echo "Stop! $1 is not a valid ${CANDIDATE} version." - return 1 - fi - fi -} - -function __gvmtool_build_version_csv { - CANDIDATE="$1" - CSV="" - for version in $(ls -1 "${GVM_DIR}/${CANDIDATE}"); do - if [ ${version} != 'current' ]; then - CSV="${version},${CSV}" - fi - done - CSV=${CSV%?} -} - -function __gvmtool_determine_current_version { - unset CURRENT - CANDIDATE="$1" - - if [[ -n ${isolated_mode} && ${isolated_mode} == 1 ]]; then - CURRENT=$(echo $PATH | sed -E "s|.gvm/${CANDIDATE}/([^/]+)/bin|!!\1!!|1" | sed -E "s|^.*!!(.+)!!.*$|\1|g") - - if [[ "${CURRENT}" == "current" ]]; then - unset CURRENT - fi - fi - - if [[ -z ${CURRENT} ]]; then - CURRENT=$(readlink "${GVM_DIR}/${CANDIDATE}/current" | sed -e "s!${GVM_DIR}/${CANDIDATE}/!!g") - fi -} - -function __gvmtool_download { - CANDIDATE="$1" - VERSION="$2" - mkdir -p "${GVM_DIR}/archives" - if [ ! -f "${GVM_DIR}/archives/${CANDIDATE}-${VERSION}.zip" ]; then - echo "" - echo "Downloading: ${CANDIDATE} ${VERSION}" - echo "" - DOWNLOAD_URL="${GVM_SERVICE}/download/${CANDIDATE}/${VERSION}?platform=${GVM_PLATFORM}" - ZIP_ARCHIVE="${GVM_DIR}/archives/${CANDIDATE}-${VERSION}.zip" - curl -L "${DOWNLOAD_URL}" > "${ZIP_ARCHIVE}" - __gvmtool_validate_zip "${ZIP_ARCHIVE}" || return 1 - else - echo "" - echo "Found a previously downloaded ${CANDIDATE} ${VERSION} archive. Not downloading it again..." - __gvmtool_validate_zip "${GVM_DIR}/archives/${CANDIDATE}-${VERSION}.zip" || return 1 - fi - echo "" -} - -function __gvmtool_validate_zip { - ZIP_ARCHIVE="$1" - ZIP_OK=$(unzip -t "${ZIP_ARCHIVE}" | grep 'No errors detected in compressed data') - if [ -z "${ZIP_OK}" ]; then - rm "${ZIP_ARCHIVE}" - echo "" - echo "Stop! The archive was corrupt and has been removed! Please try installing again." - return 1 - fi -} - -function __gvmtool_default_environment_variables { - if [ ! "${GVM_SERVICE}" ]; then - GVM_SERVICE="http://localhost:8080" - fi - - if [ ! "${GVM_DIR}" ]; then - GVM_DIR="$HOME/.gvm" - fi -} - -function __gvmtool_check_upgrade_available { - UPGRADE_AVAILABLE="" - UPGRADE_NOTICE=$(echo "${BROADCAST_LIVE}" | grep 'Your version of GVM is out of date!') - if [[ -n "${UPGRADE_NOTICE}" && ( "${COMMAND}" != 'selfupdate' ) ]]; then - UPGRADE_AVAILABLE="true" - fi -} - -function __gvmtool_update_broadcast { - COMMAND="$1" - BROADCAST_FILE="${GVM_DIR}/var/broadcast" - if [ -f "${BROADCAST_FILE}" ]; then - BROADCAST_HIST=$(cat "${BROADCAST_FILE}") - fi - - if [[ "${GVM_ONLINE}" == "true" && ( "${BROADCAST_LIVE}" != "${BROADCAST_HIST}" ) && ( "${COMMAND}" != 'broadcast' ) ]]; then - mkdir -p "${GVM_DIR}/var" - echo "${BROADCAST_LIVE}" > "${BROADCAST_FILE}" - echo "${BROADCAST_LIVE}" - fi -} - -function __gvmtool_link_candidate_version { - CANDIDATE="$1" - VERSION="$2" - - # Change the 'current' symlink for the candidate, hence affecting all shells. - if [ -L "${GVM_DIR}/${CANDIDATE}/current" ]; then - unlink "${GVM_DIR}/${CANDIDATE}/current" - fi - ln -s "${GVM_DIR}/${CANDIDATE}/${VERSION}" "${GVM_DIR}/${CANDIDATE}/current" -} - -function __gvmtool_install_candidate_version { - CANDIDATE="$1" - VERSION="$2" - __gvmtool_download "${CANDIDATE}" "${VERSION}" || return 1 - echo "Installing: ${CANDIDATE} ${VERSION}" - - mkdir -p "${GVM_DIR}/${CANDIDATE}" - - unzip -oq "${GVM_DIR}/archives/${CANDIDATE}-${VERSION}.zip" -d "/tmp/" - mv "/tmp/${CANDIDATE}-${VERSION}" "${GVM_DIR}/${CANDIDATE}/${VERSION}" - echo "Done installing!" - echo "" -} - -function __gvmtool_offline_list { - echo "------------------------------------------------------------" - echo "Aeroplane Mode: only showing installed ${CANDIDATE} versions" - echo "------------------------------------------------------------" - echo " " - - gvm_versions=($(echo ${CSV//,/ })) - for (( i=0 ; i <= ${#gvm_versions} ; i++ )); do - if [[ -n "${gvm_versions[${i}]}" ]]; then - if [[ "${gvm_versions[${i}]}" == "${CURRENT}" ]]; then - echo -e " > ${gvm_versions[${i}]}" - else - echo -e " * ${gvm_versions[${i}]}" - fi - fi - done - - if [[ -z "${gvm_versions[@]}" ]]; then - echo " None installed!" - fi - - echo "------------------------------------------------------------" - echo "* - installed " - echo "> - currently in use " - echo "------------------------------------------------------------" - - unset CSV gvm_versions -} - -# -# Command functions -# - -function __gvmtool_install { - CANDIDATE="$1" - __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 - __gvmtool_determine_version "$2" || return 1 - - if [ -d "${GVM_DIR}/${CANDIDATE}/${VERSION}" ]; then - echo "" - echo "Stop! ${CANDIDATE} ${VERSION} is already installed." - return 1 - fi - - __gvmtool_install_candidate_version "${CANDIDATE}" "${VERSION}" || return 1 - - echo -n "Do you want to use ${CANDIDATE} ${VERSION} now? (Y/n): " - read USE - if [[ -z "${USE}" || "${USE}" == "y" || "${USE}" == "Y" ]]; then - __gvmtool_link_candidate_version "${CANDIDATE}" "${VERSION}" - - echo "" - echo Using "${CANDIDATE}" version "${VERSION}" - fi -} - -function __gvmtool_use { - CANDIDATE="$1" - __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 - __gvmtool_determine_version "$2" || return 1 - - if [[ "${GVM_ONLINE}" == "true" && ! -d "${GVM_DIR}/${CANDIDATE}/${VERSION}" ]]; then - echo "" - echo "Stop! ${CANDIDATE} ${VERSION} is not installed." - echo -n "Do you want to install it now? (Y/n): " - read INSTALL - if [[ -z "${INSTALL}" || "${INSTALL}" == "y" || "${INSTALL}" == "Y" ]]; then - __gvmtool_install_candidate_version "${CANDIDATE}" "${VERSION}" - else - return 1 - fi - fi - - if [[ -n ${isolated_mode} && ${isolated_mode} == 1 ]]; then - # Just update the *_HOME and PATH for this shell. - case "${CANDIDATE}" in - vert.x ) - export VERTX_HOME="${GVM_DIR}/vert.x/${VERSION}" - ;; - - * ) - UPPER_CANDIDATE=`echo "${CANDIDATE}" | tr '[:lower:]' '[:upper:]'` - export "${UPPER_CANDIDATE}_HOME"="${GVM_DIR}/${CANDIDATE}/${VERSION}" - ;; - esac - - # Replace the current path for the candidate with the selected version. - export PATH=`echo $PATH | sed -E "s!${GVM_DIR}/${CANDIDATE}/([0-9][^/]+|current)!${GVM_DIR}/${CANDIDATE}/${VERSION}!g"` - else - __gvmtool_link_candidate_version "${CANDIDATE}" "${VERSION}" - fi - - echo "" - echo Using "${CANDIDATE}" version "${VERSION} in this shell." -} - -function __gvmtool_default { - CANDIDATE="$1" - __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 - __gvmtool_determine_version "$2" || return 1 - - if [ ! -d "${GVM_DIR}/${CANDIDATE}/${VERSION}" ]; then - echo "" - echo "Stop! ${CANDIDATE} ${VERSION} is not installed." - return 1 - fi - - __gvmtool_link_candidate_version "${CANDIDATE}" "${VERSION}" - - echo "" - echo "Default ${CANDIDATE} version set to ${VERSION}" -} - -function __gvmtool_current { - if [ -n "$1" ]; then - CANDIDATE="$1" - __gvmtool_determine_current_version "${CANDIDATE}" - if [ -n "${CURRENT}" ]; then - echo "Using ${CANDIDATE} version ${CURRENT}" - else - echo "Not using any version of ${CANDIDATE}" - fi - else - # The candidates are assigned to an array for zsh compliance, a list of words is not iterable - # Arrays are the only way, but unfortunately zsh arrays are not backward compatible with bash - # In bash arrays are zero index based, in zsh they are 1 based(!) - INSTALLED_COUNT=0 - # Starts at 0 for bash, ends at the candidate array size for zsh - for (( i=0; i <= ${#GVM_CANDIDATES}; i++ )); do - # Eliminate empty entries due to incompatibility - if [[ -n ${GVM_CANDIDATES[${i}]} ]]; then - __gvmtool_determine_current_version "${GVM_CANDIDATES[${i}]}" - if [ -n "${CURRENT}" ]; then - if [ ${INSTALLED_COUNT} -eq 0 ]; then - echo 'Using:' - fi - echo "${GVM_CANDIDATES[${i}]}: ${CURRENT}" - (( INSTALLED_COUNT += 1 )) - fi - fi - done - if [ ${INSTALLED_COUNT} -eq 0 ]; then - echo 'No candidates are in use' - fi - fi -} - -function __gvmtool_list { - CANDIDATE="$1" - __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 - __gvmtool_build_version_csv "${CANDIDATE}" - __gvmtool_determine_current_version "${CANDIDATE}" - if [[ "${GVM_ONLINE}" == "false" ]]; then - __gvmtool_offline_list - else - FRAGMENT=$(curl -s "${GVM_SERVICE}/candidates/${CANDIDATE}/list?platform=${GVM_PLATFORM}¤t=${CURRENT}&installed=${CSV}") - echo "${FRAGMENT}" - unset FRAGMENT - fi -} - -function __gvmtool_uninstall { - CANDIDATE="$1" - VERSION="$2" - __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 - __gvmtool_check_version_present "${VERSION}" || return 1 - CURRENT=$(readlink "${GVM_DIR}/${CANDIDATE}/current" | sed -e "s_${GVM_DIR}/${CANDIDATE}/__g") - if [[ -h "${GVM_DIR}/${CANDIDATE}/current" && ( "${VERSION}" == "${CURRENT}" ) ]]; then - echo "" - echo "Unselecting ${CANDIDATE} ${VERSION}..." - unlink "${GVM_DIR}/${CANDIDATE}/current" - fi - echo "" - if [ -d "${GVM_DIR}/${CANDIDATE}/${VERSION}" ]; then - echo "Uninstalling ${CANDIDATE} ${VERSION}..." - rm -rf "${GVM_DIR}/${CANDIDATE}/${VERSION}" - else - echo "${CANDIDATE} ${VERSION} is not installed." - fi -} - -function __gvmtool_version { - echo "Groovy enVironment Manager ${GVM_VERSION}" -} - -function __gvmtool_broadcast { - if [ "${BROADCAST_HIST}" ]; then - echo "${BROADCAST_HIST}" - else - echo "${BROADCAST_LIVE}" - fi -} - -function __gvmtool_selfupdate { - if [[ "${GVM_ONLINE}" == "false" ]]; then - echo "${OFFLINE_MESSAGE}" - else - curl -s "${GVM_SERVICE}/selfupdate" | bash - fi -} - -# INSERT NEW COMMANDS BEFORE HERE - -# Main command -function gvm { - # - # Various sanity checks and default settings - # - __gvmtool_default_environment_variables - mkdir -p "${GVM_DIR}" - - BROADCAST_LIVE=$(curl -s "${GVM_SERVICE}/broadcast/${GVM_VERSION}") - if [[ -z "${BROADCAST_LIVE}" && "${GVM_ONLINE}" == "true" ]]; then - echo "${OFFLINE_BROADCAST}" - fi - - if [[ -n "${BROADCAST_LIVE}" && "${GVM_ONLINE}" == "false" ]]; then - echo "${ONLINE_BROADCAST}" - fi - - - if [[ -z "${BROADCAST_LIVE}" ]]; then - GVM_ONLINE="false" - else - GVM_ONLINE="true" - fi - - - __gvmtool_check_upgrade_available - if [[ -n "${UPGRADE_AVAILABLE}" && ( "$1" != "broadcast" ) ]]; then - echo "${BROADCAST_LIVE}" - echo "" - else - __gvmtool_update_broadcast "$1" - fi - - # Load the gvm config if it exists. - if [ -f "${GVM_DIR}/etc/config" ]; then - source "${GVM_DIR}/etc/config" - fi - - # Check whether the command exists as an internal function... - # - # NOTE Internal commands use underscores rather than hyphens, - # hence the name conversion as the first step here. - CONVERTED_CMD_NAME=`echo "$1" | tr '-' '_'` - CMD_FOUND="" - if [[ -f "${GVM_DIR}/bin/gvm" ]]; then - CMD_FOUND=$(grep __gvmtool_"${CONVERTED_CMD_NAME}" "${GVM_DIR}/bin/gvm") - fi - - # ...no command provided - if [[ -z "$1" ]]; then - __gvmtool_help - return 1 - fi - - # ...or as a script on the path. - SCRIPT_PATH="${GVM_DIR}/ext/gvm-$1.sh" - if [[ -z "${CMD_FOUND}" && ! -f "${SCRIPT_PATH}" ]]; then - echo -e "\nInvalid command: $1" - __gvmtool_help - return 1 - fi - - # Check whether the candidate exists - if [[ -n "$2" && -z $(echo ${GVM_CANDIDATES[@]} | grep -w "$2") ]]; then - echo -e "\nStop! $2 is not a valid candidate." - return 1 - fi - - # Execute the requested command - if [ -n "${CMD_FOUND}" ]; then - # It's available as a shell function - __gvmtool_"${CONVERTED_CMD_NAME}" "$2" "$3" - else - # It's a shell script in the extensions directory - ${SCRIPT_PATH} "$1" "$2" "$3" - fi -} - diff --git a/src/main/resources/scripts/gvm-broadcast.sh b/src/main/resources/scripts/gvm-broadcast.sh new file mode 100644 index 00000000..f231533e --- /dev/null +++ b/src/main/resources/scripts/gvm-broadcast.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function __gvmtool_broadcast { + if [ "${BROADCAST_HIST}" ]; then + echo "${BROADCAST_HIST}" + else + echo "${BROADCAST_LIVE}" + fi +} diff --git a/src/main/resources/scripts/gvm-common.sh b/src/main/resources/scripts/gvm-common.sh new file mode 100644 index 00000000..db954d6a --- /dev/null +++ b/src/main/resources/scripts/gvm-common.sh @@ -0,0 +1,224 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +# +# common internal function definitions +# + +function __gvmtool_help { + echo "" + echo "Usage: gvm [version]" + echo "" + echo " command : install, uninstall, list, use, current, version, default, selfupdate, broadcast or help" + echo " candidate : groovy, grails, griffon, gradle, vert.x" + echo " version : optional, defaults to latest stable if not provided" + echo "" + echo "eg: gvm install groovy" +} + +function __gvmtool_check_candidate_present { + if [ -z "$1" ]; then + echo -e "\nNo candidate provided." + __gvmtool_help + return 1 + fi +} + +function __gvmtool_check_version_present { + if [ -z "$1" ]; then + echo -e "\nNo candidate version provided." + __gvmtool_help + return 1 + fi +} + +function __gvmtool_determine_version { + if [[ "${GVM_ONLINE}" == "false" && -n "$1" && -d "${GVM_DIR}/${CANDIDATE}/$1" ]]; then + VERSION="$1" + + elif [[ "${GVM_ONLINE}" == "false" && -z "$1" && -L "${GVM_DIR}/${CANDIDATE}/current" ]]; then + VERSION=$(readlink "${GVM_DIR}/${CANDIDATE}/current" | sed -e "s!${GVM_DIR}/${CANDIDATE}/!!g") + + elif [[ "${GVM_ONLINE}" == "false" && -n "$1" ]]; then + echo "Stop! ${CANDIDATE} ${1} is not available in aeroplane mode." + return 1 + + elif [[ "${GVM_ONLINE}" == "false" && -z "$1" ]]; then + echo "${OFFLINE_MESSAGE}" + return 1 + + elif [[ "${GVM_ONLINE}" == "true" && -z "$1" ]]; then + VERSION=$(curl -s "${GVM_SERVICE}/candidates/${CANDIDATE}/default") + + else + VERSION_VALID=$(curl -s "${GVM_SERVICE}/candidates/${CANDIDATE}/$1") + if [[ ${VERSION_VALID} == 'valid' ]]; then + VERSION="$1" + else + echo "" + echo "Stop! $1 is not a valid ${CANDIDATE} version." + return 1 + fi + fi +} + +function __gvmtool_build_version_csv { + CANDIDATE="$1" + CSV="" + for version in $(ls -1 "${GVM_DIR}/${CANDIDATE}"); do + if [ ${version} != 'current' ]; then + CSV="${version},${CSV}" + fi + done + CSV=${CSV%?} +} + +function __gvmtool_determine_current_version { + unset CURRENT + CANDIDATE="$1" + + if [[ -n ${isolated_mode} && ${isolated_mode} == 1 ]]; then + CURRENT=$(echo $PATH | sed -E "s|.gvm/${CANDIDATE}/([^/]+)/bin|!!\1!!|1" | sed -E "s|^.*!!(.+)!!.*$|\1|g") + + if [[ "${CURRENT}" == "current" ]]; then + unset CURRENT + fi + fi + + if [[ -z ${CURRENT} ]]; then + CURRENT=$(readlink "${GVM_DIR}/${CANDIDATE}/current" | sed -e "s!${GVM_DIR}/${CANDIDATE}/!!g") + fi +} + +function __gvmtool_download { + CANDIDATE="$1" + VERSION="$2" + mkdir -p "${GVM_DIR}/archives" + if [ ! -f "${GVM_DIR}/archives/${CANDIDATE}-${VERSION}.zip" ]; then + echo "" + echo "Downloading: ${CANDIDATE} ${VERSION}" + echo "" + DOWNLOAD_URL="${GVM_SERVICE}/download/${CANDIDATE}/${VERSION}?platform=${GVM_PLATFORM}" + ZIP_ARCHIVE="${GVM_DIR}/archives/${CANDIDATE}-${VERSION}.zip" + curl -L "${DOWNLOAD_URL}" > "${ZIP_ARCHIVE}" + __gvmtool_validate_zip "${ZIP_ARCHIVE}" || return 1 + else + echo "" + echo "Found a previously downloaded ${CANDIDATE} ${VERSION} archive. Not downloading it again..." + __gvmtool_validate_zip "${GVM_DIR}/archives/${CANDIDATE}-${VERSION}.zip" || return 1 + fi + echo "" +} + +function __gvmtool_validate_zip { + ZIP_ARCHIVE="$1" + ZIP_OK=$(unzip -t "${ZIP_ARCHIVE}" | grep 'No errors detected in compressed data') + if [ -z "${ZIP_OK}" ]; then + rm "${ZIP_ARCHIVE}" + echo "" + echo "Stop! The archive was corrupt and has been removed! Please try installing again." + return 1 + fi +} + +function __gvmtool_default_environment_variables { + if [ ! "${GVM_SERVICE}" ]; then + GVM_SERVICE="http://localhost:8080" + fi + + if [ ! "${GVM_DIR}" ]; then + GVM_DIR="$HOME/.gvm" + fi +} + +function __gvmtool_check_upgrade_available { + UPGRADE_AVAILABLE="" + UPGRADE_NOTICE=$(echo "${BROADCAST_LIVE}" | grep 'Your version of GVM is out of date!') + if [[ -n "${UPGRADE_NOTICE}" && ( "${COMMAND}" != 'selfupdate' ) ]]; then + UPGRADE_AVAILABLE="true" + fi +} + +function __gvmtool_update_broadcast { + COMMAND="$1" + BROADCAST_FILE="${GVM_DIR}/var/broadcast" + if [ -f "${BROADCAST_FILE}" ]; then + BROADCAST_HIST=$(cat "${BROADCAST_FILE}") + fi + + if [[ "${GVM_ONLINE}" == "true" && ( "${BROADCAST_LIVE}" != "${BROADCAST_HIST}" ) && ( "${COMMAND}" != 'broadcast' ) ]]; then + mkdir -p "${GVM_DIR}/var" + echo "${BROADCAST_LIVE}" > "${BROADCAST_FILE}" + echo "${BROADCAST_LIVE}" + fi +} + +function __gvmtool_link_candidate_version { + CANDIDATE="$1" + VERSION="$2" + + # Change the 'current' symlink for the candidate, hence affecting all shells. + if [ -L "${GVM_DIR}/${CANDIDATE}/current" ]; then + unlink "${GVM_DIR}/${CANDIDATE}/current" + fi + ln -s "${GVM_DIR}/${CANDIDATE}/${VERSION}" "${GVM_DIR}/${CANDIDATE}/current" +} + +function __gvmtool_install_candidate_version { + CANDIDATE="$1" + VERSION="$2" + __gvmtool_download "${CANDIDATE}" "${VERSION}" || return 1 + echo "Installing: ${CANDIDATE} ${VERSION}" + + mkdir -p "${GVM_DIR}/${CANDIDATE}" + + unzip -oq "${GVM_DIR}/archives/${CANDIDATE}-${VERSION}.zip" -d "/tmp/" + mv "/tmp/${CANDIDATE}-${VERSION}" "${GVM_DIR}/${CANDIDATE}/${VERSION}" + echo "Done installing!" + echo "" +} + +function __gvmtool_offline_list { + echo "------------------------------------------------------------" + echo "Aeroplane Mode: only showing installed ${CANDIDATE} versions" + echo "------------------------------------------------------------" + echo " " + + gvm_versions=($(echo ${CSV//,/ })) + for (( i=0 ; i <= ${#gvm_versions} ; i++ )); do + if [[ -n "${gvm_versions[${i}]}" ]]; then + if [[ "${gvm_versions[${i}]}" == "${CURRENT}" ]]; then + echo -e " > ${gvm_versions[${i}]}" + else + echo -e " * ${gvm_versions[${i}]}" + fi + fi + done + + if [[ -z "${gvm_versions[@]}" ]]; then + echo " None installed!" + fi + + echo "------------------------------------------------------------" + echo "* - installed " + echo "> - currently in use " + echo "------------------------------------------------------------" + + unset CSV gvm_versions +} diff --git a/src/main/resources/scripts/gvm-current.sh b/src/main/resources/scripts/gvm-current.sh new file mode 100644 index 00000000..ebe351f9 --- /dev/null +++ b/src/main/resources/scripts/gvm-current.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +function __gvmtool_current { + if [ -n "$1" ]; then + CANDIDATE="$1" + __gvmtool_determine_current_version "${CANDIDATE}" + if [ -n "${CURRENT}" ]; then + echo "Using ${CANDIDATE} version ${CURRENT}" + else + echo "Not using any version of ${CANDIDATE}" + fi + else + # The candidates are assigned to an array for zsh compliance, a list of words is not iterable + # Arrays are the only way, but unfortunately zsh arrays are not backward compatible with bash + # In bash arrays are zero index based, in zsh they are 1 based(!) + INSTALLED_COUNT=0 + # Starts at 0 for bash, ends at the candidate array size for zsh + for (( i=0; i <= ${#GVM_CANDIDATES}; i++ )); do + # Eliminate empty entries due to incompatibility + if [[ -n ${GVM_CANDIDATES[${i}]} ]]; then + __gvmtool_determine_current_version "${GVM_CANDIDATES[${i}]}" + if [ -n "${CURRENT}" ]; then + if [ ${INSTALLED_COUNT} -eq 0 ]; then + echo 'Using:' + fi + echo "${GVM_CANDIDATES[${i}]}: ${CURRENT}" + (( INSTALLED_COUNT += 1 )) + fi + fi + done + if [ ${INSTALLED_COUNT} -eq 0 ]; then + echo 'No candidates are in use' + fi + fi +} diff --git a/src/main/resources/scripts/gvm-default.sh b/src/main/resources/scripts/gvm-default.sh new file mode 100644 index 00000000..651f91ca --- /dev/null +++ b/src/main/resources/scripts/gvm-default.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function __gvmtool_default { + CANDIDATE="$1" + __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 + __gvmtool_determine_version "$2" || return 1 + + if [ ! -d "${GVM_DIR}/${CANDIDATE}/${VERSION}" ]; then + echo "" + echo "Stop! ${CANDIDATE} ${VERSION} is not installed." + return 1 + fi + + __gvmtool_link_candidate_version "${CANDIDATE}" "${VERSION}" + + echo "" + echo "Default ${CANDIDATE} version set to ${VERSION}" +} diff --git a/src/main/resources/scripts/gvm-init.sh b/src/main/resources/scripts/gvm-init.sh index f6e9a32c..72f14074 100755 --- a/src/main/resources/scripts/gvm-init.sh +++ b/src/main/resources/scripts/gvm-init.sh @@ -58,8 +58,18 @@ VERTX_HOME="${GVM_DIR}/vert.x/current" export PATH="${GROOVY_HOME}/bin:${GRAILS_HOME}/bin:${GRIFFON_HOME}/bin:${GRADLE_HOME}/bin:${VERTX_HOME}/bin:$PATH" -# Source the main `gvm` script. -source "${GVM_DIR}/bin/gvm" +# Source gvm module scripts. +source "${GVM_DIR}/bin/gvm-common.sh" +source "${GVM_DIR}/bin/gvm-broadcast.sh" +source "${GVM_DIR}/bin/gvm-current.sh" +source "${GVM_DIR}/bin/gvm-default.sh" +source "${GVM_DIR}/bin/gvm-install.sh" +source "${GVM_DIR}/bin/gvm-list.sh" +source "${GVM_DIR}/bin/gvm-selfupdate.sh" +source "${GVM_DIR}/bin/gvm-uninstall.sh" +source "${GVM_DIR}/bin/gvm-use.sh" +source "${GVM_DIR}/bin/gvm-version.sh" +source "${GVM_DIR}/bin/gvm-main.sh" # Source extension files prefixed with 'sourced-' and found in the ext/ folder # Use this if extensions are written with the functional approach and want diff --git a/src/main/resources/scripts/gvm-install.sh b/src/main/resources/scripts/gvm-install.sh new file mode 100644 index 00000000..cb60501f --- /dev/null +++ b/src/main/resources/scripts/gvm-install.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function __gvmtool_install { + CANDIDATE="$1" + __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 + __gvmtool_determine_version "$2" || return 1 + + if [ -d "${GVM_DIR}/${CANDIDATE}/${VERSION}" ]; then + echo "" + echo "Stop! ${CANDIDATE} ${VERSION} is already installed." + return 1 + fi + + __gvmtool_install_candidate_version "${CANDIDATE}" "${VERSION}" || return 1 + + echo -n "Do you want to use ${CANDIDATE} ${VERSION} now? (Y/n): " + read USE + if [[ -z "${USE}" || "${USE}" == "y" || "${USE}" == "Y" ]]; then + __gvmtool_link_candidate_version "${CANDIDATE}" "${VERSION}" + + echo "" + echo Using "${CANDIDATE}" version "${VERSION}" + fi +} diff --git a/src/main/resources/scripts/gvm-list.sh b/src/main/resources/scripts/gvm-list.sh new file mode 100644 index 00000000..0f8f8cb4 --- /dev/null +++ b/src/main/resources/scripts/gvm-list.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function __gvmtool_list { + CANDIDATE="$1" + __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 + __gvmtool_build_version_csv "${CANDIDATE}" + __gvmtool_determine_current_version "${CANDIDATE}" + if [[ "${GVM_ONLINE}" == "false" ]]; then + __gvmtool_offline_list + else + FRAGMENT=$(curl -s "${GVM_SERVICE}/candidates/${CANDIDATE}/list?platform=${GVM_PLATFORM}¤t=${CURRENT}&installed=${CSV}") + echo "${FRAGMENT}" + unset FRAGMENT + fi +} diff --git a/src/main/resources/scripts/gvm-main.sh b/src/main/resources/scripts/gvm-main.sh new file mode 100644 index 00000000..6fce7921 --- /dev/null +++ b/src/main/resources/scripts/gvm-main.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function gvm { + # + # Various sanity checks and default settings + # + __gvmtool_default_environment_variables + mkdir -p "${GVM_DIR}" + + BROADCAST_LIVE=$(curl -s "${GVM_SERVICE}/broadcast/${GVM_VERSION}") + if [[ -z "${BROADCAST_LIVE}" && "${GVM_ONLINE}" == "true" ]]; then + echo "${OFFLINE_BROADCAST}" + fi + + if [[ -n "${BROADCAST_LIVE}" && "${GVM_ONLINE}" == "false" ]]; then + echo "${ONLINE_BROADCAST}" + fi + + + if [[ -z "${BROADCAST_LIVE}" ]]; then + GVM_ONLINE="false" + else + GVM_ONLINE="true" + fi + + + __gvmtool_check_upgrade_available + if [[ -n "${UPGRADE_AVAILABLE}" && ( "$1" != "broadcast" ) ]]; then + echo "${BROADCAST_LIVE}" + echo "" + else + __gvmtool_update_broadcast "$1" + fi + + # Load the gvm config if it exists. + if [ -f "${GVM_DIR}/etc/config" ]; then + source "${GVM_DIR}/etc/config" + fi + + # Check whether the command exists as an internal function... + # + # NOTE Internal commands use underscores rather than hyphens, + # hence the name conversion as the first step here. + CONVERTED_CMD_NAME=`echo "$1" | tr '-' '_'` + CMD_FOUND="" + if [[ -f "${GVM_DIR}/bin/gvm-$1.sh" ]]; then + CMD_FOUND="${GVM_DIR}/bin/gvm-$1.sh" + fi + + # ...no command provided + if [[ -z "$1" ]]; then + __gvmtool_help + return 1 + fi + + # ...or as a script on the path. + SCRIPT_PATH="${GVM_DIR}/ext/gvm-$1.sh" + if [[ -z "${CMD_FOUND}" && ! -f "${SCRIPT_PATH}" ]]; then + echo -e "\nInvalid command: $1" + __gvmtool_help + return 1 + fi + + # Check whether the candidate exists + if [[ -n "$2" && -z $(echo ${GVM_CANDIDATES[@]} | grep -w "$2") ]]; then + echo -e "\nStop! $2 is not a valid candidate." + return 1 + fi + + # Execute the requested command + if [ -n "${CMD_FOUND}" ]; then + # It's available as a shell function + __gvmtool_"${CONVERTED_CMD_NAME}" "$2" "$3" + else + # It's a shell script in the extensions directory + ${SCRIPT_PATH} "$1" "$2" "$3" + fi +} diff --git a/src/main/resources/scripts/gvm-selfupdate.sh b/src/main/resources/scripts/gvm-selfupdate.sh new file mode 100644 index 00000000..ee7d351f --- /dev/null +++ b/src/main/resources/scripts/gvm-selfupdate.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function __gvmtool_selfupdate { + if [[ "${GVM_ONLINE}" == "false" ]]; then + echo "${OFFLINE_MESSAGE}" + else + curl -s "${GVM_SERVICE}/selfupdate" | bash + fi +} diff --git a/src/main/resources/scripts/gvm-uninstall.sh b/src/main/resources/scripts/gvm-uninstall.sh new file mode 100644 index 00000000..f075036c --- /dev/null +++ b/src/main/resources/scripts/gvm-uninstall.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function __gvmtool_uninstall { + CANDIDATE="$1" + VERSION="$2" + __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 + __gvmtool_check_version_present "${VERSION}" || return 1 + CURRENT=$(readlink "${GVM_DIR}/${CANDIDATE}/current" | sed -e "s_${GVM_DIR}/${CANDIDATE}/__g") + if [[ -h "${GVM_DIR}/${CANDIDATE}/current" && ( "${VERSION}" == "${CURRENT}" ) ]]; then + echo "" + echo "Unselecting ${CANDIDATE} ${VERSION}..." + unlink "${GVM_DIR}/${CANDIDATE}/current" + fi + echo "" + if [ -d "${GVM_DIR}/${CANDIDATE}/${VERSION}" ]; then + echo "Uninstalling ${CANDIDATE} ${VERSION}..." + rm -rf "${GVM_DIR}/${CANDIDATE}/${VERSION}" + else + echo "${CANDIDATE} ${VERSION} is not installed." + fi +} diff --git a/src/main/resources/scripts/gvm-use.sh b/src/main/resources/scripts/gvm-use.sh new file mode 100644 index 00000000..505d2dc0 --- /dev/null +++ b/src/main/resources/scripts/gvm-use.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function __gvmtool_use { + CANDIDATE="$1" + __gvmtool_check_candidate_present "${CANDIDATE}" || return 1 + __gvmtool_determine_version "$2" || return 1 + + if [[ "${GVM_ONLINE}" == "true" && ! -d "${GVM_DIR}/${CANDIDATE}/${VERSION}" ]]; then + echo "" + echo "Stop! ${CANDIDATE} ${VERSION} is not installed." + echo -n "Do you want to install it now? (Y/n): " + read INSTALL + if [[ -z "${INSTALL}" || "${INSTALL}" == "y" || "${INSTALL}" == "Y" ]]; then + __gvmtool_install_candidate_version "${CANDIDATE}" "${VERSION}" + else + return 1 + fi + fi + + if [[ -n ${isolated_mode} && ${isolated_mode} == 1 ]]; then + # Just update the *_HOME and PATH for this shell. + case "${CANDIDATE}" in + vert.x ) + export VERTX_HOME="${GVM_DIR}/vert.x/${VERSION}" + ;; + + * ) + UPPER_CANDIDATE=`echo "${CANDIDATE}" | tr '[:lower:]' '[:upper:]'` + export "${UPPER_CANDIDATE}_HOME"="${GVM_DIR}/${CANDIDATE}/${VERSION}" + ;; + esac + + # Replace the current path for the candidate with the selected version. + export PATH=`echo $PATH | sed -E "s!${GVM_DIR}/${CANDIDATE}/([0-9][^/]+|current)!${GVM_DIR}/${CANDIDATE}/${VERSION}!g"` + else + __gvmtool_link_candidate_version "${CANDIDATE}" "${VERSION}" + fi + + echo "" + echo Using "${CANDIDATE}" version "${VERSION} in this shell." +} diff --git a/src/main/resources/scripts/gvm-version.sh b/src/main/resources/scripts/gvm-version.sh new file mode 100644 index 00000000..ff7db049 --- /dev/null +++ b/src/main/resources/scripts/gvm-version.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# +# Copyright 2012 Marco Vermeulen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +function __gvmtool_version { + echo "Groovy enVironment Manager ${GVM_VERSION}" +} diff --git a/src/test/resources/gvm/upgrade_steps.groovy b/src/test/resources/gvm/upgrade_steps.groovy index f2749623..7caa1fcb 100644 --- a/src/test/resources/gvm/upgrade_steps.groovy +++ b/src/test/resources/gvm/upgrade_steps.groovy @@ -3,11 +3,18 @@ package gvm import static cucumber.runtime.groovy.EN.* Then(~'^the gvm scripts are up to date$') { -> - def gvm = new File("$gvmDir/bin/gvm") - assert gvm.exists() - - def gvmInit = new File("$gvmDir/bin/gvm-init.sh") - assert gvmInit.exists() + assert new File("$gvmDir/bin/gvm-init.sh").exists() + assert new File("$gvmDir/bin/gvm-common.sh").exists() + assert new File("$gvmDir/bin/gvm-main.sh").exists() + assert new File("$gvmDir/bin/gvm-broadcast.sh").exists() + assert new File("$gvmDir/bin/gvm-current.sh").exists() + assert new File("$gvmDir/bin/gvm-default.sh").exists() + assert new File("$gvmDir/bin/gvm-install.sh").exists() + assert new File("$gvmDir/bin/gvm-list.sh").exists() + assert new File("$gvmDir/bin/gvm-selfupdate.sh").exists() + assert new File("$gvmDir/bin/gvm-uninstall.sh").exists() + assert new File("$gvmDir/bin/gvm-use.sh").exists() + assert new File("$gvmDir/bin/gvm-version.sh").exists() } And(~'^the configuration file has been primed with "([^"]*)"$') { String content ->