Steps toward decreasing state leakage in __sdkman_determine_version function.

This commit is contained in:
Marco Vermeulen
2016-01-01 17:31:58 +00:00
parent 227da3a743
commit 68d014063d
5 changed files with 68 additions and 57 deletions

View File

@@ -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

View File

@@ -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}"
}

View File

@@ -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
}

View File

@@ -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."
}

View File

@@ -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 {