Skip to content

Commit c28c786

Browse files
authored
Merge branch 'master' into patch-1
2 parents f6bf8bb + 9018d95 commit c28c786

16 files changed

Lines changed: 233 additions & 173 deletions

.github/workflows/test.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ jobs:
1818
strategy:
1919
matrix:
2020
os:
21+
- 'macos-11'
2122
- 'macos-latest'
2223
- 'ubuntu-latest'
2324
steps:
@@ -33,7 +34,7 @@ jobs:
3334
strategy:
3435
matrix:
3536
os:
36-
# - 'macos-11.0' # Not yet available
37+
- 'macos-11'
3738
- 'macos-10.15'
3839
- 'ubuntu-20.04'
3940
- 'ubuntu-18.04'

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
## 2.2.3 (Feb 9, 2022)
2+
3+
* Fix: mktemp not working correctly on Alpine Linux (#285)
4+
* Add support of ARM64 (#280)
5+
* Add support for tf.json files on min-required (#277)
6+
* Fix issue #210 - allow non-numeric values for DEBUG (#274)
7+
* Download latest version if user uses regex and TFENV_AUTO_INSTALL is true (#272)
8+
* Add tfenv pin command (#270)
9+
110
## 2.2.2 (May 6, 2021)
211

312
* remove trust from revoked signing key as of hcsec-2021-12

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ $ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
5252

5353
```console
5454
$ echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile
55+
```
56+
57+
For WSL users
58+
```bash
59+
$ echo 'export PATH=$PATH:$HOME/.tfenv/bin' >> ~/.bashrc
5560
```
5661

5762
OR you can make symlinks for `tfenv/bin/*` scripts into a path that is already added to your `$PATH` (e.g. `/usr/local/bin`) `OSX/Linux Only!`

bin/terraform

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ if [ -z "${TFENV_ROOT:-""}" ]; then
1717
local file_name;
1818

1919
while [ "${target_file}" != "" ]; do
20-
cd "$(dirname ${target_file})" || early_death "Failed to 'cd \$(dirname ${target_file})' while trying to determine TFENV_ROOT";
21-
file_name="$(basename "${target_file}")" || early_death "Failed to 'basename \"${target_file}\"' while trying to determine TFENV_ROOT";
20+
cd "${target_file%/*}" || early_death "Failed to 'cd \$(${target_file%/*})' while trying to determine TFENV_ROOT";
21+
file_name="${target_file##*/}" || early_death "Failed to '\"${target_file##*/}\"' while trying to determine TFENV_ROOT";
2222
target_file="$(readlink "${file_name}")";
2323
done;
2424

2525
echo "$(pwd -P)/${file_name}";
2626
};
27-
28-
TFENV_ROOT="$(cd "$(dirname "$(readlink_f "${0}")")/.." && pwd)";
29-
[ -n ${TFENV_ROOT} ] || early_death "Failed to 'cd \"\$(dirname \"\$(readlink_f \"${0}\")\")/..\" && pwd' while trying to determine TFENV_ROOT";
27+
TFENV_SHIM=$(readlink_f "${0}")
28+
TFENV_ROOT="${TFENV_SHIM%/*/*}";
29+
[ -n "${TFENV_ROOT}" ] || early_death "Failed to determine TFENV_ROOT"
3030
else
3131
TFENV_ROOT="${TFENV_ROOT%/}";
3232
fi;
@@ -62,8 +62,4 @@ log 'debug' "program=\"${0##*/}\"";
6262

6363
declare tfenv_path="${TFENV_ROOT}/bin/tfenv";
6464

65-
log 'debug' "Exec: \"${tfenv_path}\" exec \"$*\"";
66-
exec "${tfenv_path}" exec "$@" \
67-
|| log 'error' "Failed to exec: \"${tfenv_path}\" exec \"$*\"";
68-
69-
log 'error' 'This line should not be reachable. Something catastrophic has occurred';
65+
tfenv-exec "$@"

bin/tfenv

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,17 @@ if [ -z "${TFENV_ROOT:-""}" ]; then
1717
local file_name;
1818

1919
while [ "${target_file}" != "" ]; do
20-
cd "$(dirname ${target_file})" || early_death "Failed to 'cd \$(dirname ${target_file})' while trying to determine TFENV_ROOT";
21-
file_name="$(basename "${target_file}")" || early_death "Failed to 'basename \"${target_file}\"' while trying to determine TFENV_ROOT";
20+
cd "${target_file%/*}" || early_death "Failed to 'cd \$(${target_file%/*})' while trying to determine TFENV_ROOT";
21+
file_name="${target_file##*/}" || early_death "Failed to '\"${target_file##*/}\"' while trying to determine TFENV_ROOT";
2222
target_file="$(readlink "${file_name}")";
2323
done;
2424

2525
echo "$(pwd -P)/${file_name}";
2626
};
27+
TFENV_SHIM=$(readlink_f "${0}")
28+
TFENV_ROOT="${TFENV_SHIM%/*/*}";
29+
[ -n "${TFENV_ROOT}" ] || early_death "Failed to determine TFENV_ROOT"
2730

28-
TFENV_ROOT="$(cd "$(dirname "$(readlink_f "${0}")")/.." && pwd)";
29-
[ -n ${TFENV_ROOT} ] || early_death "Failed to 'cd \"\$(dirname \"\$(readlink_f \"${0}\")\")/..\" && pwd' while trying to determine TFENV_ROOT";
3031
else
3132
TFENV_ROOT="${TFENV_ROOT%/}";
3233
fi;

lib/bashlog.sh

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,27 @@ function _log_exception() {
1414
export -f _log_exception;
1515

1616
function log() {
17-
local date_format="${BASHLOG_DATE_FORMAT:-+%F %T}";
18-
local date="$(date "${date_format}")";
19-
local date_s="$(date "+%s")";
20-
17+
local syslog="${BASHLOG_SYSLOG:-0}";
2118
local file="${BASHLOG_FILE:-0}";
22-
local file_path="${BASHLOG_FILE_PATH:-/tmp/$(basename "${0}").log}";
23-
2419
local json="${BASHLOG_JSON:-0}";
25-
local json_path="${BASHLOG_JSON_PATH:-/tmp/$(basename "${0}").log.json}";
20+
local stdout_extra="${BASHLOG_EXTRA:-0}";
2621

27-
local syslog="${BASHLOG_SYSLOG:-0}";
28-
local tag="${BASHLOG_SYSLOG_TAG:-$(basename "${0}")}";
22+
if [ "${file}" -eq 1 ] || [ "${json}" -eq 1 ] || [ "${stdout_extra}" -eq 1 ]; then
23+
local date_format="${BASHLOG_DATE_FORMAT:-+%F %T}";
24+
local date="$(date "${date_format}")";
25+
local date_s="$(date "+%s")";
26+
fi
27+
local file_path="${BASHLOG_FILE_PATH:-/tmp/${0##*/}.log}";
28+
local json_path="${BASHLOG_JSON_PATH:-/tmp/${0##*/}.log.json}";
29+
30+
local tag="${BASHLOG_SYSLOG_TAG:-${0##*/})}";
2931
local facility="${BASHLOG_SYSLOG_FACILITY:-local0}";
3032
local pid="${$}";
3133

3234
local level="${1}";
3335
local upper="$(echo "${level}" | awk '{print toupper($0)}')";
3436
local debug_level="${TFENV_DEBUG:-0}";
3537
local stdout_colours="${BASHLOG_COLOURS:-1}";
36-
local stdout_extra="${BASHLOG_EXTRA:-0}";
3738

3839
local custom_eval_prefix="${BASHLOG_I_PROMISE_TO_BE_CAREFUL_CUSTOM_EVAL_PREFIX:-""}";
3940

@@ -162,7 +163,7 @@ export -f log;
162163

163164
declare prev_cmd="null";
164165
declare this_cmd="null";
165-
trap 'prev_cmd=$this_cmd; this_cmd=$BASH_COMMAND' DEBUG \
166+
trap 'prev_cmd=${this_cmd:-null}; this_cmd=$BASH_COMMAND' DEBUG \
166167
&& log debug 'DEBUG trap set' \
167168
|| log 'error' 'DEBUG trap failed to set';
168169

lib/helpers.sh

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ if [ -z "${TFENV_ROOT:-""}" ]; then
99
local file_name;
1010

1111
while [ "${target_file}" != "" ]; do
12-
cd "$(dirname ${target_file})" || early_death "Failed to 'cd \$(dirname ${target_file})' while trying to determine TFENV_ROOT";
13-
file_name="$(basename "${target_file}")" || early_death "Failed to 'basename \"${target_file}\"' while trying to determine TFENV_ROOT";
12+
cd "${target_file%/*}" || early_death "Failed to 'cd \$(${target_file%/*})' while trying to determine TFENV_ROOT";
13+
file_name="${target_file##*/}" || early_death "Failed to '\"${target_file##*/}\"' while trying to determine TFENV_ROOT";
1414
target_file="$(readlink "${file_name}")";
1515
done;
1616

1717
echo "$(pwd -P)/${file_name}";
1818
};
19-
20-
TFENV_ROOT="$(cd "$(dirname "$(readlink_f "${0}")")/.." && pwd)";
21-
[ -n ${TFENV_ROOT} ] || early_death "Failed to 'cd \"\$(dirname \"\$(readlink_f \"${0}\")\")/..\" && pwd' while trying to determine TFENV_ROOT";
19+
TFENV_SHIM=$(readlink_f "${0}")
20+
TFENV_ROOT="${TFENV_SHIM%/*/*}";
21+
[ -n "${TFENV_ROOT}" ] || early_death "Failed to determine TFENV_ROOT"
2222
else
2323
TFENV_ROOT="${TFENV_ROOT%/}";
2424
fi;
@@ -42,7 +42,25 @@ if [ "${TFENV_DEBUG:-0}" -gt 0 ]; then
4242
fi;
4343
fi;
4444

45-
source "${TFENV_ROOT}/lib/bashlog.sh";
45+
function load_bashlog () {
46+
source "${TFENV_ROOT}/lib/bashlog.sh";
47+
}
48+
export -f load_bashlog;
49+
if [ "${TFENV_DEBUG:-0}" -gt 0 ] ; then
50+
# our shim below cannot be used when debugging is enabled
51+
load_bashlog
52+
else
53+
# Shim that understands to no-op for debug messages, and defers to
54+
# full bashlog for everything else.
55+
function log () {
56+
if [ "$1" != 'debug' ] ; then
57+
# Loading full bashlog will overwrite the `log` function
58+
load_bashlog
59+
log "$@"
60+
fi
61+
}
62+
export -f log;
63+
fi
4664

4765
resolve_version () {
4866
declare version_requested version regex min_required version_file;
@@ -158,4 +176,8 @@ function error_and_proceed() {
158176
};
159177
export -f error_and_proceed;
160178

179+
source "$TFENV_ROOT/lib/tfenv-exec.sh";
180+
source "$TFENV_ROOT/lib/tfenv-version-file.sh";
181+
source "$TFENV_ROOT/lib/tfenv-version-name.sh";
182+
161183
export TFENV_HELPERS=1;

lib/tfenv-exec.sh

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
function tfenv-exec() {
2+
log 'debug' 'Getting version from tfenv-version-name';
3+
TFENV_VERSION="$(tfenv-version-name)" \
4+
&& log 'debug' "TFENV_VERSION is ${TFENV_VERSION}" \
5+
|| {
6+
# Errors will be logged from tfenv-version name,
7+
# we don't need to trouble STDERR with repeat information here
8+
log 'debug' 'Failed to get version from tfenv-version-name';
9+
return 1;
10+
};
11+
export TFENV_VERSION;
12+
13+
if [ ! -d "${TFENV_CONFIG_DIR}/versions/${TFENV_VERSION}" ]; then
14+
if [ "${TFENV_AUTO_INSTALL:-true}" == "true" ]; then
15+
if [ -z "${TFENV_TERRAFORM_VERSION:-""}" ]; then
16+
TFENV_VERSION_SOURCE="$(tfenv-version-file)";
17+
else
18+
TFENV_VERSION_SOURCE='TFENV_TERRAFORM_VERSION';
19+
fi
20+
log 'info' "version '${TFENV_VERSION}' is not installed (set by ${TFENV_VERSION_SOURCE}). Installing now as TFENV_AUTO_INSTALL==true";
21+
tfenv-install;
22+
else
23+
log 'error' "version '${TFENV_VERSION}' was requested, but not installed and TFENV_AUTO_INSTALL is not 'true'";
24+
fi;
25+
fi;
26+
27+
TF_BIN_PATH="${TFENV_CONFIG_DIR}/versions/${TFENV_VERSION}/terraform";
28+
export PATH="${TF_BIN_PATH}:${PATH}";
29+
log 'debug' "TF_BIN_PATH added to PATH: ${TF_BIN_PATH}";
30+
log 'debug' "Executing: ${TF_BIN_PATH} $@";
31+
32+
exec "${TF_BIN_PATH}" "$@" \
33+
|| log 'error' "Failed to execute: ${TF_BIN_PATH} $*";
34+
35+
return 0;
36+
}
37+
export -f tfenv-exec;

lib/tfenv-version-file.sh

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
find_local_version_file() {
2+
log 'debug' "Looking for a version file in ${1}";
3+
local root="${1}";
4+
while ! [[ "${root}" =~ ^//[^/]*$ ]]; do
5+
if [ -e "${root}/.terraform-version" ]; then
6+
log 'debug' "Found at ${root}/.terraform-version";
7+
echo "${root}/.terraform-version";
8+
return 0;
9+
else
10+
log 'debug' "Not found at ${root}/.terraform-version";
11+
fi;
12+
[ -n "${root}" ] || break;
13+
root="${root%/*}";
14+
done;
15+
log 'debug' "No version file found in ${1}";
16+
return 1;
17+
}
18+
export -f find_local_version_file;
19+
20+
function tfenv-version-file() {
21+
if ! find_local_version_file "${TFENV_DIR:-${PWD}}"; then
22+
if ! find_local_version_file "${HOME:-/}"; then
23+
log 'debug' "No version file found in search paths. Defaulting to TFENV_CONFIG_DIR: ${TFENV_CONFIG_DIR}/version";
24+
echo "${TFENV_CONFIG_DIR}/version";
25+
fi;
26+
fi;
27+
}
28+
export -f tfenv-version-file;

lib/tfenv-version-name.sh

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
function tfenv-version-name() {
2+
if [[ -z "${TFENV_TERRAFORM_VERSION:-""}" ]]; then
3+
TFENV_VERSION_FILE="$(tfenv-version-file)" \
4+
&& log 'debug' "TFENV_VERSION_FILE retrieved from tfenv-version-file: ${TFENV_VERSION_FILE}" \
5+
|| log 'error' 'Failed to retrieve TFENV_VERSION_FILE from tfenv-version-file';
6+
7+
TFENV_VERSION="$(cat "${TFENV_VERSION_FILE}" || true)" \
8+
&& log 'debug' "TFENV_VERSION specified in TFENV_VERSION_FILE: ${TFENV_VERSION}";
9+
10+
TFENV_VERSION_SOURCE="${TFENV_VERSION_FILE}";
11+
else
12+
TFENV_VERSION="${TFENV_TERRAFORM_VERSION}" \
13+
&& log 'debug' "TFENV_VERSION specified in TFENV_TERRAFORM_VERSION: ${TFENV_VERSION}";
14+
15+
TFENV_VERSION_SOURCE='TFENV_TERRAFORM_VERSION';
16+
fi;
17+
18+
if [[ "${TFENV_VERSION}" =~ ^latest.*$ ]]; then
19+
log 'debug' "TFENV_VERSION uses 'latest' keyword: ${TFENV_VERSION}";
20+
21+
[ -d "${TFENV_CONFIG_DIR}/versions" ] \
22+
|| log 'error' 'No versions of terraform installed. Please install one with: tfenv install';
23+
24+
if [[ "${TFENV_VERSION}" =~ ^latest\:.*$ ]]; then
25+
regex="${TFENV_VERSION##*\:}";
26+
log 'debug' "'latest' keyword uses regex: ${regex}";
27+
else
28+
regex="^[0-9]\+\.[0-9]\+\.[0-9]\+$";
29+
log 'debug' "Version uses latest keyword alone. Forcing regex to match stable versions only: ${regex}";
30+
fi;
31+
32+
declare local_version='';
33+
if [[ -d "${TFENV_CONFIG_DIR}/versions" ]]; then
34+
local_version="$(\find "${TFENV_CONFIG_DIR}/versions/" -type d -exec basename {} \; \
35+
| tail -n +2 \
36+
| sort -t'.' -k 1nr,1 -k 2nr,2 -k 3nr,3 \
37+
| grep -e "${regex}" \
38+
| head -n 1)";
39+
fi;
40+
41+
if [[ "${TFENV_AUTO_INSTALL:-true}" == "true" ]]; then
42+
log 'debug' "Trying to find the remote version using the regex: ${regex}";
43+
remote_version="$(tfenv-list-remote | grep -e "${regex}" | head -n 1)";
44+
if [[ -n "${remote_version}" ]]; then
45+
if [[ "${local_version}" != "${remote_version}" ]]; then
46+
log 'debug' "The installed version '${local_version}' does not much the remote version '${remote_version}'";
47+
TFENV_VERSION="${remote_version}";
48+
else
49+
TFENV_VERSION="${local_version}";
50+
fi;
51+
else
52+
log 'error' "No versions matching '${requested}' found in remote";
53+
fi;
54+
else
55+
if [[ -n "${local_version}" ]]; then
56+
TFENV_VERSION="${local_version}";
57+
else
58+
log 'error' "No installed versions of terraform matched '${TFENV_VERSION}'";
59+
fi;
60+
fi;
61+
else
62+
log 'debug' 'TFENV_VERSION does not use "latest" keyword';
63+
64+
# Accept a v-prefixed version, but strip the v.
65+
if [[ "${TFENV_VERSION}" =~ ^v.*$ ]]; then
66+
log 'debug' "Version Requested is prefixed with a v. Stripping the v."
67+
TFENV_VERSION="${TFENV_VERSION#v*}";
68+
fi;
69+
fi;
70+
71+
if [[ -z "${TFENV_VERSION}" ]]; then
72+
log 'error' "Version could not be resolved (set by ${TFENV_VERSION_SOURCE} or tfenv use <version>)";
73+
fi;
74+
75+
if [[ ! -d "${TFENV_CONFIG_DIR}/versions/${TFENV_VERSION}" ]]; then
76+
log 'debug' "version '${TFENV_VERSION}' is not installed (set by ${TFENV_VERSION_SOURCE})";
77+
fi;
78+
79+
echo "${TFENV_VERSION}";
80+
}
81+
export -f tfenv-version-name;

0 commit comments

Comments
 (0)