diff --git a/hooks/_common.sh b/hooks/_common.sh index defc249a8..7281b0244 100644 --- a/hooks/_common.sh +++ b/hooks/_common.sh @@ -606,3 +606,34 @@ function common::export_provided_env_vars { export $var_name="$var_value" done } + +####################################################################### +# Check if the installed Terragrunt version is >=0.78.0 or not +# +# This function helps to determine which terragrunt subcomand to use +# based on Terragrunt version +# +# Returns: +# - 0 if version >= 0.78.0 +# - 1 if version < 0.78.0 +# Defaults to 0 if version cannot be determined +####################################################################### +# TODO: Drop after May 2027. Two years to upgrade is more than enough. +function common::terragrunt_version_ge_0.78 { + local terragrunt_version + + # Extract version number (e.g., "terragrunt version v0.80.4" -> "0.80") + terragrunt_version=$(terragrunt --version 2> /dev/null | grep -oE '[0-9]+\.[0-9]+') + # If we can't parse version, default to newer command + [[ ! $terragrunt_version ]] && return 0 + + local major minor + IFS='.' read -r major minor <<< "$terragrunt_version" + + # New subcommands added in v0.78.0 (May 2025) + if [[ $major -gt 0 || ($major -eq 0 && $minor -ge 78) ]]; then + return 0 + else + return 1 + fi +} diff --git a/hooks/terragrunt_fmt.sh b/hooks/terragrunt_fmt.sh index 698b3843b..2d6697ae3 100755 --- a/hooks/terragrunt_fmt.sh +++ b/hooks/terragrunt_fmt.sh @@ -12,7 +12,13 @@ function main { common::parse_cmdline "$@" common::export_provided_env_vars "${ENV_VARS[@]}" common::parse_and_export_env_vars - # JFYI: terragrunt hclfmt color already suppressed via PRE_COMMIT_COLOR=never + # JFYI: `terragrunt hcl format` color already suppressed via PRE_COMMIT_COLOR=never + + if common::terragrunt_version_ge_0.78; then + local -ra SUBCOMMAND=(hcl format) + else + local -ra SUBCOMMAND=(hclfmt) + fi # shellcheck disable=SC2153 # False positive common::per_dir_hook "$HOOK_ID" "${#ARGS[@]}" "${ARGS[@]}" "${FILES[@]}" @@ -46,7 +52,7 @@ function per_dir_hook_unique_part { local -a -r args=("$@") # pass the arguments to hook - terragrunt hclfmt "${args[@]}" + terragrunt "${SUBCOMMAND[@]}" "${args[@]}" # return exit code to common::per_dir_hook local exit_code=$? @@ -63,7 +69,7 @@ function run_hook_on_whole_repo { local -a -r args=("$@") # pass the arguments to hook - terragrunt hclfmt "$(pwd)" "${args[@]}" + terragrunt "${SUBCOMMAND[@]}" "$(pwd)" "${args[@]}" # return exit code to common::per_dir_hook local exit_code=$? diff --git a/hooks/terragrunt_providers_lock.sh b/hooks/terragrunt_providers_lock.sh index 9e3557aeb..21ee668fe 100755 --- a/hooks/terragrunt_providers_lock.sh +++ b/hooks/terragrunt_providers_lock.sh @@ -14,6 +14,12 @@ function main { common::parse_and_export_env_vars # JFYI: terragrunt providers lock color already suppressed via PRE_COMMIT_COLOR=never + if common::terragrunt_version_ge_0.78; then + local -ra RUN_ALL_SUBCOMMAND=(run --all providers lock) + else + local -ra RUN_ALL_SUBCOMMAND=(run-all providers lock) + fi + # shellcheck disable=SC2153 # False positive common::per_dir_hook "$HOOK_ID" "${#ARGS[@]}" "${ARGS[@]}" "${FILES[@]}" } @@ -63,7 +69,7 @@ function run_hook_on_whole_repo { local -a -r args=("$@") # pass the arguments to hook - terragrunt run-all providers lock "${args[@]}" + terragrunt "${RUN_ALL_SUBCOMMAND[@]}" "${args[@]}" # return exit code to common::per_dir_hook local exit_code=$? diff --git a/hooks/terragrunt_validate.sh b/hooks/terragrunt_validate.sh index 5a62c3913..54b7a98d6 100755 --- a/hooks/terragrunt_validate.sh +++ b/hooks/terragrunt_validate.sh @@ -14,6 +14,12 @@ function main { common::parse_and_export_env_vars # JFYI: terragrunt validate color already suppressed via PRE_COMMIT_COLOR=never + if common::terragrunt_version_ge_0.78; then + local -ra RUN_ALL_SUBCOMMAND=(run --all validate) + else + local -ra RUN_ALL_SUBCOMMAND=(run-all validate) + fi + # shellcheck disable=SC2153 # False positive common::per_dir_hook "$HOOK_ID" "${#ARGS[@]}" "${ARGS[@]}" "${FILES[@]}" } @@ -63,7 +69,7 @@ function run_hook_on_whole_repo { local -a -r args=("$@") # pass the arguments to hook - terragrunt run-all validate "${args[@]}" + terragrunt "${RUN_ALL_SUBCOMMAND[@]}" "${args[@]}" # return exit code to common::per_dir_hook local exit_code=$? diff --git a/hooks/terragrunt_validate_inputs.sh b/hooks/terragrunt_validate_inputs.sh index 0c8d79e2d..39e8e484e 100755 --- a/hooks/terragrunt_validate_inputs.sh +++ b/hooks/terragrunt_validate_inputs.sh @@ -14,6 +14,14 @@ function main { common::parse_and_export_env_vars # JFYI: terragrunt validate color already suppressed via PRE_COMMIT_COLOR=never + if common::terragrunt_version_ge_0.78; then + local -ra SUBCOMMAND=(hcl validate --inputs) + local -ra RUN_ALL_SUBCOMMAND=(run --all hcl validate --inputs) + else + local -ra SUBCOMMAND=(validate-inputs) + local -ra RUN_ALL_SUBCOMMAND=(run-all validate-inputs) + fi + # shellcheck disable=SC2153 # False positive common::per_dir_hook "$HOOK_ID" "${#ARGS[@]}" "${ARGS[@]}" "${FILES[@]}" } @@ -46,7 +54,7 @@ function per_dir_hook_unique_part { local -a -r args=("$@") # pass the arguments to hook - terragrunt validate-inputs "${args[@]}" + terragrunt "${SUBCOMMAND[@]}" "${args[@]}" # return exit code to common::per_dir_hook local exit_code=$? @@ -63,7 +71,7 @@ function run_hook_on_whole_repo { local -a -r args=("$@") # pass the arguments to hook - terragrunt run-all validate-inputs "${args[@]}" + terragrunt "${RUN_ALL_SUBCOMMAND[@]}" "${args[@]}" # return exit code to common::per_dir_hook local exit_code=$?