From c3a30da18faad0e40b80f536c53793fcdfb47bae Mon Sep 17 00:00:00 2001 From: goodvin Date: Sun, 22 Mar 2026 22:59:49 +0300 Subject: [PATCH] fix ordered domain --- scripts/generate-configs.sh | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/scripts/generate-configs.sh b/scripts/generate-configs.sh index 449a6bf..d8aece1 100644 --- a/scripts/generate-configs.sh +++ b/scripts/generate-configs.sh @@ -250,15 +250,21 @@ declare -a ORDERED_DOMS=() for dom in $(printf '%s\n' "${!EXPANDED[@]}" | sort -u); do [[ "${SOURCES[$dom]:-}" == "related" ]] && continue + # Базовый домен мог быть добавлен как related другим базовым доменом раньше по + # алфавиту — пропускаем, чтобы не дублировать запись в конфиге. + [[ -n "${WRITTEN[$dom]:-}" ]] && continue # Собираем ещё не записанные связанные домены. # while выполняется в subshell — читает снимок WRITTEN, что корректно исключает # домены, уже занятые предыдущим базовым доменом. + # Базовые домены (SOURCES==base) пропускаем — у них будет своя секция. mapfile -t base_related < <( if [[ -n "${SITE_RELATED[$dom]:-}" ]]; then tr ' ' '\n' <<< "${SITE_RELATED[$dom]}" | grep -v '^$' | sort -u | \ while IFS= read -r rd; do - [[ -z "${WRITTEN[$rd]:-}" ]] && printf '%s\n' "$rd" + [[ -n "${WRITTEN[$rd]:-}" ]] && continue + [[ "${SOURCES[$rd]:-}" == "base" ]] && continue + printf '%s\n' "$rd" done fi ) @@ -281,6 +287,27 @@ done mapfile -t ALL_DOMAINS < <(printf "%s\n" "${!EXPANDED[@]}" | sort -u) +# ============================== +# Проверка уникальности ORDERED_DOMS перед записью +# ============================== +declare -A _seen=() +declare -a _dups=() +for _d in "${ORDERED_DOMS[@]}"; do + if [[ -n "${_seen[$_d]:-}" ]]; then + _dups+=("$_d") + fi + _seen["$_d"]=1 +done +unset _seen + +if [[ ${#_dups[@]} -gt 0 ]]; then + err "BUG: ${#_dups[@]} duplicate domain(s) found in output list — config NOT written" + for _d in "${_dups[@]}"; do + err " duplicate: $_d" + done + exit 5 +fi + # Записываем конфиги одним батчем (не по одной строке через >>) if ! $DRY_RUN; then {