diff --git a/terraform_fmt.sh b/terraform_fmt.sh index d280574d1..6a8c52316 100755 --- a/terraform_fmt.sh +++ b/terraform_fmt.sh @@ -1,34 +1,89 @@ #!/usr/bin/env bash -set -e +set -eo pipefail -declare -a paths -declare -a tfvars_files +main() { + initialize_ + parse_cmdline_ "$@" + terraform_fnt_ +} -index=0 +initialize_() { + # get directory containing this script + local dir + local source + source="${BASH_SOURCE[0]}" + while [[ -L $source ]]; do # resolve $source until the file is no longer a symlink + dir="$(cd -P "$(dirname "$source")" > /dev/null && pwd)" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the symlink file was located + [[ $source != /* ]] && source="$dir/$source" + done + _SCRIPT_DIR="$(dirname "$source")" -for file_with_path in "$@"; do - file_with_path="${file_with_path// /__REPLACED__SPACE__}" + # source getopt function + # shellcheck source=lib_getopt + . "$_SCRIPT_DIR/lib_getopt" +} - paths[index]=$(dirname "$file_with_path") +parse_cmdline_() { + declare argv + argv=$(getopt -o a: --long args: -- "$@") || return + eval "set -- $argv" - if [[ "$file_with_path" == *".tfvars" ]]; then - tfvars_files+=("$file_with_path") - fi + for argv; do + case $argv in + -a | --args) + shift + ARGS+=("$1") + shift + ;; + --) + shift + FILES=("$@") + break + ;; + esac + done +} - let "index+=1" -done +terraform_fmt_() { -for path_uniq in $(echo "${paths[*]}" | tr ' ' '\n' | sort -u); do - path_uniq="${path_uniq//__REPLACED__SPACE__/ }" + declare -a paths + declare -a tfvars_files - pushd "$path_uniq" > /dev/null - terraform fmt - popd > /dev/null -done + index=0 -# terraform.tfvars are excluded by `terraform fmt` -for tfvars_file in "${tfvars_files[@]}"; do - tfvars_file="${tfvars_file//__REPLACED__SPACE__/ }" + for file_with_path in "${FILES[@]}"; do + file_with_path="${file_with_path// /__REPLACED__SPACE__}" - terraform fmt "$tfvars_file" -done + paths[index]=$(dirname "$file_with_path") + + if [[ "$file_with_path" == *".tfvars" ]]; then + tfvars_files+=("$file_with_path") + fi + + (( index+=1 )) + done + + for path_uniq in $(echo "${paths[*]}" | tr ' ' '\n' | sort -u); do + path_uniq="${path_uniq//__REPLACED__SPACE__/ }" + + ( + cd "$path_uniq" + terraform fmt "${ARGS[@]}" + ) + done + + # terraform.tfvars are excluded by `terraform fmt` + for tfvars_file in "${tfvars_files[@]}"; do + tfvars_file="${tfvars_file//__REPLACED__SPACE__/ }" + + terraform fmt "${ARGS[@]}" "$tfvars_file" + done +} + +# global arrays +declare -a ARGS=() +declare -a FILES=() + +[[ ${BASH_SOURCE[0]} != "$0" ]] || main "$@"