1
0
Fork 0
This commit is contained in:
Gennadiy 2025-02-23 09:04:08 +03:00
parent d55c3916a7
commit 1ddf22e953

118
all_repo_copy2.sh Executable file
View file

@ -0,0 +1,118 @@
#!/bin/bash
echo "Копирование данных из репозиториев на сервер 'hub.mos.ru'."
#-----------------------------------------------------------------------------------------------;
prompt="Подтверждение (да/нет): " && read -erp "$prompt" line && echo -ne "\033[1A$prompt\033[K"
case "${line,,}" in y | yes | д | да) echo "ПОДТВЕРЖДЕНИЕ" ;; *) echo "ОТМЕНА" && exit 0 ;; esac
#-----------------------------------------------------------------------------------------------;
export domain="hub.mos.ru"
export owner="pictures"
export user="golovin"
export token && token="$(cat ".token2")"
export basedir="$PWD"
export bash="$PWD/avatars/bash.jpg"
export picture="$PWD/avatars/picture.jpg"
#-----------------------------------------------------------------------------------------------;
time_ms="$(date '+%s%3N')"
# копирование данных
function repo_copy2 {
repo="${1#*:}" && red="\e[91m" && green="\e[92m" && norm="\e[0m"
# соответствующая строка для вывода сообщений по ходу выполнения функции
num="${1%:*}" && pre="\e[${num}A${repo}: " && aft="\e[K\e[${num}B\r"
cd "$repo" || { printf "${pre}${red}%s${norm}${aft}" "Не найден каталог." && return 1; }
# подготовка значений для параметров
avatar="$picture" && private=""
case "$repo" in
"creativity") description="Фотографии без компьютерных эффектов" ;;
"creativity3") description="Фотографии и картинки со смыслом и с юмором" ;;
"dispatcher") description="Управление репозиториями" && avatar="$bash" ;;
"icons") description="Иконки по темам" ;;
"wallpapers") description="Обои для рабочего стола" && private="\"visibility\": \"internal\"," ;;
"wallpapers2") description="Обои для рабочего стола" ;;
*) return ;; # никаких лишних каталогов
esac
# 1. Создание удалённого репозитория на сервере Gitlab.
# 2. Отправка данных из локального репозитория git на сервер Gitlab.
# 3. Проверка корректности получения данных на сервере Gitlab.
for ((ms1 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms1 < 60000; pass = 0)); do
for ((ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; remote = 0)); do
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Удаление старого репозитория на сервере."
curl -f -X DELETE "https://$domain/api/v4/projects/$owner%2F$repo" \
-H "PRIVATE-TOKEN: $token" \
-H "Content-Type: application/json" -d "{
\"permanently_remove\": \"true\", \"full_path\": \"$owner/$repo\" }" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось удалить репозиторий на сервере."; }
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Создание нового репозитория пользователя."
curl -f -X POST "https://$domain/api/v4/projects" \
-H "PRIVATE-TOKEN: $token" \
-H "Content-Type: application/json" -d "{ $private
\"name\": \"${owner}_${repo}\", \"description\": \"$description\" }" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось создать репозиторий на сервере."; }
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Перемещение репозитория в группу."
curl -f -X PUT "https://$domain/api/v4/projects/$user%2F${owner}_${repo}/transfer?namespace=$owner" \
-H "PRIVATE-TOKEN: $token" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось переместить репозиторий в группу." && continue; }
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Переименование репозитория на сервере."
curl -f -X PUT "https://$domain/api/v4/projects/$owner%2F${owner}_${repo}" \
-H "PRIVATE-TOKEN: $token" \
-H "Content-Type: application/json" -d "{
\"name\": \"$repo\", \"path\": \"$repo\",
\"emails_disabled\": \"true\", \"issues_access_level\": \"disabled\",
\"merge_requests_access_level\": \"disabled\", \"operations_access_level\": \"disabled\",
\"builds_access_level\": \"disabled\", \"request_access_enabled\": \"false\",
\"keep_latest_artifact\": \"false\", \"ci_forward_deployment_enabled\": \"false\",
\"ci_separated_caches\": \"false\", \"ci_allow_fork_pipelines_to_run_in_parent_project\": \"false\",
\"jobs_enabled\": \"false\", \"public_builds\": \"false\", \"packages_enabled\": \"false\",
\"merge_requests_enabled\": \"false\", \"issues_enabled\": \"false\", \"lfs_enabled\": \"false\",
\"snippets_enabled\": \"false\", \"container_registry_enabled\": \"false\",
\"wiki_access_level\": \"disabled\", \"container_registry_access_level\": \"disabled\",
\"security_and_compliance_access_level\": \"disabled\", \"pages_access_level\": \"disabled\",
\"analytics_access_level\": \"disabled\", \"forking_access_level\": \"disabled\",
\"releases_access_level\": \"disabled\", \"requirements_access_level\": \"disabled\",
\"environments_access_level\": \"disabled\", \"feature_flags_access_level\": \"private\",
\"infrastructure_access_level\": \"private\", \"monitor_access_level\": \"disabled\",
\"snippets_access_level\": \"disabled\", \"auto_devops_enabled\": \"false\",
\"shared_runners_enabled\": \"false\", \"group_runners_enabled\": \"false\" }" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось переименовать репозиторий на сервере." && continue; }
[ "$remote" != 0 ] && printf "${pre}%s${aft}" "Добавление аватарки для репозитория"
curl -f -X PUT "https://$domain/api/v4/projects/$owner%2F$repo" \
-H "PRIVATE-TOKEN: $token" \
-F "avatar=@$avatar" &>/dev/null \
|| { printf "${pre}%s${aft}" "Не удалось добавить аватарку для репозитория." && continue; }
# завершение цикла
remote=1 && break
done
case "$remote" in
1) printf "${pre}%s${aft}" "Отправка данных на сервер." ;;
*) printf "${pre}%s${aft}" "Создание на сервере более 10 секунд." && continue ;;
esac
git remote add "$domain" "git@$domain:$owner/$repo.git" &>/dev/null
git push -u "$domain" "master" &>/dev/null
printf "${pre}%s${aft}" "Проверка доступности данных."
for ((ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; testing = 0)); do
curl -f -X GET "https://$domain/api/v4/projects/$owner%2F$repo/repository/commits" \
-H "PRIVATE-TOKEN: $token" 2>/dev/null | grep -v '^\[\]$' >/dev/null \
|| { printf "${pre}%s${aft}" "Ожидание данных на сервере." && continue; }
# завершение цикла
testing=1 && break
done
case "$testing" in
1) pass=1 && break ;;
*) printf "${pre}%s${aft}" "Проверка данных более 10 секунд." ;;
esac
done
case "$pass" in
1) printf "${pre}${green}%s${norm}${aft}" "Выполнено." ;;
*) printf "${pre}${red}%s${norm}${aft}" "Ожидание более 60 секунд." ;;
esac
}
export -f repo_copy2
cd .. # выход из репозитория
# поиск всех каталогов на одном уровне с текущим, кроме папки ".idea", сортировка и добавление порядковых номеров для строк
readarray -t folders < <(find . -mindepth 1 -maxdepth 1 -type d -not -name ".idea" -printf '%P\n' | sort -r | grep -n '\S')
# смещение курсора вниз на соответствующее количество строк
printf '%s\n' "${folders[@]#*:}" | sort
# вывод строк массива и параллельный запуск функции для каждого каталога
printf 'repo_copy2 "%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"