From 043581840caf352d3fbe16f1b2d6d62ec0024737 Mon Sep 17 00:00:00 2001 From: Jason Wang Date: Thu, 10 Sep 2026 08:54:21 +0000 Subject: [PATCH] fix: quote path when detecting min-required versions Unquoted ${path}/{*.tf,*.tf.json} word-splits when TFENV_DIR or the working directory contains spaces, so min-required resolution finds no files and install/resolve fails. Quote the path in both globs and add a regression test. --- lib/tfenv-min-required.sh | 4 ++-- test/test_use_minrequired.sh | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/tfenv-min-required.sh b/lib/tfenv-min-required.sh index 6ab258f9..d5a714f7 100644 --- a/lib/tfenv-min-required.sh +++ b/lib/tfenv-min-required.sh @@ -5,7 +5,7 @@ set -uo pipefail; function tfenv-min-required() { local path="${1:-${TFENV_DIR:-.}}"; - local versions="$( echo $(cat ${path}/{*.tf,*.tf.json} 2>/dev/null | grep -Eh '^\s*[^#]*\s*required_version') | grep -o '[~=!<>]\{0,2\}\s*\([0-9]\+\.\?\)\{2,3\}\(-[a-z]\+[0-9]\+\)\?')"; + local versions="$( echo $(cat "${path}"/{*.tf,*.tf.json} 2>/dev/null | grep -Eh '^\s*[^#]*\s*required_version') | grep -o '[~=!<>]\{0,2\}\s*\([0-9]\+\.\?\)\{2,3\}\(-[a-z]\+[0-9]\+\)\?')"; if [[ "${versions}" =~ ([~=!<>]{0,2}[[:blank:]]*)([0-9]+[0-9.]+)[^0-9]*(-[a-z]+[0-9]+)? ]]; then qualifier="${BASH_REMATCH[1]}"; @@ -13,7 +13,7 @@ function tfenv-min-required() { if [[ "${qualifier}" =~ ^!= ]]; then log 'debug' "required_version is a negation - we cannot guess the desired one, skipping."; else - local min_required_file="$(grep -Hn required_version ${path}/{*.tf,*.tf.json} 2>/dev/null | xargs)"; + local min_required_file="$(grep -Hn required_version "${path}"/{*.tf,*.tf.json} 2>/dev/null | xargs)"; # Probably not an advisable way to choose a terraform version, # but this is the way this functionality works in terraform: diff --git a/test/test_use_minrequired.sh b/test/test_use_minrequired.sh index d43646e0..da96374a 100755 --- a/test/test_use_minrequired.sh +++ b/test/test_use_minrequired.sh @@ -115,6 +115,31 @@ echo 'min-required' > chdir-dir/.terraform-version cleanup || log 'error' 'Cleanup failed?!'; + +log 'info' '### Detect min-required when working directory path contains spaces (#537)'; + +spaced_dir="${PWD}/project with spaces"; +mkdir -p "${spaced_dir}"; +minv='1.6.0'; +echo "terraform { + required_version = \">=${minv}\" +}" > "${spaced_dir}/versions.tf"; + +( + cd "${spaced_dir}" || exit 1; + # bin/tfenv exports TFENV_DIR="${PWD}" before dispatching. Paths with spaces + # used to break unquoted ${path}/{*.tf,*.tf.json} globs in tfenv-min-required, + # so install/resolve-version min-required failed with an empty version. + export TFENV_DIR="${PWD}"; + detected="$(tfenv min-required)" || exit 1; + [ "${detected}" = "${minv}" ] || exit 1; + resolved="$(tfenv-resolve-version min-required)" || exit 1; + [ "${resolved}" = "${minv}:^${minv}$" ] || exit 1; +) || error_and_proceed 'Min-required detection failed when path contains spaces'; + +rm -rf "${spaced_dir}"; +cleanup || log 'error' 'Cleanup failed?!'; + finish_tests 'use_minrequired'; exit 0;