#!/bin/bash echo "Публикация исходного кода из каталогов проектов." # выполнение скриптов внутри каталога function orchestrate { dir="${1#*:}" && red="\e[91m" && green="\e[92m" && yellow="\e[93m" && norm="\e[0m" # соответствующая строка для вывода сообщений по ходу выполнения функции num="${1%:*}" && pre="\e[${num}A${dir} " && aft="\e[K\e[${num}B\r" cd "${dir// /}" || { printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Не найден каталог." && return 1; } for ((ms1 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms1 < 600000; pass = 0)); do # 1 Создание удалённого репозитория и контроль корректности ответов от сервера for ((ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 20000; remote = 0)); do [ "$pass" != 0 ] && printf "${pre}%s %s${aft}" "[#••••••••]" "Удаление старого репозитория на сервере." ./.repo_publish.sh "delete" &>/dev/null printf "${pre}%s %s${aft}" "[##•••••••]" "Создание нового репозитория пользователя." ./.repo_publish.sh "create" &>/dev/null printf "${pre}%s %s${aft}" "[###••••••]" "Перемещение репозитория в группу." ./.repo_publish.sh "transfer" &>/dev/null || continue printf "${pre}%s %s${aft}" "[####•••••]" "Изменение свойств репозитория." ./.repo_publish.sh "patch" &>/dev/null || continue printf "${pre}%s %s${aft}" "[#####••••]" "Добавление страницы вики." ./.repo_publish.sh "wiki" &>/dev/null || continue printf "${pre}%s %s${aft}" "[######•••]" "Добавление аватарки для репозитория." ./.repo_publish.sh "avatar" &>/dev/null || continue remote=1 && break # завершение цикла done case "$remote" in 1) printf "${pre}%s %s${aft}" "[#######••]" "Создание локального репозитория." ;; *) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Создание на сервере более 20 секунд." && continue ;; esac # 2 Создание локального репозитория и отправка данных на сервер ./.repo_publish.sh "local" &>/dev/null printf "${pre}%s %s${aft}" "[########•]" "Отправка локальных данных на сервер." ./.repo_publish.sh "push" &>/dev/null # 3 Проверка корректности получения данных на сервере printf "${pre}%s %s${aft}" "[#########]" "Проверка получения данных на сервере." for ((lap = 1, ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 20000; lap++, testing = 0)); do track=9 && shift="$(tr -d '-' <<<$((lap / track % 2 * track - lap % track)))" progressbar="$(printf "[%$((track - shift))s" | sed 's| |•|g')$(printf "%${shift}s]" | sed 's| |#|g')" ./.repo_publish.sh "testing" &>/dev/null \ || { printf "${pre}${yellow}%s${norm} %s${aft}" "$progressbar" "Ожидание данных на сервере." && continue; } testing=1 && break # завершение цикла done case "$testing" in 1) pass=1 && break ;; *) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Проверка данных более 20 секунд." ;; esac done case "$pass" in 1) printf "${pre}${green}%s${norm} %s${aft}" "[#########]" "Выполнено." ;; *) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Ожидание более 10 минут." ;; esac } export -f orchestrate cd ../.. # выход из папки и из репозитория time_ms="$(date '+%s%3N')" # поиск всех каталогов на одном уровне с текущим, кроме папки ".idea", # сортировка списка, выравнивание по левому краю, добавление номеров строк readarray -t folders < <(find . -mindepth 1 -maxdepth 1 -type d -printf '%P;\n' \ | grep -v '.idea' | sort -r | column -t -s ';' -o '' | grep -n '\S') # смещение курсора вниз на соответствующее количество строк printf '%s\n' "${folders[@]#*:}" | sort # вывод строк массива и параллельный запуск функции для каждого каталога printf 'orchestrate "%s"\0' "${folders[@]}" | xargs -n1 -0 -P0 bash -c # замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды tms="$(($(date '+%s%3N') - time_ms))" && min="$((tms / 1000 / 60))" && sec="$((tms / 1000 % 60))" ms="$((tms % 1000))" && printf 'Общее время выполнения: %02d:%02d.%03d мс.\n' "$min" "$sec" "$ms"