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