Skip to content

Commit e0fd9d4

Browse files
committed
Fix #299 - When AUTO_INSTALL, tfenv use will attempt to install, including default latest
1 parent 4dd303a commit e0fd9d4

4 files changed

Lines changed: 61 additions & 23 deletions

File tree

lib/helpers.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ export -f check_default_version;
105105
function cleanup() {
106106
log 'info' 'Performing cleanup';
107107
local pwd="$(pwd)";
108+
log 'debug' "Deleting ${pwd}/version";
109+
rm -rf ./version;
108110
log 'debug' "Deleting ${pwd}/versions";
109111
rm -rf ./versions;
110112
log 'debug' "Deleting ${pwd}/.terraform-version";

libexec/tfenv-resolve-version

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ if [ -z "${arg}" -a -z "${TFENV_TERRAFORM_VERSION:-""}" ]; then
9393

9494
else
9595
log 'debug' "Version File is the default \${TFENV_CONFIG_DIR}/version (${TFENV_CONFIG_DIR}/version) but it doesn't exist";
96-
log 'info' 'No version requested on the command line or in the version file search path. Installing "latest"';
96+
log 'debug' 'No version requested on the command line or in the version file search path. Installing "latest"';
9797
version_requested='latest';
9898
fi;
9999
elif [ -n "${TFENV_TERRAFORM_VERSION:-""}" ]; then
@@ -114,11 +114,11 @@ if [[ "${version_requested}" =~ ^v.*$ ]]; then
114114
fi;
115115

116116
if [[ "${version_requested}" =~ ^min-required$ ]]; then
117-
log 'info' 'Detecting minimum required version...';
117+
log 'debug' 'Detecting minimum required version...';
118118
min_required="$(tfenv-min-required)" \
119119
|| log 'error' 'tfenv-min-required failed';
120120

121-
log 'info' "Minimum required version detected: ${min_required}";
121+
log 'debug' "Minimum required version detected: ${min_required}";
122122
version_requested="${min_required}";
123123
fi;
124124

libexec/tfenv-use

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,12 @@ done;
6060

6161
[ "${#}" -gt 1 ] && log 'error' 'usage: tfenv use [<version>]';
6262

63-
[ -d "${TFENV_CONFIG_DIR}/versions" ] \
64-
|| log 'error' 'No versions of terraform installed. Please install one with: tfenv install';
63+
declare auto_install="${TFENV_AUTO_INSTALL:-true}";
64+
65+
if [ "${auto_install}" != 'true' ]; then
66+
[ -d "${TFENV_CONFIG_DIR}/versions" ] \
67+
|| log 'error' 'No versions of terraform installed. Please install one with: tfenv install';
68+
fi;
6569

6670
declare requested_arg="${1:-""}";
6771
declare version_source_suffix="";
@@ -89,30 +93,53 @@ log debug "Resolved to: ${resolved}";
8993

9094
declare version="${resolved%%\:*}";
9195
declare regex="${resolved##*\:}";
96+
declare installed_version='';
9297

9398
log 'debug' "Searching ${TFENV_CONFIG_DIR}/versions/ for latest version matching ${regex}";
94-
declare version="$(\find "${TFENV_CONFIG_DIR}/versions/" -type d -exec basename {} \; \
95-
| tail -n +2 \
96-
| sort -t'.' -k 1nr,1 -k 2nr,2 -k 3nr,3 \
97-
| grep -e "${regex}" \
98-
| head -n 1
99-
)";
100-
101-
[ -n "${version}" ] \
102-
&& log 'debug' "Found version: ${version}" \
103-
|| log 'error' "No installed versions of terraform matched '${requested}'${version_source_suffix}";
104-
105-
target_path="${TFENV_CONFIG_DIR}/versions/${version}";
99+
100+
if [ -d "${TFENV_CONFIG_DIR}/versions" ]; then
101+
installed_version="$(\find "${TFENV_CONFIG_DIR}/versions/" -type d -exec basename {} \; \
102+
| tail -n +2 \
103+
| sort -t'.' -k 1nr,1 -k 2nr,2 -k 3nr,3 \
104+
| grep -e "${regex}" \
105+
| head -n 1
106+
)";
107+
fi;
108+
109+
if [ -n "${installed_version}" ]; then
110+
log 'debug' "Found version: ${installed_version}";
111+
else
112+
if [ "${auto_install}" == 'true' ]; then
113+
log 'info' "No installed versions of terraform matched '${resolved}'. Trying to install a matching version since TFENV_AUTO_INSTALL=true";
114+
tfenv-install "${resolved}" || log 'error' 'Installing a matching version failed';
115+
116+
installed_version="$(\find "${TFENV_CONFIG_DIR}/versions/" -type d -exec basename {} \; \
117+
| tail -n +2 \
118+
| sort -t'.' -k 1nr,1 -k 2nr,2 -k 3nr,3 \
119+
| grep -e "${regex}" \
120+
| head -n 1
121+
)";
122+
123+
[ -n "${installed_version}" ] \
124+
|| log 'error' "Despite successfully installing a version matching '${resolved}', a matching version could not be found in '${TFENV_CONFIG_DIR}/versions/' - This should be pretty much impossible";
125+
fi;
126+
fi;
127+
128+
target_path="${TFENV_CONFIG_DIR}/versions/${installed_version}";
129+
log 'debug' "target_path is ${TFENV_CONFIG_DIR}/versions/${installed_version}";
130+
131+
[ -d "${target_path}" ] \
132+
|| log 'error' "Version directory for ${installed_version} (${target_path}) is not present! Manual intervention required.";
106133
[ -f "${target_path}/terraform" ] \
107-
|| log 'error' "Version directory for ${version} is present, but the terraform binary is not! Manual intervention required.";
134+
|| log 'error' "Version directory for ${installed_version} is present, but the terraform binary is not! Manual intervention required.";
108135
[ -x "${target_path}/terraform" ] \
109-
|| log 'error' "Version directory for ${version} is present, but the terraform binary is not executable! Manual intervention required.";
136+
|| log 'error' "Version directory for ${installed_version} is present, but the terraform binary is not executable! Manual intervention required.";
110137

111-
log 'info' "Switching default version to v${version}";
138+
log 'info' "Switching default version to v${installed_version}";
112139
version_file="${TFENV_CONFIG_DIR}/version";
113-
log 'debug' "Writing \"${version}\" to \"${version_file}\"";
114-
echo "${version}" > "${version_file}" \
115-
|| log 'error' "Switch to v${version} failed";
140+
log 'debug' "Writing \"${installed_version}\" to \"${version_file}\"";
141+
echo "${installed_version}" > "${version_file}" \
142+
|| log 'error' "Switch to v${installed_version} failed";
116143

117144
if [ "${version_file}" != "${loaded_version_file}" ]; then
118145
log 'warn' "Default version file overridden by ${loaded_version_file}, changing the default version has no effect";

test/test_install_and_use.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,15 @@ if [ -f "${HOME}/.terraform-version.bup" ]; then
196196
mv "${HOME}/.terraform-version.bup" "${HOME}/.terraform-version";
197197
fi;
198198

199+
log 'info' 'Use with no input and TFENV_AUTO_INSTALL:';
200+
cleanup || log 'error' 'Cleanup failed?!';
201+
202+
(
203+
tfenv use || exit 1;
204+
check_default_version "$(tfenv list-remote | grep -e "^[0-9]\+\.[0-9]\+\.[0-9]\+$" | head -n 1)" || exit 1;
205+
) && log info '## Use (No Input) Test 1/1: succeeded' \
206+
|| error_and_proceed '## Use (No Input) Test 1/1: failed';
207+
199208
log 'info' 'Install invalid specific version';
200209
cleanup || log 'error' 'Cleanup failed?!';
201210

0 commit comments

Comments
 (0)