Files

132 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
repo_root="$(cd "${script_dir}/.." && pwd)"
env_file="${repo_root}/.env.devprod"
template_file="${repo_root}/.env.example"
dry_run="0"
backup_mode="1"
usage() {
cat <<USAGE
Usage: ./scripts/ensure-env-keys.sh [options]
Append missing KEY=VALUE entries from a template env file into a target env file.
Existing keys are never modified.
Options:
--env-file <path> Target env file (default: .env.devprod)
--template-file <path> Source template file (default: .env.example)
--dry-run Print missing keys without modifying files
--no-backup Do not create a timestamped backup before writing
-h, --help Show this help
USAGE
}
while [[ $# -gt 0 ]]; do
case "$1" in
--env-file)
env_file="${2:-}"
shift 2
;;
--env-file=*)
env_file="${1#*=}"
shift
;;
--template-file)
template_file="${2:-}"
shift 2
;;
--template-file=*)
template_file="${1#*=}"
shift
;;
--dry-run)
dry_run="1"
shift
;;
--no-backup)
backup_mode="0"
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown option: $1"
usage
exit 1
;;
esac
done
if [[ "${env_file}" != /* ]]; then
env_file="${repo_root}/${env_file}"
fi
if [[ "${template_file}" != /* ]]; then
template_file="${repo_root}/${template_file}"
fi
if [[ ! -f "${template_file}" ]]; then
echo "Missing template file: ${template_file}"
exit 1
fi
if [[ ! -f "${env_file}" ]]; then
echo "Missing env file: ${env_file}"
exit 1
fi
key_exists() {
local key="$1"
grep -qE "^${key}=" "${env_file}"
}
missing_keys=()
missing_lines=()
while IFS= read -r line || [[ -n "${line}" ]]; do
[[ -z "${line}" ]] && continue
[[ "${line}" == \#* ]] && continue
[[ "${line}" =~ ^[[:space:]]*# ]] && continue
[[ "${line}" =~ ^[A-Za-z_][A-Za-z0-9_]*= ]] || continue
key="${line%%=*}"
if ! key_exists "${key}"; then
missing_keys+=("${key}")
missing_lines+=("${line}")
fi
done < "${template_file}"
if [[ "${#missing_keys[@]}" -eq 0 ]]; then
echo "No missing env keys found in ${env_file} (template: ${template_file})."
exit 0
fi
if [[ "${dry_run}" == "1" ]]; then
echo "Missing keys in ${env_file}:"
printf ' %s\n' "${missing_keys[@]}"
echo "Dry run only; no file changes made."
exit 0
fi
if [[ "${backup_mode}" == "1" ]]; then
backup_path="${env_file}.bak.$(date +%Y%m%d%H%M%S)"
cp "${env_file}" "${backup_path}"
echo "Backup created: ${backup_path}"
fi
{
echo
echo "# Added automatically from ${template_file##*/} on $(date -u +%Y-%m-%dT%H:%M:%SZ)"
for line in "${missing_lines[@]}"; do
echo "${line}"
done
} >> "${env_file}"
echo "Added ${#missing_keys[@]} missing env key(s) to ${env_file}:"
printf ' %s\n' "${missing_keys[@]}"