Skip to content

Commit 3ecdd41

Browse files
authored
Merge branch 'master' into download-latest-version-if-regex-is-used
2 parents ee39309 + 7508248 commit 3ecdd41

8 files changed

Lines changed: 118 additions & 18 deletions

File tree

libexec/tfenv-help

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Commands:
1212
list-remote List all installable versions
1313
version-name Print current version
1414
init Update environment to use 'tfenv' correctly.
15+
pin Write the current active version to ./.terraform-version
1516
';
1617

1718
exit 0;

libexec/tfenv-pin

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#!/usr/bin/env bash
2+
3+
set -uo pipefail;
4+
5+
####################################
6+
# Ensure we can execute standalone #
7+
####################################
8+
9+
function early_death() {
10+
echo "[FATAL] ${0}: ${1}" >&2;
11+
exit 1;
12+
};
13+
14+
if [ -z "${TFENV_ROOT:-""}" ]; then
15+
# http://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac
16+
readlink_f() {
17+
local target_file="${1}";
18+
local file_name;
19+
20+
while [ "${target_file}" != "" ]; do
21+
cd "$(dirname ${target_file})" || early_death "Failed to 'cd \$(dirname ${target_file})' while trying to determine TFENV_ROOT";
22+
file_name="$(basename "${target_file}")" || early_death "Failed to 'basename \"${target_file}\"' while trying to determine TFENV_ROOT";
23+
target_file="$(readlink "${file_name}")";
24+
done;
25+
26+
echo "$(pwd -P)/${file_name}";
27+
};
28+
29+
TFENV_ROOT="$(cd "$(dirname "$(readlink_f "${0}")")/.." && pwd)";
30+
[ -n "${TFENV_ROOT}" ] || early_death "Failed to 'cd \"\$(dirname \"\$(readlink_f \"${0}\")\")/..\" && pwd' while trying to determine TFENV_ROOT";
31+
else
32+
TFENV_ROOT="${TFENV_ROOT%/}";
33+
fi;
34+
export TFENV_ROOT;
35+
36+
if [ -n "${TFENV_HELPERS:-""}" ]; then
37+
log 'debug' 'TFENV_HELPERS is set, not sourcing helpers again';
38+
else
39+
[ "${TFENV_DEBUG:-0}" -gt 0 ] && echo "[DEBUG] Sourcing helpers from ${TFENV_ROOT}/lib/helpers.sh";
40+
if source "${TFENV_ROOT}/lib/helpers.sh"; then
41+
log 'debug' 'Helpers sourced successfully';
42+
else
43+
early_death "Failed to source helpers from ${TFENV_ROOT}/lib/helpers.sh";
44+
fi;
45+
fi;
46+
47+
# Ensure libexec and bin are in $PATH
48+
for dir in libexec bin; do
49+
case ":${PATH}:" in
50+
*:${TFENV_ROOT}/${dir}:*) log 'debug' "\$PATH already contains '${TFENV_ROOT}/${dir}', not adding it again";;
51+
*)
52+
log 'debug' "\$PATH does not contain '${TFENV_ROOT}/${dir}', prepending and exporting it now";
53+
export PATH="${TFENV_ROOT}/${dir}:${PATH}";
54+
;;
55+
esac;
56+
done;
57+
58+
#####################
59+
# Begin Script Body #
60+
#####################
61+
62+
[ "${#}" -ne 0 ] \
63+
&& log 'error' "usage: tfenv pin"
64+
65+
[ -d "${TFENV_ROOT}/versions/" ] \
66+
|| log 'error' 'No versions available. Please install one with: tfenv install'
67+
68+
[[ -x "${TFENV_ROOT}/versions" && -r "${TFENV_ROOT}/versions" ]] \
69+
|| log 'error' "tfenv versions directory is inaccessible: ${TFENV_ROOT}/versions";
70+
71+
version_name="$(tfenv-version-name 2>/dev/null || true)" \
72+
&& log 'debug' "tfenv-version-name reported: ${version_name}";
73+
74+
echo "${version_name}" > .terraform-version;
75+
log 'info' "Pinned version by writing \"${version_name}\" to $(pwd)/.terraform-version";
76+
77+
exit 0;

libexec/tfenv-resolve-version

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ fi;
9999

100100
log 'debug' "Version Requested: ${version_requested}";
101101

102+
# Accept a v-prefixed version, but strip the v.
103+
if [[ "${version_requested}" =~ ^v.*$ ]]; then
104+
log 'debug' "Version Requested is prefixed with a v. Stripping the v."
105+
version_requested="${version_requested#v*}";
106+
fi;
107+
102108
if [[ "${version_requested}" =~ ^min-required$ ]]; then
103109
log 'info' 'Detecting minimum required version...';
104110
min_required="$(tfenv-min-required)" \

libexec/tfenv-use

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ fi
7777

7878
log debug "Resolving version with: tfenv-resolve-version ${requested_arg}";
7979
declare resolved="$(tfenv-resolve-version ${requested_arg})";
80+
log debug "Resolved to: ${resolved}";
8081

8182
declare version="${resolved%%\:*}";
8283
declare regex="${resolved##*\:}";

libexec/tfenv-version-name

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ if [[ "${TFENV_VERSION}" =~ ^latest.*$ ]]; then
121121
fi;
122122
else
123123
log 'debug' 'TFENV_VERSION does not use "latest" keyword';
124+
125+
# Accept a v-prefixed version, but strip the v.
126+
if [[ "${TFENV_VERSION}" =~ ^v.*$ ]]; then
127+
log 'debug' "Version Requested is prefixed with a v. Stripping the v."
128+
TFENV_VERSION="${TFENV_VERSION#v*}";
129+
fi;
124130
fi;
125131

126132
if [[ -z "${TFENV_VERSION}" ]]; then

test/test_install_and_use.sh

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ tests__desc=(
9494
'0.11.15-oci'
9595
'latest version matching regex'
9696
'specific version'
97+
'specific version with v prefix'
9798
);
9899

99100
tests__kv=(
@@ -105,17 +106,19 @@ tests__kv=(
105106
"$(tfenv list-remote | grep '^0\.11\.' | head -n 1),latest:^0.11."
106107
'0.11.15-oci,0.11.15-oci'
107108
'0.8.8,latest:^0.8'
108-
"0.7.13,0.7.13"
109+
'0.7.13,0.7.13'
110+
'0.14.6,v0.14.6'
109111
);
110112

111113
tests_count=${#tests__desc[@]};
112114

113-
declare desc kv k v;
115+
declare desc kv k v test_num;
114116

115-
for ((test_num=0; test_num<${tests_count}; ++test_num )) ; do
117+
for ((test_iter=0; test_iter<${tests_count}; ++test_iter )) ; do
116118
cleanup || log 'error' 'Cleanup failed?!';
117-
desc=${tests__desc[${test_num}]};
118-
kv="${tests__kv[${test_num}]}";
119+
test_num=$((test_iter + 1));
120+
desc=${tests__desc[${test_iter}]};
121+
kv="${tests__kv[${test_iter}]}";
119122
v="${kv%,*}";
120123
k="${kv##*,}";
121124
log 'info' "## Param Test ${test_num}/${tests_count}: ${desc} ( ${k} / ${v} )";
@@ -124,10 +127,11 @@ for ((test_num=0; test_num<${tests_count}; ++test_num )) ; do
124127
|| error_and_proceed "## Param Test ${test_num}/${tests_count}: ${desc} ( ${k} / ${v} ) failed";
125128
done;
126129

127-
for ((test_num=0; test_num<${tests_count}; ++test_num )) ; do
130+
for ((test_iter=0; test_iter<${tests_count}; ++test_iter )) ; do
128131
cleanup || log 'error' 'Cleanup failed?!';
129-
desc=${tests__desc[${test_num}]};
130-
kv="${tests__kv[${test_num}]}";
132+
test_num=$((test_iter + 1));
133+
desc=${tests__desc[${test_iter}]};
134+
kv="${tests__kv[${test_iter}]}";
131135
v="${kv%,*}";
132136
k="${kv##*,}";
133137
log 'info' "## ./.terraform-version Test ${test_num}/${tests_count}: ${desc} ( ${k} / ${v} )";
@@ -138,10 +142,11 @@ for ((test_num=0; test_num<${tests_count}; ++test_num )) ; do
138142
|| error_and_proceed "## ./.terraform-version Test ${test_num}/${tests_count}: ${desc} ( ${k} / ${v} ) failed";
139143
done;
140144

141-
for ((test_num=0; test_num<${tests_count}; ++test_num )) ; do
145+
for ((test_iter=0; test_iter<${tests_count}; ++test_iter )) ; do
142146
cleanup || log 'error' 'Cleanup failed?!';
143-
desc=${tests__desc[${test_num}]};
144-
kv="${tests__kv[${test_num}]}";
147+
test_num=$((test_iter + 1));
148+
desc=${tests__desc[${test_iter}]};
149+
kv="${tests__kv[${test_iter}]}";
145150
v="${kv%,*}";
146151
k="${kv##*,}";
147152
log 'info' "## TFENV_TERRAFORM_VERSION Test ${test_num}/${tests_count}: ${desc} ( ${k} / ${v} )";
@@ -201,15 +206,16 @@ neg_tests__desc=(
201206

202207
neg_tests__kv=(
203208
'9.9.9'
204-
"latest:word"
209+
'latest:word'
205210
);
206211

207212
neg_tests_count=${#neg_tests__desc[@]};
208213

209-
for ((test_num=0; test_num<${neg_tests_count}; ++test_num )) ; do
214+
for ((test_iter=0; test_iter<${neg_tests_count}; ++test_iter )) ; do
210215
cleanup || log 'error' 'Cleanup failed?!';
211-
desc=${neg_tests__desc[${test_num}]}
212-
k="${neg_tests__kv[${test_num}]}";
216+
test_num=$((test_iter + 1));
217+
desc=${neg_tests__desc[${test_iter}]}
218+
k="${neg_tests__kv[${test_iter}]}";
213219
expected_error_message="No versions matching '${k}' found in remote";
214220
log 'info' "## Invalid Version Test ${test_num}/${neg_tests_count}: ${desc} ( ${k} )";
215221
[ -z "$(tfenv install "${k}" 2>&1 | grep "${expected_error_message}")" ] \

test/test_list.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ declare -a errors=();
5353
log 'info' '### List local versions';
5454
cleanup || log 'error' "Cleanup failed?!";
5555

56-
for v in 0.7.2 0.7.13 0.9.1 0.9.2 0.9.11; do
56+
for v in 0.7.2 0.7.13 0.9.1 0.9.2 v0.9.11 0.14.6; do
5757
log 'info' "## Installing version ${v} to construct list";
5858
tfenv install "${v}" \
5959
&& log 'debug' "Install of version ${v} succeeded" \
@@ -65,12 +65,13 @@ tfenv list \
6565
&& log 'debug' "List succeeded with no default set" \
6666
|| error_and_proceed "List failed with no default set";
6767

68-
tfenv use 0.9.11;
68+
tfenv use 0.14.6;
6969

7070
log 'info' '## Comparing "tfenv list" with default set';
7171
result="$(tfenv list)";
7272
expected="$(cat << EOS
73-
* 0.9.11 (set by $(tfenv version-file))
73+
* 0.14.6 (set by $(tfenv version-file))
74+
0.9.11
7475
0.9.2
7576
0.9.1
7677
0.7.13

test/test_uninstall.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,15 @@ tests__keywords=(
6767
'0.11.15-oci'
6868
'latest'
6969
'latest:^0.8'
70+
'v0.14.6'
7071
);
7172

7273
tests__versions=(
7374
'0.9.1'
7475
'0.11.15-oci'
7576
"$(tfenv list-remote | head -n1)"
7677
"$(tfenv list-remote | grep -e "^0.8" | head -n1)"
78+
'0.14.6'
7779
);
7880

7981
tests_count=${#tests__keywords[@]};

0 commit comments

Comments
 (0)