From c008881b5e64c62e6309182aab8a0b886503a052 Mon Sep 17 00:00:00 2001 From: golovin Date: Fri, 31 Jan 2025 09:24:35 +0300 Subject: [PATCH] 2025-01-31 --- DIRECTORY_TREE.md | 4 +- LICENSE.md | 4 +- README.en.md | 4 +- README.md | 4 +- WIKI.md | 13 +-- bash_scripts/README.en.md | 6 +- bash_scripts/README.md | 6 +- bash_scripts/archive_packaging.sh | 8 +- bash_scripts/info_param.sh | 2 +- bash_scripts/info_references.sh | 4 +- bash_scripts/info_tree_license.sh | 35 +++---- bash_scripts/repo_compose.sh | 91 ++++++++++--------- ...epo_gitea.tmpl.sh => repo_forgejo.tmpl.sh} | 29 +++--- bash_scripts/repo_forgejo2.tmpl.sh | 60 ++++++++++++ bash_scripts/repo_gitlab.tmpl.sh | 29 +++--- bash_scripts/repo_orchestrate.sh | 28 +++--- bash_scripts/repo_pages2.sh | 34 +++++++ 17 files changed, 225 insertions(+), 136 deletions(-) rename bash_scripts/{repo_gitea.tmpl.sh => repo_forgejo.tmpl.sh} (90%) create mode 100644 bash_scripts/repo_forgejo2.tmpl.sh create mode 100755 bash_scripts/repo_pages2.sh diff --git a/DIRECTORY_TREE.md b/DIRECTORY_TREE.md index 42cc1dd..f239823 100644 --- a/DIRECTORY_TREE.md +++ b/DIRECTORY_TREE.md @@ -16,10 +16,12 @@ │ ├─ info_references.sh │ ├─ info_tree_license.sh │ ├─ repo_compose.sh -│ ├─ repo_gitea.tmpl.sh +│ ├─ repo_forgejo.tmpl.sh +│ ├─ repo_forgejo2.tmpl.sh │ ├─ repo_gitlab.tmpl.sh │ ├─ repo_local.tmpl.sh │ ├─ repo_orchestrate.sh +│ ├─ repo_pages2.sh │ └─ repo_testing.smpl.sh ├─ pictures │ ├─ README.md diff --git a/LICENSE.md b/LICENSE.md index 3957dce..f493383 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -© Головин Г.Г., 2021-2024 +© Головин Г.Г., 2021-2025 Опубликовано под [Открытой лицензией 1.1](OPEN_LICENSE.txt) @@ -8,7 +8,7 @@ --- -© Golovin G.G., translation from Russian, 2021-2024 +© Golovin G.G., translation from Russian, 2021-2025 Published under the [Open License 1.1](OPEN_LICENSE.txt) diff --git a/README.en.md b/README.en.md index 77ded7e..ab62e8f 100644 --- a/README.en.md +++ b/README.en.md @@ -6,7 +6,7 @@ JavaScript and open license RF instead of MIT — there are a lot of changes and remains the same — nothing has changed. Series of static websites «Pomodori» — not to be bored and not to forget how to write programs, when there is no work. -- [gitea.com](https://gitea.com/pomodoro) — latest version. +- [codeberg.org](https://codeberg.org/pomodoro) — latest version. - [git.org.ru](https://git.org.ru/pomodoro) — history of changes. - [hub.mos.ru](https://hub.mos.ru/pomodoro) — history of changes. @@ -76,4 +76,4 @@ provided free of charge, but without any guarantees, and the author of the progr --- -© Golovin G.G., Code with comments, translation from Russian, 2021-2024 +© Golovin G.G., Code with comments, translation from Russian, 2021-2025 diff --git a/README.md b/README.md index 8a2d499..9f204fb 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ открытая лицензия РФ вместо MIT — изменений много и везде, но суть осталась прежней — ничего не изменилось. Серия статических вёб-сайтов «Помидоры» — чтобы не скучать и чтобы не забыть, как программы писать, когда работы нет. -- [gitea.com](https://gitea.com/pomodoro) — последняя версия. +- [codeberg.org](https://codeberg.org/pomodoro) — последняя версия. - [git.org.ru](https://git.org.ru/pomodoro) — история изменений. - [hub.mos.ru](https://hub.mos.ru/pomodoro) — история изменений. @@ -73,4 +73,4 @@ --- -© Головин Г.Г., Код с комментариями, 2021-2024 +© Головин Г.Г., Код с комментариями, 2021-2025 diff --git a/WIKI.md b/WIKI.md index 47474a7..3ead702 100644 --- a/WIKI.md +++ b/WIKI.md @@ -1,7 +1,5 @@ -
-
-

Оглавление

+Оглавление / Contents
@@ -33,13 +31,6 @@ - [График функции в консоли](https://pomodoro5.mircloud.ru/ru/2023/02/05/function-graph-in-console.html) — 05.02.2023. - [Рисуем простую капчу](https://pomodoro5.mircloud.ru/ru/2023/01/03/drawing-simple-captcha.html) — 03.01.2023. -
- -
- -
-

Contents

-
1. Three-dimensional graphics in JavaScript. @@ -68,5 +59,3 @@ - [Drawing simple captcha](https://pomodoro5.mircloud.ru/en/2023/01/04/drawing-simple-captcha.html) — 04.01.2023.
- -
diff --git a/bash_scripts/README.en.md b/bash_scripts/README.en.md index 93054c7..8c2c03c 100644 --- a/bash_scripts/README.en.md +++ b/bash_scripts/README.en.md @@ -11,10 +11,12 @@ Creating an archive, switching the domain, composing scripts and creating reposi | | [info_references.sh](info_references.sh) | Updating the domain of a remote repository in cross-references in descriptions. | | | [info_tree_license.sh](info_tree_license.sh) | Building a directory tree for each project and copying license files. | | 3 | [**repo_compose.sh**](repo_compose.sh) | Creating scripts from templates with parameters and saving them in the directories of projects. | -| | [repo_gitea.tmpl.sh](repo_gitea.tmpl.sh) | Template of a script without parameters to create a remote repository gitea. | +| | [repo_forgejo.tmpl.sh](repo_forgejo.tmpl.sh) | Template of a script without parameters to create a remote repository forgejo. | +| | [repo_forgejo2.tmpl.sh](repo_forgejo2.tmpl.sh) | Template of a script without parameters to deploy a website on the server codeberg. | | | [repo_gitlab.tmpl.sh](repo_gitlab.tmpl.sh) | Template of a script without parameters to create a remote repository gitlab. | | | [repo_local.tmpl.sh](repo_local.tmpl.sh) | Template of a script without parameters to create a local repository git. | | 4 | [**repo_orchestrate.sh**](repo_orchestrate.sh) | Parallel execution of scripts and creation of repositories for the directories of projects. | +| | [repo_pages2.sh](repo_pages2.sh) | Parallel execution of scripts and deploying the websites on the server codeberg. | | | [repo_testing.smpl.sh](repo_testing.smpl.sh) | Sample of a script for testing the accessibility of pages in the web-interface on the server. | ## Directories of projects @@ -22,7 +24,7 @@ Creating an archive, switching the domain, composing scripts and creating reposi Local project directories are located on the same level. On the server, repositories with websites are moved to a separate group, and the rest of the repositories remain with the user. The directory structure for -[gitea.com](https://gitea.com/golovin), +[codeberg.org](https://codeberg.org/golovin), [git.org.ru](https://git.org.ru/golovin) and [hub.mos.ru](https://hub.mos.ru/golovin). diff --git a/bash_scripts/README.md b/bash_scripts/README.md index 6a88a42..894c23e 100644 --- a/bash_scripts/README.md +++ b/bash_scripts/README.md @@ -11,10 +11,12 @@ | | [info_references.sh](info_references.sh) | Обновление домена удалённого репозитория в перекрёстных ссылках в описаниях. | | | [info_tree_license.sh](info_tree_license.sh) | Построение дерева каталогов для каждого проекта и копирование файлов лицензии. | | 3 | [**repo_compose.sh**](repo_compose.sh) | Создание скриптов из шаблонов с параметрами и сохранение их в каталогах проектов. | -| | [repo_gitea.tmpl.sh](repo_gitea.tmpl.sh) | Шаблон скрипта без параметров для создания удалённого репозитория gitea. | +| | [repo_forgejo.tmpl.sh](repo_forgejo.tmpl.sh) | Шаблон скрипта без параметров для создания удалённого репозитория forgejo. | +| | [repo_forgejo2.tmpl.sh](repo_forgejo2.tmpl.sh) | Шаблон скрипта без параметров для развёртывания вёб-сайта на сервере codeberg. | | | [repo_gitlab.tmpl.sh](repo_gitlab.tmpl.sh) | Шаблон скрипта без параметров для создания удалённого репозитория gitlab. | | | [repo_local.tmpl.sh](repo_local.tmpl.sh) | Шаблон скрипта без параметров для создания локального репозитория git. | | 4 | [**repo_orchestrate.sh**](repo_orchestrate.sh) | Параллельное выполнение скриптов и создание репозиториев для каталогов проектов. | +| | [repo_pages2.sh](repo_pages2.sh) | Параллельное выполнение скриптов и развёртывание вёб-сайтов на сервере codeberg. | | | [repo_testing.smpl.sh](repo_testing.smpl.sh) | Образец скрипта для тестирования доступности страниц в вёб-интерфейсе на сервере. | ## Каталоги проектов @@ -22,7 +24,7 @@ Локальные каталоги проектов расположены на одном уровне. На сервере репозитории с вёб-сайтами переходят в отдельную группу, а остальные репозитории остаются у пользователя. Структура каталогов для -[gitea.com](https://gitea.com/golovin), +[codeberg.org](https://codeberg.org/golovin), [git.org.ru](https://git.org.ru/golovin) и [hub.mos.ru](https://hub.mos.ru/golovin). diff --git a/bash_scripts/archive_packaging.sh b/bash_scripts/archive_packaging.sh index e77d70e..0adce82 100755 --- a/bash_scripts/archive_packaging.sh +++ b/bash_scripts/archive_packaging.sh @@ -2,15 +2,15 @@ echo "Сборка вёб-сайтов, упаковка и копирование архивов для развёртывания." # обработка репозитория вёб-сайта function packaging { - echo "Обработка: pomodoro$1" - cd "./pomodoro$1" || return + echo "Обработка: $1" + cd "./$1" || return ./build.sh >/dev/null ./package.sh >/dev/null - cp -v "pomodoro$1.zip" .. + cp -v "$1.zip" .. } export -f packaging cd ../.. # выход из папки и из репозитория time_ms="$(date '+%s%3N')" # запуск параллельной обработки репозиториев всех вёб-сайтов -printf 'packaging "%s"\0' {1..6} | xargs -n1 -0 -P0 bash -c +printf 'packaging "pomodoro%s"\0' {1..6} | xargs -n1 -0 -P0 bash -c echo "Общее время выполнения: $(($(date '+%s%3N') - time_ms)) мс." diff --git a/bash_scripts/info_param.sh b/bash_scripts/info_param.sh index 3debf68..9489b95 100755 --- a/bash_scripts/info_param.sh +++ b/bash_scripts/info_param.sh @@ -1,5 +1,5 @@ #!/bin/false -#domain="gitea.com" +#domain="codeberg.org" domain="git.org.ru" #domain="hub.mos.ru" echo "Домен удалённого репозитория: $domain" diff --git a/bash_scripts/info_references.sh b/bash_scripts/info_references.sh index c5a2101..6218c9f 100755 --- a/bash_scripts/info_references.sh +++ b/bash_scripts/info_references.sh @@ -4,8 +4,8 @@ domain="git.org.ru" && source info_param.sh # название домена в верхнем регистре DOMAIN="${domain^^}" # шаблоны для подстановки -expr+=("s|gitea\.com|$domain|g") -expr+=("s|GITEA\.COM|$DOMAIN|g") +expr+=("s|codeberg\.org|$domain|g") +expr+=("s|CODEBERG\.ORG|$DOMAIN|g") expr+=("s|git\.org\.ru|$domain|g") expr+=("s|GIT\.ORG\.RU|$DOMAIN|g") expr+=("s|hub\.mos\.ru|$domain|g") diff --git a/bash_scripts/info_tree_license.sh b/bash_scripts/info_tree_license.sh index 385809d..dc08613 100755 --- a/bash_scripts/info_tree_license.sh +++ b/bash_scripts/info_tree_license.sh @@ -1,30 +1,31 @@ #!/bin/bash echo "Построение дерева каталогов для каждого проекта и копирование файлов лицензии." -# отсортированный список файлов и каталогов -function list_directory_contents { - # сначала заглавные буквы, потом строчные, сначала каталоги, потом файлы - eval "LC_COLLATE=C ls -A --group-directories-first $exclusions $1" -} # дерево каталогов со ссылками function directory_tree { # аргументы local path="$1" local head="$2" local tail="$3" - # префикс для текущего элемента - [ "one" == "$4" ] && printf '%s' "/" || printf '\n%s' "$head" - # текущий элемент дерева + # получить содержимое каталога + if [ -d "$path" ]; then + # сначала заглавные буквы, потом строчные, сначала каталоги, потом файлы + ls_sorted="LC_COLLATE=C ls -A --group-directories-first $exclusions $path" + # отсортированный массив файлов и каталогов + local list && readarray -t list < <(eval "$ls_sorted") + # длина массива + local size=${#list[@]} + # пропустить пустой каталог + [ "$size" == 0 ] && return + fi + # префикс текущего элемента, сворачивать синглтоны в одну строку + [ "$4" == "one" ] && printf '%s' "/" || printf '\n%s' "$head" + # текущий элемент дерева — относительная гиперссылка printf '%s' "${path##*/}" # рекурсивные вызовы для подкаталогов if [ -d "$path" ]; then - local list # массив файлов и каталогов - readarray -t list < <(list_directory_contents "$path") - local size=${#list[@]} # длина массива local i # счётчик for ((i = 0; i < size; i++)); do - if [ -z "${list[$i]}" ]; then - continue # пропустить пустой каталог - elif ((size == 1)); then + if ((size == 1)); then directory_tree "$path/${list[$i]}" "$tail" "$tail" "one" elif ((i < size - 1)); then directory_tree "$path/${list[$i]}" "$tail├─ " "$tail│ " @@ -40,8 +41,8 @@ function tree_license { cd "$1" || return # копирование файлов из этого репозитория во все остальные if [ "$1" != "./pomodoro" ]; then - cp -f ../pomodoro/CONTRIBUTING.md . - cp -f ../pomodoro/*LICENSE* . + cp --remove-destination ../pomodoro/CONTRIBUTING.md . + cp --remove-destination ../pomodoro/*LICENSE* . fi # строка исключений для "ls" из списка неотслеживаемых файлов ".gitignore" exclusions="-I'.git' $(sed -E "s|^(.*)$|-I'\1'|" .gitignore | tr '\n' ' ')" @@ -49,7 +50,7 @@ function tree_license { printf '%s\n' "## Дерево каталогов" "" "
" \
     "$(directory_tree . | grep '\S')" "
" >DIRECTORY_TREE.md } -export -f tree_license directory_tree list_directory_contents +export -f tree_license directory_tree cd ../.. # выход из папки и из репозитория time_ms="$(date '+%s%3N')" # запуск параллельной обработки всех репозиториев, расположенных на одном уровне с текущим, кроме папки ".idea" diff --git a/bash_scripts/repo_compose.sh b/bash_scripts/repo_compose.sh index fcd87ce..8d01954 100755 --- a/bash_scripts/repo_compose.sh +++ b/bash_scripts/repo_compose.sh @@ -2,15 +2,16 @@ echo "Создание скриптов из шаблонов с параметрами и сохранение их в каталогах проектов." export domain="git.org.ru" && source info_param.sh export basedir="$PWD" # текущая папка -# создание скриптов из шаблонов с параметрами +# создание скриптов внутри каталога function compose { echo "Обработка: $1" - # добавление исключения в список неотслеживаемых файлов, если оно ещё не добавлено - if [ ! -f "$1/.gitignore" ] || [ "$(grep -cF ".repo_*" "$1/.gitignore")" == 0 ]; then - echo ".repo_*" >>"$1/.gitignore" && echo "Обновлён файл: $1/.gitignore" + cd "$1" || return + # добавление скриптов в список неотслеживаемых файлов, если ещё не добавлено + if [[ ! -f ".gitignore" || "$(grep -cF ".repo_*" ".gitignore")" == 0 ]]; then + echo ".repo_*" >>".gitignore" && echo "Обновлён файл: $1/.gitignore" fi - # значения для параметров - owner="golovin" && repo="$1" + # подготовка значений для параметров + user="golovin" && owner="$user" && repo="$1" case "$1" in *[1-6]) owner="pomodoro" && repo="${1//$owner/}" ;;& *1) description="Трёхмерная графика на JavaScript" ;;& @@ -20,63 +21,67 @@ function compose { *5) description="Рисуем картинки текстом" ;;& *6) description="Пустой" ;;& *[1-6]) description+=" — https://$owner$repo.mircloud.ru" ;; - pomodoro) description="Описание и оглавление" ;; - color-tomato*) description="Тема оформления / Цветной помидор" ;; - older-tomato*) description="Тема оформления / Старый помидор" ;; - *) return ;; # шесть помидорных вёб-сайтов и три репозитория пользователя + pomodoro) description="Описание и управление" ;; + color*) description="Тема оформления / Цветной помидор" ;; + older*) description="Тема оформления / Старый помидор" ;; + *) return ;; # шесть помидорных вёб-сайтов и три сопутствующих проекта esac - wiki="" # оглавление по страницам вёб-сайта - if [ -f "$1/WIKI.md" ]; then - if [ "$domain" == "hub.mos.ru" ]; then - wiki="$(uni2ascii -aU -qpsn "$1/WIKI.md")" - else - wiki="$(basenc "$1/WIKI.md" --base64 -w0)" - fi - fi - file="DIRECTORY_TREE.md" # тестирование вёб-интерфейса if [ "$domain" == "hub.mos.ru" ]; then - folder="blob" && wiki_home="-/wikis/home" + [ -f "WIKI.md" ] && wiki="$(uni2ascii -aU -qpsn "WIKI.md")" + model="gitlab" && folder="blob" && wiki_home="-/wikis/home" else - folder="src/branch" && wiki_home="wiki" + [ -f "WIKI.md" ] && wiki="$(basenc "WIKI.md" --base64 -w0)" + model="forgejo" && folder="src/branch" && wiki_home="wiki" fi - # одинаковая шапка "shebang" для всех трёх скриптов - echo "#!/bin/bash" | tee "$1/.repo_remote.sh" "$1/.repo_local.sh" >"$1/.repo_testing.sh" + if [ "$domain" == "codeberg.org" ]; then + if [ -f "WIKI.md" ]; then + wiki="$(sed 's|mircloud\.ru|codeberg.page|g' WIKI.md | basenc --base64 -w0)" + fi + [[ "$1" =~ [1-6] ]] && description="${description//mircloud.ru/codeberg.page}" + fi + file="DIRECTORY_TREE.md" + # создание трёх скриптов в каталоге проекта с одинаковой шапкой для всех + echo "#!/bin/bash" | tee ".repo_remote.sh" ".repo_local.sh" >".repo_testing.sh" + chmod +x ".repo_remote.sh" ".repo_local.sh" ".repo_testing.sh" # параметры для удалённого репозитория param_remote+=("domain='$domain'") param_remote+=("owner='$owner'") - param_remote+=("user='golovin'") + param_remote+=("user='$user'") param_remote+=("repo='$repo'") param_remote+=("description='$description'") param_remote+=("wiki='$wiki'") - if [ "$domain" == "hub.mos.ru" ]; then - param_remote+=("token='$(cat "$basedir/.token_gitlab")'") - template_remote="repo_gitlab.tmpl.sh" - else - param_remote+=("token='$(cat "$basedir/.token_gitea")'") - template_remote="repo_gitea.tmpl.sh" - fi + param_remote+=("token='$(head -n+1 "$basedir/.token_$model")'") # скрипт для создания удалённого репозитория - printf '%s\n' "${param_remote[@]}" >>"$1/.repo_remote.sh" - tail -n+2 "$basedir/$template_remote" >>"$1/.repo_remote.sh" - chmod +x "$1/.repo_remote.sh" + printf '%s\n' "${param_remote[@]}" >>".repo_remote.sh" + tail -n+2 "$basedir/repo_$model.tmpl.sh" >>".repo_remote.sh" # параметры для локального репозитория param_local+=("domain='$domain'") param_local+=("owner='$owner'") param_local+=("repo='$repo'") param_local+=("dir='$1'") # скрипт для создания локального репозитория - printf '%s\n' "${param_local[@]}" >>"$1/.repo_local.sh" - tail -n+2 "$basedir/repo_local.tmpl.sh" >>"$1/.repo_local.sh" - chmod +x "$1/.repo_local.sh" + printf '%s\n' "${param_local[@]}" >>".repo_local.sh" + tail -n+2 "$basedir/repo_local.tmpl.sh" >>".repo_local.sh" # параметры для тестирования вёб-интерфейса param_testing+=("'https://$domain/$owner/$repo/$folder/master/$file' '$file'") - if [ "$wiki" ]; then - param_testing+=("'https://$domain/$owner/$repo/$wiki_home' 'Home'") - fi + [ "$wiki" ] && param_testing+=("'https://$domain/$owner/$repo/$wiki_home' 'Home'") # скрипт для тестирования вёб-интерфейса - printf 'pages+=("%s")\n' "${param_testing[@]}" >>"$1/.repo_testing.sh" - tail -n+21 "$basedir/repo_testing.smpl.sh" >>"$1/.repo_testing.sh" - chmod +x "$1/.repo_testing.sh" + printf 'pages+=("%s")\n' "${param_testing[@]}" >>".repo_testing.sh" + tail -n+21 "$basedir/repo_testing.smpl.sh" >>".repo_testing.sh" + if [[ "$domain" == "codeberg.org" && "$1" =~ [1-6] ]]; then + # параметры для развёртывания вёб-сайта + param_pages+=("#!/bin/bash") + param_pages+=("domain='$domain'") + param_pages+=("owner='$owner$repo'") + param_pages+=("user='$user'") + param_pages+=("repo='pages'") + param_pages+=("description='$description'") + param_pages+=("token='$(head -n+1 "$basedir/.token_forgejo")'") + # скрипт для развёртывания вёб-сайта + printf '%s\n' "${param_pages[@]}" >".repo_pages2.sh" + tail -n+2 "$basedir/repo_forgejo2.tmpl.sh" >>".repo_pages2.sh" + chmod +x ".repo_pages2.sh" + fi } export -f compose cd ../.. # выход из папки и из репозитория diff --git a/bash_scripts/repo_gitea.tmpl.sh b/bash_scripts/repo_forgejo.tmpl.sh similarity index 90% rename from bash_scripts/repo_gitea.tmpl.sh rename to bash_scripts/repo_forgejo.tmpl.sh index d3e7796..4ed3618 100644 --- a/bash_scripts/repo_gitea.tmpl.sh +++ b/bash_scripts/repo_forgejo.tmpl.sh @@ -6,13 +6,13 @@ if [ -z "$1" ]; then echo "Создание удалённого репозитория для текущего каталога." fi time_ms="$(date '+%s%3N')" -if [ -z "$1" ] || [ "$1" == "delete" ]; then +if [[ -z "$1" || "$1" == "delete" ]]; then echo "Удаление старого репозитория." curl -i -X DELETE "https://$domain/api/v1/repos/$owner/$repo" \ -H "Authorization: token $token" \ -H "Accept: application/json" fi -if [ -z "$1" ] || [ "$1" == "create" ]; then +if [[ -z "$1" || "$1" == "create" ]]; then echo "Создание нового репозитория пользователя." curl -i -X POST "https://$domain/api/v1/user/repos" \ -H "Authorization: token $token" \ @@ -26,17 +26,8 @@ if [ -z "$1" ] || [ "$1" == "create" ]; then -H "Content-Type: application/json" -d "{ \"new_owner\": \"$owner\" }" fi fi -if [ -z "$1" ] || [ "$1" == "options" ]; then - if [ "$wiki" ]; then - echo "Добавление страницы wiki в репозиторий." - curl -i -X POST "https://$domain/api/v1/repos/$owner/$repo/wiki/new" \ - -H "Authorization: token $token" \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" -d "{ \"content_base64\": \"$wiki\", \"title\": \"Home\" }" - has_wiki=true - else - has_wiki=false - fi +if [[ -z "$1" || "$1" == "options" ]]; then + [ "$wiki" ] && has_wiki=true || has_wiki=false echo "Изменение свойств репозитория / отключение ненужного." curl -i -X PATCH "https://$domain/api/v1/repos/$owner/$repo" \ -H "Authorization: token $token" \ @@ -46,11 +37,15 @@ if [ -z "$1" ] || [ "$1" == "options" ]; then \"has_releases\": false, \"has_actions\": false, \"has_packages\": false, \"has_pull_requests\": false, \"has_wiki\": $has_wiki }" - echo "Добавление аватарки для репозитория." - picture="$repo" - if [ "$user" != "$owner" ]; then - picture="website" + if [ "$wiki" ]; then + echo "Добавление страницы wiki в репозиторий." + curl -i -X POST "https://$domain/api/v1/repos/$owner/$repo/wiki/new" \ + -H "Authorization: token $token" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" -d "{ \"content_base64\": \"$wiki\", \"title\": \"Home\" }" fi + echo "Добавление аватарки для репозитория." + [ "$user" != "$owner" ] && picture="website" || picture="$repo" avatar=$(basenc "../pomodoro/pictures/$picture.jpg" --base64 -w0) curl -i -X POST "https://$domain/api/v1/repos/$owner/$repo/avatar" \ -H "Authorization: token $token" \ diff --git a/bash_scripts/repo_forgejo2.tmpl.sh b/bash_scripts/repo_forgejo2.tmpl.sh new file mode 100644 index 0000000..78f09fc --- /dev/null +++ b/bash_scripts/repo_forgejo2.tmpl.sh @@ -0,0 +1,60 @@ +#!/bin/false +if [[ -z "$domain" || -z "$token" || -z "$owner" || -z "$repo" || -z "$description" || -z "$user" ]]; then + echo "Не указаны обязательные параметры." && exit 1 +elif [ "$domain" != "codeberg.org" ]; then + echo "Некорректно указан сервер." && exit 1 +fi +cd _site || exit 1 +if [ -z "$1" ]; then + echo "Развёртывание копии вёб-сайта на сервере 'codeberg.page'." +fi +time_ms="$(date '+%s%3N')" +if [[ -z "$1" || "$1" == "remote" ]]; then + echo "Удаление старого репозитория на сервере." + curl -i -X DELETE "https://$domain/api/v1/repos/$owner/$repo" \ + -H "Authorization: token $token" \ + -H "Accept: application/json" + echo "Создание нового репозитория в группе на сервере." + curl -i -X POST "https://$domain/api/v1/orgs/$owner/repos" \ + -H "Authorization: token $token" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" -d "{ + \"name\": \"$repo\", \"description\": \"$description\" }" + echo "Изменение свойств репозитория / отключение ненужного." + curl -i -X PATCH "https://$domain/api/v1/repos/$owner/$repo" \ + -H "Authorization: token $token" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" -d "{ + \"has_projects\": false, \"has_issues\": false, + \"has_releases\": false, \"has_actions\": false, + \"has_packages\": false, \"has_pull_requests\": false, + \"has_wiki\": false }" + echo "Добавление аватарки для репозитория." + avatar=$(basenc "../../pomodoro/pictures/website.jpg" --base64 -w0) + curl -i -X POST "https://$domain/api/v1/repos/$owner/$repo/avatar" \ + -H "Authorization: token $token" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" -d "{ \"image\": \"$avatar\" }" +fi +if [[ -z "$1" || "$1" == "local" ]]; then + echo "Пересоздание локального репозитория и отправка данных на сервер." + rm -rf ".git" # удаление старого репозитория + git init -b "master" + git remote add "$domain" "git@$domain:$owner/$repo.git" + git add --all + git commit -m "$(date '+%Y-%m-%d')" + git push -u "$domain" "master" +fi +if [ -z "$1" ]; then + echo "Ожидание 3 секунды." && sleep 3 +fi +if [[ -z "$1" || "$1" == "testing" ]]; then + echo "Получение списка коммитов для удалённого репозитория." + param="stat=false&verification=false&files=false" + curl -i -X GET "https://$domain/api/v1/repos/$owner/$repo/commits?$param" \ + -H "Authorization: token $token" \ + -H "Accept: application/json" +fi +if [ -z "$1" ]; then + echo "Общее время выполнения: $(($(date '+%s%3N') - time_ms)) мс." +fi diff --git a/bash_scripts/repo_gitlab.tmpl.sh b/bash_scripts/repo_gitlab.tmpl.sh index 2e0520e..24ea95f 100644 --- a/bash_scripts/repo_gitlab.tmpl.sh +++ b/bash_scripts/repo_gitlab.tmpl.sh @@ -6,14 +6,14 @@ if [ -z "$1" ]; then echo "Создание удалённого репозитория для текущего каталога." fi time_ms="$(date '+%s%3N')" -if [ -z "$1" ] || [ "$1" == "delete" ]; then +if [[ -z "$1" || "$1" == "delete" ]]; then echo "Удаление старого репозитория." curl -i -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\" }" echo fi -if [ -z "$1" ] || [ "$1" == "create" ]; then +if [[ -z "$1" || "$1" == "create" ]]; then echo "Создание нового репозитория пользователя." curl -i -X POST "https://$domain/api/v4/projects" \ -H "PRIVATE-TOKEN: $token" \ @@ -26,17 +26,8 @@ if [ -z "$1" ] || [ "$1" == "create" ]; then echo fi fi -if [ -z "$1" ] || [ "$1" == "options" ]; then - if [ "$wiki" ]; then - echo "Добавление страницы wiki в репозиторий." - curl -i -X POST "https://$domain/api/v4/projects/$owner%2F$repo/wikis" \ - -H "PRIVATE-TOKEN: $token" \ - -H "Content-Type: application/json" -d "{ \"content\": \"$wiki\", \"title\": \"Home\" }" - echo - has_wiki="enabled" - else - has_wiki="disabled" - fi +if [[ -z "$1" || "$1" == "options" ]]; then + [ "$wiki" ] && has_wiki="enabled" || has_wiki="disabled" echo "Изменение свойств репозитория / отключение ненужного." curl -i -X PUT "https://$domain/api/v4/projects/$owner%2F$repo" \ -H "PRIVATE-TOKEN: $token" \ @@ -58,11 +49,15 @@ if [ -z "$1" ] || [ "$1" == "options" ]; then \"snippets_access_level\": \"disabled\", \"auto_devops_enabled\": \"false\", \"shared_runners_enabled\": \"false\", \"group_runners_enabled\": \"false\" }" echo - echo "Добавление аватарки для репозитория." - picture="$repo" - if [ "$user" != "$owner" ]; then - picture="website" + if [ "$wiki" ]; then + echo "Добавление страницы wiki в репозиторий." + curl -i -X POST "https://$domain/api/v4/projects/$owner%2F$repo/wikis" \ + -H "PRIVATE-TOKEN: $token" \ + -H "Content-Type: application/json" -d "{ \"content\": \"$wiki\", \"title\": \"Home\" }" + echo fi + echo "Добавление аватарки для репозитория." + [ "$user" != "$owner" ] && picture="website" || picture="$repo" curl -i -X PUT "https://$domain/api/v4/projects/$owner%2F$repo" \ -H "PRIVATE-TOKEN: $token" \ -F "avatar=@../pomodoro/pictures/$picture.jpg" diff --git a/bash_scripts/repo_orchestrate.sh b/bash_scripts/repo_orchestrate.sh index 83affbd..20ce02c 100755 --- a/bash_scripts/repo_orchestrate.sh +++ b/bash_scripts/repo_orchestrate.sh @@ -2,31 +2,35 @@ echo "Параллельное выполнение скриптов и создание репозиториев для каталогов проектов." # выполнение скриптов внутри каталога function orchestrate { + echo "Обработка: $1" cd "$1" || return - while true; do - while true; do + while (($(date '+%s%3N') - time_ms < 120000)); do + while (($(date '+%s%3N') - time_ms < 120000)); do # 1 Удаление репозитория на сервере - ./.repo_remote.sh "delete" >.repo_remote.log + ./.repo_remote.sh "delete" 2>/dev/null >.repo_remote.log # 2 Создание репозитория на сервере - ./.repo_remote.sh "create" >>.repo_remote.log + ./.repo_remote.sh "create" 2>/dev/null >>.repo_remote.log # 3 Проверка корректности ответа от сервера при создании репозитория case "$(tail -n+10 .repo_remote.log | grep -cE '^HTTP/[1,2].{,2}? [4,5]')" in - 0) break ;; *) echo "Ошибка 400-500. Невозможно подключение к серверу: $1" ;; + 0) break ;; *) echo "Ошибка 400-500 при подключении к серверу: $1" ;; esac done # 4 Создание локального репозитория и отправка данных на сервер - ./.repo_local.sh >.repo_local.log + ./.repo_local.sh 2>/dev/null >.repo_local.log # 5 Изменение настроек репозитория на сервере, отключение ненужного - ./.repo_remote.sh "options" >>.repo_remote.log - # 6 Проверка доступности вёб-интерфейса на сервере - case "$(./.repo_testing.sh | grep -cF '[91m')" in - 0) break ;; *) echo "Ошибка доступности вёб-интерфейса: $1" ;; - esac + ./.repo_remote.sh "options" 2>/dev/null >>.repo_remote.log + # 6 Проверка доступности данных в вёб-интерфейсе на сервере + for ((tms = "$(date '+%s%3N')"; $(date '+%s%3N') - tms < 3000; )); do + case "$(./.repo_testing.sh | grep -cF '[91m')" in + 0) pass=true && break 2 ;; *) echo "Ожидание данных на сервере: $1" ;; + esac + done done + [ "$pass" != true ] && echo "Ожидание более 2 минут: $1" } export -f orchestrate cd ../.. # выход из папки и из репозитория -time_ms="$(date '+%s%3N')" +export time_ms && time_ms="$(date '+%s%3N')" # запуск параллельной обработки всех каталогов проектов, расположенных на одном уровне с текущим find . -mindepth 1 -maxdepth 1 -type d -printf 'orchestrate "%p"\0' | xargs -n1 -0 -P0 bash -c # замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды diff --git a/bash_scripts/repo_pages2.sh b/bash_scripts/repo_pages2.sh new file mode 100755 index 0000000..960241a --- /dev/null +++ b/bash_scripts/repo_pages2.sh @@ -0,0 +1,34 @@ +#!/bin/bash +echo "Параллельное выполнение скриптов и развёртывание вёб-сайтов на сервере codeberg." +# обработка репозитория вёб-сайта +function pages2 { + echo "Обработка: $1" + cd "./$1" || return + for ((time_ms = "$(date '+%s%3N')"; $(date '+%s%3N') - time_ms < 10000; )); do + # 1 Создание удалённого репозитория + ./.repo_pages2.sh "remote" 2>/dev/null >.repo_pages2.log + # 2 Проверка корректности ответов от сервера при создании репозитория + case "$(tail -n+10 .repo_pages2.log | grep -cE '^HTTP/[1,2].{,2}? [4,5]')" in + 0) remote=true && break ;; *) echo "Ошибка 400-500 при подключении к серверу: $1" ;; + esac + done + if [ "$remote" != true ]; then echo "Ожидание более 10 секунд: $1" && return; else + # 3 Создание локального репозитория и отправка данных на сервер + ./.repo_pages2.sh "local" 2>/dev/null >>.repo_pages2.log + fi + for ((time_ms = "$(date '+%s%3N')"; $(date '+%s%3N') - time_ms < 10000; )); do + # 4 Проверка корректности получения данных на сервере + case "$(./.repo_pages2.sh "testing" 2>/dev/null | grep -cE '^HTTP/[1,2].{,2}? [4,5]')" in + 0) testing=true && break ;; *) echo "Ожидание данных на сервере: $1" && sleep 1 ;; + esac + done + if [ "$testing" != true ]; then echo "Ожидание более 10 секунд: $1"; fi +} +export -f pages2 +cd ../.. # выход из папки и из репозитория +time_ms="$(date '+%s%3N')" +# запуск параллельной обработки репозиториев всех вёб-сайтов +printf 'pages2 "pomodoro%s"\0' {1..6} | 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"