From 8caca966efa937edf6d1fdb4bdf4061b1f769454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Reegn?= Date: Tue, 14 Dec 2021 21:49:25 +0100 Subject: [PATCH 1/7] Improve bashlog.sh performance Performance is improved by an order of magnitude by ensuring that logging does not fork unnecessarily: * forking to `date` only happens if timestamps are actually used * forking to basename is replaced with bash expansion * uppercasing is repaced with bash expansion Fixes #196 --- lib/bashlog.sh | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/bashlog.sh b/lib/bashlog.sh index 4436e77..414f934 100755 --- a/lib/bashlog.sh +++ b/lib/bashlog.sh @@ -14,26 +14,27 @@ function _log_exception() { export -f _log_exception; function log() { - local date_format="${BASHLOG_DATE_FORMAT:-+%F %T}"; - local date="$(date "${date_format}")"; - local date_s="$(date "+%s")"; - + local syslog="${BASHLOG_SYSLOG:-0}"; local file="${BASHLOG_FILE:-0}"; - local file_path="${BASHLOG_FILE_PATH:-/tmp/$(basename "${0}").log}"; - local json="${BASHLOG_JSON:-0}"; - local json_path="${BASHLOG_JSON_PATH:-/tmp/$(basename "${0}").log.json}"; + local stdout_extra="${BASHLOG_EXTRA:-0}"; - local syslog="${BASHLOG_SYSLOG:-0}"; - local tag="${BASHLOG_SYSLOG_TAG:-$(basename "${0}")}"; + if [ "${file}" -eq 1 ] || [ "${json}" -eq 1 ] || [ "${stdout_extra}" -eq 1 ]; then + local date_format="${BASHLOG_DATE_FORMAT:-+%F %T}"; + local date="$(date "${date_format}")"; + local date_s="$(date "+%s")"; + fi + local file_path="${BASHLOG_FILE_PATH:-/tmp/${0##*/}.log}"; + local json_path="${BASHLOG_JSON_PATH:-/tmp/${0##*/}.log.json}"; + + local tag="${BASHLOG_SYSLOG_TAG:-${0##*/})}"; local facility="${BASHLOG_SYSLOG_FACILITY:-local0}"; local pid="${$}"; local level="${1}"; - local upper="$(echo "${level}" | awk '{print toupper($0)}')"; + local upper="${level^^}"; local debug_level="${TFENV_DEBUG:-0}"; local stdout_colours="${BASHLOG_COLOURS:-1}"; - local stdout_extra="${BASHLOG_EXTRA:-0}"; local custom_eval_prefix="${BASHLOG_I_PROMISE_TO_BE_CAREFUL_CUSTOM_EVAL_PREFIX:-""}"; From 6ebebf6a8fbe69283066fbedb5ecf7c3284a88ee Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 8 Mar 2022 18:27:58 +0000 Subject: [PATCH 2/7] extract some libexec commands into helper functions --- lib/helpers.sh | 4 ++ lib/tfenv-exec.sh | 36 +++++++++++++++++ lib/tfenv-version-file.sh | 26 +++++++++++++ lib/tfenv-version-name.sh | 80 ++++++++++++++++++++++++++++++++++++++ libexec/tfenv-exec | 35 +---------------- libexec/tfenv-version-file | 25 +----------- libexec/tfenv-version-name | 79 +------------------------------------ 7 files changed, 149 insertions(+), 136 deletions(-) create mode 100644 lib/tfenv-exec.sh create mode 100644 lib/tfenv-version-file.sh create mode 100644 lib/tfenv-version-name.sh diff --git a/lib/helpers.sh b/lib/helpers.sh index 1e73dfc..0001ea9 100755 --- a/lib/helpers.sh +++ b/lib/helpers.sh @@ -158,4 +158,8 @@ function error_and_proceed() { }; export -f error_and_proceed; +source "$TFENV_ROOT/lib/tfenv-exec.sh"; +source "$TFENV_ROOT/lib/tfenv-version-file.sh"; +source "$TFENV_ROOT/lib/tfenv-version-name.sh"; + export TFENV_HELPERS=1; diff --git a/lib/tfenv-exec.sh b/lib/tfenv-exec.sh new file mode 100644 index 0000000..698c398 --- /dev/null +++ b/lib/tfenv-exec.sh @@ -0,0 +1,36 @@ +function tfenv-exec() { + log 'debug' 'Getting version from tfenv-version-name'; + TFENV_VERSION="$(tfenv-version-name)" \ + && log 'debug' "TFENV_VERSION is ${TFENV_VERSION}" \ + || { + # Errors will be logged from tfenv-version name, + # we don't need to trouble STDERR with repeat information here + log 'debug' 'Failed to get version from tfenv-version-name'; + return 1; + }; + export TFENV_VERSION; + + if [ ! -d "${TFENV_CONFIG_DIR}/versions/${TFENV_VERSION}" ]; then + if [ "${TFENV_AUTO_INSTALL:-true}" == "true" ]; then + if [ -z "${TFENV_TERRAFORM_VERSION:-""}" ]; then + TFENV_VERSION_SOURCE="$(tfenv-version-file)"; + else + TFENV_VERSION_SOURCE='TFENV_TERRAFORM_VERSION'; + fi + log 'info' "version '${TFENV_VERSION}' is not installed (set by ${TFENV_VERSION_SOURCE}). Installing now as TFENV_AUTO_INSTALL==true"; + tfenv-install; + else + log 'error' "version '${TFENV_VERSION}' was requested, but not installed and TFENV_AUTO_INSTALL is not 'true'"; + fi; + fi; + + TF_BIN_PATH="${TFENV_CONFIG_DIR}/versions/${TFENV_VERSION}/terraform"; + export PATH="${TF_BIN_PATH}:${PATH}"; + log 'debug' "TF_BIN_PATH added to PATH: ${TF_BIN_PATH}"; + log 'debug' "Executing: ${TF_BIN_PATH} $@"; + + exec "${TF_BIN_PATH}" "$@" \ + || log 'error' "Failed to execute: ${TF_BIN_PATH} $*"; + + return 0; +} \ No newline at end of file diff --git a/lib/tfenv-version-file.sh b/lib/tfenv-version-file.sh new file mode 100644 index 0000000..8615606 --- /dev/null +++ b/lib/tfenv-version-file.sh @@ -0,0 +1,26 @@ +find_local_version_file() { + log 'debug' "Looking for a version file in ${1}"; + local root="${1}"; + while ! [[ "${root}" =~ ^//[^/]*$ ]]; do + if [ -e "${root}/.terraform-version" ]; then + log 'debug' "Found at ${root}/.terraform-version"; + echo "${root}/.terraform-version"; + return 0; + else + log 'debug' "Not found at ${root}/.terraform-version"; + fi; + [ -n "${root}" ] || break; + root="${root%/*}"; + done; + log 'debug' "No version file found in ${1}"; + return 1; +} + +function tfenv-version-file() { + if ! find_local_version_file "${TFENV_DIR:-${PWD}}"; then + if ! find_local_version_file "${HOME:-/}"; then + log 'debug' "No version file found in search paths. Defaulting to TFENV_CONFIG_DIR: ${TFENV_CONFIG_DIR}/version"; + echo "${TFENV_CONFIG_DIR}/version"; + fi; + fi; +} diff --git a/lib/tfenv-version-name.sh b/lib/tfenv-version-name.sh new file mode 100644 index 0000000..1ade2cf --- /dev/null +++ b/lib/tfenv-version-name.sh @@ -0,0 +1,80 @@ +function tfenv-version-name() { + if [[ -z "${TFENV_TERRAFORM_VERSION:-""}" ]]; then + TFENV_VERSION_FILE="$(tfenv-version-file)" \ + && log 'debug' "TFENV_VERSION_FILE retrieved from tfenv-version-file: ${TFENV_VERSION_FILE}" \ + || log 'error' 'Failed to retrieve TFENV_VERSION_FILE from tfenv-version-file'; + + TFENV_VERSION="$(cat "${TFENV_VERSION_FILE}" || true)" \ + && log 'debug' "TFENV_VERSION specified in TFENV_VERSION_FILE: ${TFENV_VERSION}"; + + TFENV_VERSION_SOURCE="${TFENV_VERSION_FILE}"; + else + TFENV_VERSION="${TFENV_TERRAFORM_VERSION}" \ + && log 'debug' "TFENV_VERSION specified in TFENV_TERRAFORM_VERSION: ${TFENV_VERSION}"; + + TFENV_VERSION_SOURCE='TFENV_TERRAFORM_VERSION'; + fi; + + if [[ "${TFENV_VERSION}" =~ ^latest.*$ ]]; then + log 'debug' "TFENV_VERSION uses 'latest' keyword: ${TFENV_VERSION}"; + + [ -d "${TFENV_CONFIG_DIR}/versions" ] \ + || log 'error' 'No versions of terraform installed. Please install one with: tfenv install'; + + if [[ "${TFENV_VERSION}" =~ ^latest\:.*$ ]]; then + regex="${TFENV_VERSION##*\:}"; + log 'debug' "'latest' keyword uses regex: ${regex}"; + else + regex="^[0-9]\+\.[0-9]\+\.[0-9]\+$"; + log 'debug' "Version uses latest keyword alone. Forcing regex to match stable versions only: ${regex}"; + fi; + + declare local_version=''; + if [[ -d "${TFENV_CONFIG_DIR}/versions" ]]; then + local_version="$(\find "${TFENV_CONFIG_DIR}/versions/" -type d -exec basename {} \; \ + | tail -n +2 \ + | sort -t'.' -k 1nr,1 -k 2nr,2 -k 3nr,3 \ + | grep -e "${regex}" \ + | head -n 1)"; + fi; + + if [[ "${TFENV_AUTO_INSTALL:-true}" == "true" ]]; then + log 'debug' "Trying to find the remote version using the regex: ${regex}"; + remote_version="$(tfenv-list-remote | grep -e "${regex}" | head -n 1)"; + if [[ -n "${remote_version}" ]]; then + if [[ "${local_version}" != "${remote_version}" ]]; then + log 'debug' "The installed version '${local_version}' does not much the remote version '${remote_version}'"; + TFENV_VERSION="${remote_version}"; + else + TFENV_VERSION="${local_version}"; + fi; + else + log 'error' "No versions matching '${requested}' found in remote"; + fi; + else + if [[ -n "${local_version}" ]]; then + TFENV_VERSION="${local_version}"; + else + log 'error' "No installed versions of terraform matched '${TFENV_VERSION}'"; + fi; + fi; + else + log 'debug' 'TFENV_VERSION does not use "latest" keyword'; + + # Accept a v-prefixed version, but strip the v. + if [[ "${TFENV_VERSION}" =~ ^v.*$ ]]; then + log 'debug' "Version Requested is prefixed with a v. Stripping the v." + TFENV_VERSION="${TFENV_VERSION#v*}"; + fi; + fi; + + if [[ -z "${TFENV_VERSION}" ]]; then + log 'error' "Version could not be resolved (set by ${TFENV_VERSION_SOURCE} or tfenv use )"; + fi; + + if [[ ! -d "${TFENV_CONFIG_DIR}/versions/${TFENV_VERSION}" ]]; then + log 'debug' "version '${TFENV_VERSION}' is not installed (set by ${TFENV_VERSION_SOURCE})"; + fi; + + echo "${TFENV_VERSION}"; +} diff --git a/libexec/tfenv-exec b/libexec/tfenv-exec index 25d6aac..d3ae7dc 100755 --- a/libexec/tfenv-exec +++ b/libexec/tfenv-exec @@ -72,37 +72,4 @@ done; # Begin Script Body # ##################### -log 'debug' 'Getting version from tfenv-version-name'; -TFENV_VERSION="$(tfenv-version-name)" \ - && log 'debug' "TFENV_VERSION is ${TFENV_VERSION}" \ - || { - # Errors will be logged from tfenv-version name, - # we don't need to trouble STDERR with repeat information here - log 'debug' 'Failed to get version from tfenv-version-name'; - exit 1; - }; -export TFENV_VERSION; - -if [ ! -d "${TFENV_CONFIG_DIR}/versions/${TFENV_VERSION}" ]; then - if [ "${TFENV_AUTO_INSTALL:-true}" == "true" ]; then - if [ -z "${TFENV_TERRAFORM_VERSION:-""}" ]; then - TFENV_VERSION_SOURCE="$(tfenv-version-file)"; - else - TFENV_VERSION_SOURCE='TFENV_TERRAFORM_VERSION'; - fi - log 'info' "version '${TFENV_VERSION}' is not installed (set by ${TFENV_VERSION_SOURCE}). Installing now as TFENV_AUTO_INSTALL==true"; - tfenv-install; - else - log 'error' "version '${TFENV_VERSION}' was requested, but not installed and TFENV_AUTO_INSTALL is not 'true'"; - fi; -fi; - -TF_BIN_PATH="${TFENV_CONFIG_DIR}/versions/${TFENV_VERSION}/terraform"; -export PATH="${TF_BIN_PATH}:${PATH}"; -log 'debug' "TF_BIN_PATH added to PATH: ${TF_BIN_PATH}"; -log 'debug' "Executing: ${TF_BIN_PATH} $@"; - -exec "${TF_BIN_PATH}" "$@" \ - || log 'error' "Failed to execute: ${TF_BIN_PATH} $*"; - -exit 0; +tfenv-exec "$@" diff --git a/libexec/tfenv-version-file b/libexec/tfenv-version-file index a906ff9..6c2ae3f 100755 --- a/libexec/tfenv-version-file +++ b/libexec/tfenv-version-file @@ -61,27 +61,4 @@ done; # Begin Script Body # ##################### -find_local_version_file() { - log 'debug' "Looking for a version file in ${1}"; - local root="${1}"; - while ! [[ "${root}" =~ ^//[^/]*$ ]]; do - if [ -e "${root}/.terraform-version" ]; then - log 'debug' "Found at ${root}/.terraform-version"; - echo "${root}/.terraform-version"; - return 0; - else - log 'debug' "Not found at ${root}/.terraform-version"; - fi; - [ -n "${root}" ] || break; - root="${root%/*}"; - done; - log 'debug' "No version file found in ${1}"; - return 1; -} - -if ! find_local_version_file "${TFENV_DIR:-${PWD}}"; then - if ! find_local_version_file "${HOME:-/}"; then - log 'debug' "No version file found in search paths. Defaulting to TFENV_CONFIG_DIR: ${TFENV_CONFIG_DIR}/version"; - echo "${TFENV_CONFIG_DIR}/version"; - fi; -fi; +tfenv-version-file "$@" diff --git a/libexec/tfenv-version-name b/libexec/tfenv-version-name index 70c4fbf..d90884e 100755 --- a/libexec/tfenv-version-name +++ b/libexec/tfenv-version-name @@ -60,81 +60,4 @@ done; # Begin Script Body # ##################### -if [[ -z "${TFENV_TERRAFORM_VERSION:-""}" ]]; then - TFENV_VERSION_FILE="$(tfenv-version-file)" \ - && log 'debug' "TFENV_VERSION_FILE retrieved from tfenv-version-file: ${TFENV_VERSION_FILE}" \ - || log 'error' 'Failed to retrieve TFENV_VERSION_FILE from tfenv-version-file'; - - TFENV_VERSION="$(cat "${TFENV_VERSION_FILE}" || true)" \ - && log 'debug' "TFENV_VERSION specified in TFENV_VERSION_FILE: ${TFENV_VERSION}"; - - TFENV_VERSION_SOURCE="${TFENV_VERSION_FILE}"; -else - TFENV_VERSION="${TFENV_TERRAFORM_VERSION}" \ - && log 'debug' "TFENV_VERSION specified in TFENV_TERRAFORM_VERSION: ${TFENV_VERSION}"; - - TFENV_VERSION_SOURCE='TFENV_TERRAFORM_VERSION'; -fi; - -if [[ "${TFENV_VERSION}" =~ ^latest.*$ ]]; then - log 'debug' "TFENV_VERSION uses 'latest' keyword: ${TFENV_VERSION}"; - - [ -d "${TFENV_CONFIG_DIR}/versions" ] \ - || log 'error' 'No versions of terraform installed. Please install one with: tfenv install'; - - if [[ "${TFENV_VERSION}" =~ ^latest\:.*$ ]]; then - regex="${TFENV_VERSION##*\:}"; - log 'debug' "'latest' keyword uses regex: ${regex}"; - else - regex="^[0-9]\+\.[0-9]\+\.[0-9]\+$"; - log 'debug' "Version uses latest keyword alone. Forcing regex to match stable versions only: ${regex}"; - fi; - - declare local_version=''; - if [[ -d "${TFENV_CONFIG_DIR}/versions" ]]; then - local_version="$(\find "${TFENV_CONFIG_DIR}/versions/" -type d -exec basename {} \; \ - | tail -n +2 \ - | sort -t'.' -k 1nr,1 -k 2nr,2 -k 3nr,3 \ - | grep -e "${regex}" \ - | head -n 1)"; - fi; - - if [[ "${TFENV_AUTO_INSTALL:-true}" == "true" ]]; then - log 'debug' "Trying to find the remote version using the regex: ${regex}"; - remote_version="$(tfenv-list-remote | grep -e "${regex}" | head -n 1)"; - if [[ -n "${remote_version}" ]]; then - if [[ "${local_version}" != "${remote_version}" ]]; then - log 'debug' "The installed version '${local_version}' does not much the remote version '${remote_version}'"; - TFENV_VERSION="${remote_version}"; - else - TFENV_VERSION="${local_version}"; - fi; - else - log 'error' "No versions matching '${requested}' found in remote"; - fi; - else - if [[ -n "${local_version}" ]]; then - TFENV_VERSION="${local_version}"; - else - log 'error' "No installed versions of terraform matched '${TFENV_VERSION}'"; - fi; - fi; -else - log 'debug' 'TFENV_VERSION does not use "latest" keyword'; - - # Accept a v-prefixed version, but strip the v. - if [[ "${TFENV_VERSION}" =~ ^v.*$ ]]; then - log 'debug' "Version Requested is prefixed with a v. Stripping the v." - TFENV_VERSION="${TFENV_VERSION#v*}"; - fi; -fi; - -if [[ -z "${TFENV_VERSION}" ]]; then - log 'error' "Version could not be resolved (set by ${TFENV_VERSION_SOURCE} or tfenv use )"; -fi; - -if [[ ! -d "${TFENV_CONFIG_DIR}/versions/${TFENV_VERSION}" ]]; then - log 'debug' "version '${TFENV_VERSION}' is not installed (set by ${TFENV_VERSION_SOURCE})"; -fi; - -echo "${TFENV_VERSION}"; +tfenv-version-name "$@" From c2f04c532efa92109445d0d552da6431102ad246 Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 8 Mar 2022 18:37:48 +0000 Subject: [PATCH 3/7] shim `log` function to avoid loading bashlog until necessary --- bin/terraform | 6 +----- lib/bashlog.sh | 2 +- lib/helpers.sh | 19 ++++++++++++++++++- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/bin/terraform b/bin/terraform index a66a0ce..4b2ba55 100755 --- a/bin/terraform +++ b/bin/terraform @@ -62,8 +62,4 @@ log 'debug' "program=\"${0##*/}\""; declare tfenv_path="${TFENV_ROOT}/bin/tfenv"; -log 'debug' "Exec: \"${tfenv_path}\" exec \"$*\""; -exec "${tfenv_path}" exec "$@" \ - || log 'error' "Failed to exec: \"${tfenv_path}\" exec \"$*\""; - -log 'error' 'This line should not be reachable. Something catastrophic has occurred'; +tfenv-exec "$@" diff --git a/lib/bashlog.sh b/lib/bashlog.sh index 414f934..0ae6322 100755 --- a/lib/bashlog.sh +++ b/lib/bashlog.sh @@ -163,7 +163,7 @@ export -f log; declare prev_cmd="null"; declare this_cmd="null"; -trap 'prev_cmd=$this_cmd; this_cmd=$BASH_COMMAND' DEBUG \ +trap 'prev_cmd=${this_cmd:-null}; this_cmd=$BASH_COMMAND' DEBUG \ && log debug 'DEBUG trap set' \ || log 'error' 'DEBUG trap failed to set'; diff --git a/lib/helpers.sh b/lib/helpers.sh index 0001ea9..f30e25a 100755 --- a/lib/helpers.sh +++ b/lib/helpers.sh @@ -42,7 +42,24 @@ if [ "${TFENV_DEBUG:-0}" -gt 0 ]; then fi; fi; -source "${TFENV_ROOT}/lib/bashlog.sh"; +function load_bashlog () { + source "${TFENV_ROOT}/lib/bashlog.sh"; +} +if [ "${TFENV_DEBUG:-0}" -gt 0 ] ; then + # our shim below cannot be used when debugging is enabled + load_bashlog +else + # Shim that understands to no-op for debug messages, and defers to + # full bashlog for everything else. + function log () { + if [ "$1" != 'debug' ] ; then + # Loading full bashlog will overwrite the `log` function + load_bashlog + log "$@" + fi + } + export -f log; +fi resolve_version () { declare version_requested version regex min_required version_file; From baf79ce7e62c0275b2b14f03bd2ae85d398a4bcf Mon Sep 17 00:00:00 2001 From: Andrew Bradley Date: Tue, 8 Mar 2022 19:42:20 +0000 Subject: [PATCH 4/7] add missing exports --- lib/helpers.sh | 1 + lib/tfenv-exec.sh | 3 ++- lib/tfenv-version-file.sh | 2 ++ lib/tfenv-version-name.sh | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/helpers.sh b/lib/helpers.sh index f30e25a..d7947e6 100755 --- a/lib/helpers.sh +++ b/lib/helpers.sh @@ -45,6 +45,7 @@ fi; function load_bashlog () { source "${TFENV_ROOT}/lib/bashlog.sh"; } +export -f load_bashlog; if [ "${TFENV_DEBUG:-0}" -gt 0 ] ; then # our shim below cannot be used when debugging is enabled load_bashlog diff --git a/lib/tfenv-exec.sh b/lib/tfenv-exec.sh index 698c398..d3fe8eb 100644 --- a/lib/tfenv-exec.sh +++ b/lib/tfenv-exec.sh @@ -33,4 +33,5 @@ function tfenv-exec() { || log 'error' "Failed to execute: ${TF_BIN_PATH} $*"; return 0; -} \ No newline at end of file +} +export -f tfenv-exec; diff --git a/lib/tfenv-version-file.sh b/lib/tfenv-version-file.sh index 8615606..78b8de9 100644 --- a/lib/tfenv-version-file.sh +++ b/lib/tfenv-version-file.sh @@ -15,6 +15,7 @@ find_local_version_file() { log 'debug' "No version file found in ${1}"; return 1; } +export -f find_local_version_file; function tfenv-version-file() { if ! find_local_version_file "${TFENV_DIR:-${PWD}}"; then @@ -24,3 +25,4 @@ function tfenv-version-file() { fi; fi; } +export -f tfenv-version-file; diff --git a/lib/tfenv-version-name.sh b/lib/tfenv-version-name.sh index 1ade2cf..421bce8 100644 --- a/lib/tfenv-version-name.sh +++ b/lib/tfenv-version-name.sh @@ -78,3 +78,4 @@ function tfenv-version-name() { echo "${TFENV_VERSION}"; } +export -f tfenv-version-name; From 8742a286772326024b752908a10ef35707ce6e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Reegn?= Date: Wed, 9 Mar 2022 15:41:30 +0100 Subject: [PATCH 5/7] Get rid of forking to basename and dirname on the hot path --- bin/terraform | 10 +++++----- bin/tfenv | 9 +++++---- lib/helpers.sh | 10 +++++----- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/bin/terraform b/bin/terraform index 4b2ba55..c00b16a 100755 --- a/bin/terraform +++ b/bin/terraform @@ -17,16 +17,16 @@ if [ -z "${TFENV_ROOT:-""}" ]; then local file_name; while [ "${target_file}" != "" ]; do - cd "$(dirname ${target_file})" || early_death "Failed to 'cd \$(dirname ${target_file})' while trying to determine TFENV_ROOT"; - file_name="$(basename "${target_file}")" || early_death "Failed to 'basename \"${target_file}\"' while trying to determine TFENV_ROOT"; + cd "${target_file%/*}" || early_death "Failed to 'cd \$(${target_file%/*})' while trying to determine TFENV_ROOT"; + file_name="${target_file##*/}" || early_death "Failed to '\"${target_file##*/}\"' while trying to determine TFENV_ROOT"; target_file="$(readlink "${file_name}")"; done; echo "$(pwd -P)/${file_name}"; }; - - TFENV_ROOT="$(cd "$(dirname "$(readlink_f "${0}")")/.." && pwd)"; - [ -n ${TFENV_ROOT} ] || early_death "Failed to 'cd \"\$(dirname \"\$(readlink_f \"${0}\")\")/..\" && pwd' while trying to determine TFENV_ROOT"; + TFENV_SHIM=$(readlink_f "${0}") + TFENV_ROOT="${TFENV_SHIM%/*/*}"; + [ -n "${TFENV_ROOT}" ] || early_death "Failed to determine TFENV_ROOT" else TFENV_ROOT="${TFENV_ROOT%/}"; fi; diff --git a/bin/tfenv b/bin/tfenv index db60c90..0d963bb 100755 --- a/bin/tfenv +++ b/bin/tfenv @@ -17,16 +17,17 @@ if [ -z "${TFENV_ROOT:-""}" ]; then local file_name; while [ "${target_file}" != "" ]; do - cd "$(dirname ${target_file})" || early_death "Failed to 'cd \$(dirname ${target_file})' while trying to determine TFENV_ROOT"; - file_name="$(basename "${target_file}")" || early_death "Failed to 'basename \"${target_file}\"' while trying to determine TFENV_ROOT"; + cd "${target_file%/*}" || early_death "Failed to 'cd \$(${target_file%/*})' while trying to determine TFENV_ROOT"; + file_name="${target_file##*/}" || early_death "Failed to '\"${target_file##*/}\"' while trying to determine TFENV_ROOT"; target_file="$(readlink "${file_name}")"; done; echo "$(pwd -P)/${file_name}"; }; + TFENV_SHIM=$(readlink_f "${0}") + TFENV_ROOT="${TFENV_SHIM%/*/*}"; + [ -n "${TFENV_ROOT}" ] || early_death "Failed to determine TFENV_ROOT" - TFENV_ROOT="$(cd "$(dirname "$(readlink_f "${0}")")/.." && pwd)"; - [ -n ${TFENV_ROOT} ] || early_death "Failed to 'cd \"\$(dirname \"\$(readlink_f \"${0}\")\")/..\" && pwd' while trying to determine TFENV_ROOT"; else TFENV_ROOT="${TFENV_ROOT%/}"; fi; diff --git a/lib/helpers.sh b/lib/helpers.sh index d7947e6..582c428 100755 --- a/lib/helpers.sh +++ b/lib/helpers.sh @@ -9,16 +9,16 @@ if [ -z "${TFENV_ROOT:-""}" ]; then local file_name; while [ "${target_file}" != "" ]; do - cd "$(dirname ${target_file})" || early_death "Failed to 'cd \$(dirname ${target_file})' while trying to determine TFENV_ROOT"; - file_name="$(basename "${target_file}")" || early_death "Failed to 'basename \"${target_file}\"' while trying to determine TFENV_ROOT"; + cd "${target_file%/*}" || early_death "Failed to 'cd \$(${target_file%/*})' while trying to determine TFENV_ROOT"; + file_name="${target_file##*/}" || early_death "Failed to '\"${target_file##*/}\"' while trying to determine TFENV_ROOT"; target_file="$(readlink "${file_name}")"; done; echo "$(pwd -P)/${file_name}"; }; - - TFENV_ROOT="$(cd "$(dirname "$(readlink_f "${0}")")/.." && pwd)"; - [ -n ${TFENV_ROOT} ] || early_death "Failed to 'cd \"\$(dirname \"\$(readlink_f \"${0}\")\")/..\" && pwd' while trying to determine TFENV_ROOT"; + TFENV_SHIM=$(readlink_f "${0}") + TFENV_ROOT="${TFENV_SHIM%/*/*}"; + [ -n "${TFENV_ROOT}" ] || early_death "Failed to determine TFENV_ROOT" else TFENV_ROOT="${TFENV_ROOT%/}"; fi; From 88a0956512e0be1fda7d8b55ed958211c9649379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Reegn?= Date: Wed, 9 Mar 2022 15:48:07 +0100 Subject: [PATCH 6/7] bashlog: add back bash3.2 compatible uppercase For now the perf issue of the shim is solved, so it's fine for debug logging to be of lower performance. --- lib/bashlog.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bashlog.sh b/lib/bashlog.sh index 0ae6322..764be7b 100755 --- a/lib/bashlog.sh +++ b/lib/bashlog.sh @@ -32,7 +32,7 @@ function log() { local pid="${$}"; local level="${1}"; - local upper="${level^^}"; + local upper="$(tr '[:lower:]' '[:upper:]')"; local debug_level="${TFENV_DEBUG:-0}"; local stdout_colours="${BASHLOG_COLOURS:-1}"; From 3e7da1cf27212d179f356439ff10f94c6ba5733d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Reegn?= Date: Wed, 9 Mar 2022 15:53:44 +0100 Subject: [PATCH 7/7] bashlog: change upper to original code --- lib/bashlog.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bashlog.sh b/lib/bashlog.sh index 764be7b..4abdadd 100755 --- a/lib/bashlog.sh +++ b/lib/bashlog.sh @@ -32,7 +32,7 @@ function log() { local pid="${$}"; local level="${1}"; - local upper="$(tr '[:lower:]' '[:upper:]')"; + local upper="$(echo "${level}" | awk '{print toupper($0)}')"; local debug_level="${TFENV_DEBUG:-0}"; local stdout_colours="${BASHLOG_COLOURS:-1}";