fix ordered domain #11

Merged
goodvin merged 1 commit from refactor into main 2026-03-22 23:13:09 +03:00
Showing only changes of commit c3a30da18f - Show all commits

View file

@ -250,15 +250,21 @@ declare -a ORDERED_DOMS=()
for dom in $(printf '%s\n' "${!EXPANDED[@]}" | sort -u); do for dom in $(printf '%s\n' "${!EXPANDED[@]}" | sort -u); do
[[ "${SOURCES[$dom]:-}" == "related" ]] && continue [[ "${SOURCES[$dom]:-}" == "related" ]] && continue
# Базовый домен мог быть добавлен как related другим базовым доменом раньше по
# алфавиту — пропускаем, чтобы не дублировать запись в конфиге.
[[ -n "${WRITTEN[$dom]:-}" ]] && continue
# Собираем ещё не записанные связанные домены. # Собираем ещё не записанные связанные домены.
# while выполняется в subshell — читает снимок WRITTEN, что корректно исключает # while выполняется в subshell — читает снимок WRITTEN, что корректно исключает
# домены, уже занятые предыдущим базовым доменом. # домены, уже занятые предыдущим базовым доменом.
# Базовые домены (SOURCES==base) пропускаем — у них будет своя секция.
mapfile -t base_related < <( mapfile -t base_related < <(
if [[ -n "${SITE_RELATED[$dom]:-}" ]]; then if [[ -n "${SITE_RELATED[$dom]:-}" ]]; then
tr ' ' '\n' <<< "${SITE_RELATED[$dom]}" | grep -v '^$' | sort -u | \ tr ' ' '\n' <<< "${SITE_RELATED[$dom]}" | grep -v '^$' | sort -u | \
while IFS= read -r rd; do 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 done
fi fi
) )
@ -281,6 +287,27 @@ done
mapfile -t ALL_DOMAINS < <(printf "%s\n" "${!EXPANDED[@]}" | sort -u) 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 if ! $DRY_RUN; then
{ {