diff --git a/scripts/preview-mode.sh b/scripts/preview-mode.sh index 3b60e1e..d03b0a6 100644 --- a/scripts/preview-mode.sh +++ b/scripts/preview-mode.sh @@ -21,25 +21,31 @@ cd "$(dirname "$0")/.." ENV_FILE=.env [ -f "$ENV_FILE" ] || { echo "فایل .env پیدا نشد — اول bash scripts/gen-env.sh" >&2; exit 1; } -# مقدار فعلی یک کلید در .env (یا خالی) +# مقدار فعلی یک کلید در .env (یا خالی) — کوتیشن تک‌نویسه‌ای هم برداشته می‌شود env_get() { local key="$1" - sed -n "s/^${key}=//p" "$ENV_FILE" | tail -1 + sed -n "s/^${key}=//p" "$ENV_FILE" | tail -1 | sed -e "s/^'//" -e "s/'\$//" } # تنظیم/جایگزینی یک کلید در .env (بدون آسیب به بقیه خطوط) +# نکتهٔ مهم: docker compose مقادیر .env را خودش تفسیر می‌کند؛ هش htpasswd شامل +# $apr1$... است و اگر کوتیشن نخورد، $apr1 و بخش‌های بعدی به‌عنوان متغیر خالی +# جایگزین می‌شوند و Basic Auth هرگز رمز را نمی‌پذیرد. پس هر مقدار دارای $ را +# تک‌کوتیشن می‌گذاریم (compose کوتیشن را برمی‌دارد و مقدار را عیناً می‌خواند). env_set() { local key="$1" value="$2" if grep -q "^${key}=" "$ENV_FILE"; then - # جداکننده | تا کاراکترهای ویژه مقدار (مثل / و $) مشکلی نسازند python3 - "$ENV_FILE" "$key" "$value" <<'PY' import io, sys path, key, value = sys.argv[1], sys.argv[2], sys.argv[3] +if "$" in value: + value = "'" + value + "'" lines = io.open(path, encoding="utf-8").read().split("\n") out = [f"{key}={value}" if line.startswith(f"{key}=") else line for line in lines] io.open(path, "w", encoding="utf-8", newline="\n").write("\n".join(out)) PY else + if [ "${value#*\$}" != "$value" ]; then value="'$value'"; fi printf '\n%s=%s\n' "$key" "$value" >> "$ENV_FILE" fi }