From 68d014063dfecaffc049fdc8a17e3b9aa9473d24 Mon Sep 17 00:00:00 2001 From: Marco Vermeulen Date: Fri, 1 Jan 2016 17:31:58 +0000 Subject: [PATCH] Steps toward decreasing state leakage in __sdkman_determine_version function. --- src/main/bash/sdkman-common.sh | 26 ++++++++++++---------- src/main/bash/sdkman-default.sh | 19 ++++++++++------- src/main/bash/sdkman-install.sh | 33 ++++++++++++++-------------- src/main/bash/sdkman-use.sh | 38 ++++++++++++++++----------------- src/main/bash/sdkman-utils.sh | 9 +++++--- 5 files changed, 68 insertions(+), 57 deletions(-) diff --git a/src/main/bash/sdkman-common.sh b/src/main/bash/sdkman-common.sh index 06848256..fc705b26 100644 --- a/src/main/bash/sdkman-common.sh +++ b/src/main/bash/sdkman-common.sh @@ -42,16 +42,20 @@ function __sdkman_check_version_present { } function __sdkman_determine_version { - local version="$1" + local candidate version folder - if [[ "${SDKMAN_AVAILABLE}" == "false" && -n "$version" && -d "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/$version" ]]; then + candidate="$1" + version="$2" + folder="$3" + + if [[ "${SDKMAN_AVAILABLE}" == "false" && -n "$version" && -d "${SDKMAN_CANDIDATES_DIR}/${candidate}/$version" ]]; then VERSION="$version" - elif [[ "${SDKMAN_AVAILABLE}" == "false" && -z "$version" && -L "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/current" ]]; then - VERSION=$(readlink "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/current" | sed "s!${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/!!g") + elif [[ "${SDKMAN_AVAILABLE}" == "false" && -z "$version" && -L "${SDKMAN_CANDIDATES_DIR}/${candidate}/current" ]]; then + VERSION=$(readlink "${SDKMAN_CANDIDATES_DIR}/${candidate}/current" | sed "s!${SDKMAN_CANDIDATES_DIR}/${candidate}/!!g") elif [[ "${SDKMAN_AVAILABLE}" == "false" && -n "$version" ]]; then - echo "Stop! ${CANDIDATE} ${1} is not available while offline." + echo "Stop! ${candidate} ${version} is not available while offline." return 1 elif [[ "${SDKMAN_AVAILABLE}" == "false" && -z "$version" ]]; then @@ -60,22 +64,22 @@ function __sdkman_determine_version { elif [[ "${SDKMAN_AVAILABLE}" == "true" && -z "$version" ]]; then VERSION_VALID='valid' - VERSION=$(curl -s "${SDKMAN_SERVICE}/candidates/${CANDIDATE}/default") + VERSION=$(curl -s "${SDKMAN_SERVICE}/candidates/${candidate}/default") else - VERSION_VALID=$(curl -s "${SDKMAN_SERVICE}/candidates/${CANDIDATE}/$version") - if [[ "${VERSION_VALID}" == 'valid' || "${VERSION_VALID}" == 'invalid' && -n "$2" ]]; then + VERSION_VALID=$(curl -s "${SDKMAN_SERVICE}/candidates/${candidate}/$version") + if [[ "${VERSION_VALID}" == 'valid' || "${VERSION_VALID}" == 'invalid' && -n "$folder" ]]; then VERSION="$version" - elif [[ "${VERSION_VALID}" == 'invalid' && -h "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/$version" ]]; then + elif [[ "${VERSION_VALID}" == 'invalid' && -h "${SDKMAN_CANDIDATES_DIR}/${candidate}/$version" ]]; then VERSION="$version" - elif [[ "${VERSION_VALID}" == 'invalid' && -d "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/$version" ]]; then + elif [[ "${VERSION_VALID}" == 'invalid' && -d "${SDKMAN_CANDIDATES_DIR}/${candidate}/$version" ]]; then VERSION="$version" else echo "" - echo "Stop! $version is not a valid ${CANDIDATE} version." + echo "Stop! $version is not a valid ${candidate} version." return 1 fi fi diff --git a/src/main/bash/sdkman-default.sh b/src/main/bash/sdkman-default.sh index 47b34e4e..90a9e425 100644 --- a/src/main/bash/sdkman-default.sh +++ b/src/main/bash/sdkman-default.sh @@ -16,21 +16,24 @@ # limitations under the License. # +#todo: fix leaking state function __sdkman_default { - #todo: fix leaking state - CANDIDATE="$1" + local candidate version - __sdkman_check_candidate_present "${CANDIDATE}" || return 1 - __sdkman_determine_version "$2" || return 1 + candidate="$1" + version="$2" - if [ ! -d "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/${VERSION}" ]; then + __sdkman_check_candidate_present "$candidate" || return 1 + __sdkman_determine_version "$candidate" "$version" || return 1 + + if [ ! -d "${SDKMAN_CANDIDATES_DIR}/${candidate}/${VERSION}" ]; then echo "" - echo "Stop! ${CANDIDATE} ${VERSION} is not installed." + echo "Stop! ${candidate} ${VERSION} is not installed." return 1 fi - __sdkman_link_candidate_version "${CANDIDATE}" "${VERSION}" + __sdkman_link_candidate_version "${candidate}" "${VERSION}" echo "" - echo "Default ${CANDIDATE} version set to ${VERSION}" + echo "Default ${candidate} version set to ${VERSION}" } diff --git a/src/main/bash/sdkman-install.sh b/src/main/bash/sdkman-install.sh index cbf0bc53..950b44e8 100644 --- a/src/main/bash/sdkman-install.sh +++ b/src/main/bash/sdkman-install.sh @@ -54,43 +54,44 @@ function __sdkman_validate_zip { fi } +#todo: fix leaking state function __sdkman_install { - local CANDIDATE LOCAL_FOLDER + local candidate version folder - #todo: fix leaking state - CANDIDATE="$1" - LOCAL_FOLDER="$3" + candidate="$1" + version="$2" + folder="$3" - __sdkman_check_candidate_present "${CANDIDATE}" || return 1 - __sdkman_determine_version "$2" "$3" || return 1 + __sdkman_check_candidate_present "$candidate" || return 1 + __sdkman_determine_version "$candidate" "$version" "$folder" || return 1 - if [[ -d "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/${VERSION}" || -h "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/${VERSION}" ]]; then + if [[ -d "${SDKMAN_CANDIDATES_DIR}/${candidate}/${VERSION}" || -h "${SDKMAN_CANDIDATES_DIR}/${candidate}/${VERSION}" ]]; then echo "" - echo "Stop! ${CANDIDATE} ${VERSION} is already installed." + echo "Stop! ${candidate} ${VERSION} is already installed." return 0 fi if [[ ${VERSION_VALID} == 'valid' ]]; then - __sdkman_install_candidate_version "${CANDIDATE}" "${VERSION}" || return 1 + __sdkman_install_candidate_version "${candidate}" "${VERSION}" || return 1 if [[ "${sdkman_auto_answer}" != 'true' ]]; then - echo -n "Do you want ${CANDIDATE} ${VERSION} to be set as default? (Y/n): " + echo -n "Do you want ${candidate} ${VERSION} to be set as default? (Y/n): " read USE fi if [[ -z "${USE}" || "${USE}" == "y" || "${USE}" == "Y" ]]; then echo "" - echo "Setting ${CANDIDATE} ${VERSION} as default." - __sdkman_link_candidate_version "${CANDIDATE}" "${VERSION}" - __sdkman_add_to_path "${CANDIDATE}" + echo "Setting ${candidate} ${VERSION} as default." + __sdkman_link_candidate_version "${candidate}" "${VERSION}" + __sdkman_add_to_path "${candidate}" fi return 0 - elif [[ "${VERSION_VALID}" == 'invalid' && -n "${LOCAL_FOLDER}" ]]; then - __sdkman_install_local_version "${CANDIDATE}" "${VERSION}" "${LOCAL_FOLDER}" || return 1 + elif [[ "${VERSION_VALID}" == 'invalid' && -n "${folder}" ]]; then + __sdkman_install_local_version "${candidate}" "${VERSION}" "${folder}" || return 1 else echo "" - echo "Stop! $1 is not a valid ${CANDIDATE} version." + echo "Stop! $1 is not a valid ${candidate} version." return 1 fi } diff --git a/src/main/bash/sdkman-use.sh b/src/main/bash/sdkman-use.sh index ba7f72e8..d9f1d01f 100644 --- a/src/main/bash/sdkman-use.sh +++ b/src/main/bash/sdkman-use.sh @@ -16,49 +16,49 @@ # limitations under the License. # +#todo: fix leaking state function __sdkman_use { - #todo: fix leaking state of CANDIDATE - local CANDIDATE version + local candidate version install - CANDIDATE="$1" + candidate="$1" version="$2" - __sdkman_check_candidate_present "${CANDIDATE}" || return 1 - __sdkman_determine_version "$version" || return 1 + __sdkman_check_candidate_present "$candidate" || return 1 + __sdkman_determine_version "$candidate" "$version" || return 1 - if [[ ! -d "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/${VERSION}" ]]; then + if [[ ! -d "${SDKMAN_CANDIDATES_DIR}/${candidate}/${VERSION}" ]]; then echo "" - echo "Stop! ${CANDIDATE} ${VERSION} is not installed." + echo "Stop! ${candidate} ${VERSION} is not installed." if [[ "${sdkman_auto_answer}" != 'true' ]]; then echo -n "Do you want to install it now? (Y/n): " - read INSTALL + read install fi - if [[ -z "${INSTALL}" || "${INSTALL}" == "y" || "${INSTALL}" == "Y" ]]; then - __sdkman_install_candidate_version "${CANDIDATE}" "${VERSION}" - __sdkman_add_to_path "${CANDIDATE}" + if [[ -z "${install}" || "${install}" == "y" || "${install}" == "Y" ]]; then + __sdkman_install_candidate_version "${candidate}" "${VERSION}" + __sdkman_add_to_path "${candidate}" else return 1 fi fi # Just update the *_HOME and PATH for this shell. - __sdkman_set_candidate_home "${CANDIDATE}" "${VERSION}" + __sdkman_set_candidate_home "${candidate}" "${VERSION}" # Replace the current path for the candidate with the selected version. if [[ "${solaris}" == true ]]; then - export PATH=$(echo $PATH | gsed -r "s!${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/([^/]+)!${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/${VERSION}!g") + export PATH=$(echo $PATH | gsed -r "s!${SDKMAN_CANDIDATES_DIR}/${candidate}/([^/]+)!${SDKMAN_CANDIDATES_DIR}/${candidate}/${VERSION}!g") elif [[ "${darwin}" == true ]]; then - export PATH=$(echo $PATH | sed -E "s!${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/([^/]+)!${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/${VERSION}!g") + export PATH=$(echo $PATH | sed -E "s!${SDKMAN_CANDIDATES_DIR}/${candidate}/([^/]+)!${SDKMAN_CANDIDATES_DIR}/${candidate}/${VERSION}!g") else - export PATH=$(echo $PATH | sed -r "s!${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/([^/]+)!${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/${VERSION}!g") + export PATH=$(echo $PATH | sed -r "s!${SDKMAN_CANDIDATES_DIR}/${candidate}/([^/]+)!${SDKMAN_CANDIDATES_DIR}/${candidate}/${VERSION}!g") fi - if [[ ! -h "${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/current" ]]; then - echo "Setting ${CANDIDATE} version ${VERSION} as default." - __sdkman_link_candidate_version "${CANDIDATE}" "${VERSION}" + if [[ ! -h "${SDKMAN_CANDIDATES_DIR}/${candidate}/current" ]]; then + echo "Setting ${candidate} version ${VERSION} as default." + __sdkman_link_candidate_version "${candidate}" "${VERSION}" fi echo "" - echo "Using ${CANDIDATE} version ${VERSION} in this shell." + echo "Using ${candidate} version ${VERSION} in this shell." } \ No newline at end of file diff --git a/src/main/bash/sdkman-utils.sh b/src/main/bash/sdkman-utils.sh index d49c17e8..1ff6dc14 100644 --- a/src/main/bash/sdkman-utils.sh +++ b/src/main/bash/sdkman-utils.sh @@ -38,10 +38,13 @@ function __sdkman_add_to_path { } function __sdkman_set_candidate_home { - local upper_candidate + local candidate version upper_candidate - upper_candidate=$(echo "${CANDIDATE}" | tr '[:lower:]' '[:upper:]') - export "${upper_candidate}_HOME"="${SDKMAN_CANDIDATES_DIR}/${CANDIDATE}/${VERSION}" + candidate="$1" + version="$2" + + upper_candidate=$(echo "${candidate}" | tr '[:lower:]' '[:upper:]') + export "${upper_candidate}_HOME"="${SDKMAN_CANDIDATES_DIR}/${candidate}/${version}" } function __sdkman_echo_debug {