2025-03-31
|
@ -1,44 +1,47 @@
|
|||
## Дерево каталогов
|
||||
|
||||
<pre>
|
||||
<a href='.'>.</a>
|
||||
├─ <a href='avatars'>avatars</a>
|
||||
│ ├─ <a href='avatars/README.md'>README.md</a>
|
||||
│ ├─ <a href='avatars/color-tomato-theme.jpg'>color-tomato-theme.jpg</a>
|
||||
│ ├─ <a href='avatars/dispatcher.jpg'>dispatcher.jpg</a>
|
||||
│ ├─ <a href='avatars/older-tomato-theme.jpg'>older-tomato-theme.jpg</a>
|
||||
│ ├─ <a href='avatars/pomodoro.jpg'>pomodoro.jpg</a>
|
||||
│ └─ <a href='avatars/website.jpg'>website.jpg</a>
|
||||
├─ <a href='bash_scripts'>bash_scripts</a>
|
||||
│ ├─ <a href='bash_scripts/archive_backup.sh'>archive_backup.sh</a>
|
||||
│ ├─ <a href='bash_scripts/archive_cleanup.sh'>archive_cleanup.sh</a>
|
||||
│ ├─ <a href='bash_scripts/archive_packaging.sh'>archive_packaging.sh</a>
|
||||
│ ├─ <a href='bash_scripts/info_param.sh'>info_param.sh</a>
|
||||
│ ├─ <a href='bash_scripts/info_references.sh'>info_references.sh</a>
|
||||
│ ├─ <a href='bash_scripts/info_tree_license.sh'>info_tree_license.sh</a>
|
||||
│ ├─ <a href='bash_scripts/repo_compose.sh'>repo_compose.sh</a>
|
||||
│ ├─ <a href='bash_scripts/repo_forgejo.tmpl.sh'>repo_forgejo.tmpl.sh</a>
|
||||
│ ├─ <a href='bash_scripts/repo_forgejo2.tmpl.sh'>repo_forgejo2.tmpl.sh</a>
|
||||
│ ├─ <a href='bash_scripts/repo_gitlab.tmpl.sh'>repo_gitlab.tmpl.sh</a>
|
||||
│ ├─ <a href='bash_scripts/repo_local.tmpl.sh'>repo_local.tmpl.sh</a>
|
||||
│ ├─ <a href='bash_scripts/repo_testing.smpl.sh'>repo_testing.smpl.sh</a>
|
||||
│ ├─ <a href='bash_scripts/suite_orchestrate.sh'>suite_orchestrate.sh</a>
|
||||
│ └─ <a href='bash_scripts/suite_pages2.sh'>suite_pages2.sh</a>
|
||||
├─ <a href='print_screen'>print_screen</a>
|
||||
│ ├─ <a href='print_screen/LISTVIEW.md'>LISTVIEW.md</a>
|
||||
│ ├─ <a href='print_screen/archive_cleanup.png'>archive_cleanup.png</a>
|
||||
│ ├─ <a href='print_screen/archive_packaging.gif'>archive_packaging.gif</a>
|
||||
│ ├─ <a href='print_screen/info_references.png'>info_references.png</a>
|
||||
│ ├─ <a href='print_screen/info_tree_license.png'>info_tree_license.png</a>
|
||||
│ ├─ <a href='print_screen/repo_compose.png'>repo_compose.png</a>
|
||||
│ ├─ <a href='print_screen/repo_testing.smpl.png'>repo_testing.smpl.png</a>
|
||||
│ ├─ <a href='print_screen/suite_orchestrate.gif'>suite_orchestrate.gif</a>
|
||||
│ └─ <a href='print_screen/suite_pages2.gif'>suite_pages2.gif</a>
|
||||
├─ <a href='.gitignore'>.gitignore</a>
|
||||
├─ <a href='CONTRIBUTING.md'>CONTRIBUTING.md</a>
|
||||
├─ <a href='DIRECTORY_TREE.md'>DIRECTORY_TREE.md</a>
|
||||
├─ <a href='LICENSE.md'>LICENSE.md</a>
|
||||
├─ <a href='OPEN_LICENSE.txt'>OPEN_LICENSE.txt</a>
|
||||
├─ <a href='README.en.md'>README.en.md</a>
|
||||
└─ <a href='README.md'>README.md</a>
|
||||
<a href=".">.</a>
|
||||
├─ <a href="avatars">avatars</a>
|
||||
│ ├─ <a href="avatars/LISTVIEW.md">LISTVIEW.md</a><small> 551</small>
|
||||
│ ├─ <a href="avatars/color-tomato-theme.jpg">color-tomato-theme.jpg</a><small> 4,9K</small>
|
||||
│ ├─ <a href="avatars/dispatcher.jpg">dispatcher.jpg</a><small> 3,7K</small>
|
||||
│ ├─ <a href="avatars/older-tomato-theme.jpg">older-tomato-theme.jpg</a><small> 4,2K</small>
|
||||
│ ├─ <a href="avatars/pomodoro.jpg">pomodoro.jpg</a><small> 3,3K</small>
|
||||
│ └─ <a href="avatars/website.jpg">website.jpg</a><small> 3,9K</small>
|
||||
├─ <a href="bash_scripts">bash_scripts</a>
|
||||
│ ├─ <a href="bash_scripts/archive_backup.sh">archive_backup.sh</a><small> 1,4K</small>
|
||||
│ ├─ <a href="bash_scripts/archive_cleanup.sh">archive_cleanup.sh</a><small> 916</small>
|
||||
│ ├─ <a href="bash_scripts/archive_packaging.sh">archive_packaging.sh</a><small> 2,1K</small>
|
||||
│ ├─ <a href="bash_scripts/info_param.sh">info_param.sh</a><small> 148</small>
|
||||
│ ├─ <a href="bash_scripts/info_references.sh">info_references.sh</a><small> 1,2K</small>
|
||||
│ ├─ <a href="bash_scripts/info_tree_license.sh">info_tree_license.sh</a><small> 3,3K</small>
|
||||
│ ├─ <a href="bash_scripts/repo_compose.sh">repo_compose.sh</a><small> 5,5K</small>
|
||||
│ ├─ <a href="bash_scripts/repo_forgejo.tmpl.sh">repo_forgejo.tmpl.sh</a><small> 4,0K</small>
|
||||
│ ├─ <a href="bash_scripts/repo_forgejo2.tmpl.sh">repo_forgejo2.tmpl.sh</a><small> 4,0K</small>
|
||||
│ ├─ <a href="bash_scripts/repo_gitlab.tmpl.sh">repo_gitlab.tmpl.sh</a><small> 4,2K</small>
|
||||
│ ├─ <a href="bash_scripts/repo_local.tmpl.sh">repo_local.tmpl.sh</a><small> 1,7K</small>
|
||||
│ ├─ <a href="bash_scripts/suite_orchestrate.sh">suite_orchestrate.sh</a><small> 5,1K</small>
|
||||
│ ├─ <a href="bash_scripts/suite_pages2.sh">suite_pages2.sh</a><small> 4,3K</small>
|
||||
│ ├─ <a href="bash_scripts/suite_profile2.sh">suite_profile2.sh</a><small> 4,6K</small>
|
||||
│ └─ <a href="bash_scripts/suite_testing.sh">suite_testing.sh</a><small> 2,1K</small>
|
||||
├─ <a href="print_screen">print_screen</a>
|
||||
│ ├─ <a href="print_screen/LISTVIEW.md">LISTVIEW.md</a><small> 1,4K</small>
|
||||
│ ├─ <a href="print_screen/archive_backup.png">archive_backup.png</a><small> 2,9K</small>
|
||||
│ ├─ <a href="print_screen/archive_cleanup.png">archive_cleanup.png</a><small> 1,5K</small>
|
||||
│ ├─ <a href="print_screen/archive_packaging.gif">archive_packaging.gif</a><small> 22K</small>
|
||||
│ ├─ <a href="print_screen/info_references.png">info_references.png</a><small> 2,3K</small>
|
||||
│ ├─ <a href="print_screen/info_tree_license.png">info_tree_license.png</a><small> 1,6K</small>
|
||||
│ ├─ <a href="print_screen/repo_compose.png">repo_compose.png</a><small> 1,8K</small>
|
||||
│ ├─ <a href="print_screen/suite_orchestrate.gif">suite_orchestrate.gif</a><small> 293K</small>
|
||||
│ ├─ <a href="print_screen/suite_pages2.gif">suite_pages2.gif</a><small> 109K</small>
|
||||
│ ├─ <a href="print_screen/suite_profile2.gif">suite_profile2.gif</a><small> 106K</small>
|
||||
│ └─ <a href="print_screen/suite_testing.png">suite_testing.png</a><small> 3,9K</small>
|
||||
├─ <a href=".gitignore">.gitignore</a><small> 29</small>
|
||||
├─ <a href="CONTRIBUTING.md">CONTRIBUTING.md</a><small> 557</small>
|
||||
├─ <a href="DIRECTORY_TREE.md">DIRECTORY_TREE.md</a><small> 3,8K</small>
|
||||
├─ <a href="LICENSE.md">LICENSE.md</a><small> 955</small>
|
||||
├─ <a href="OPEN_LICENSE.txt">OPEN_LICENSE.txt</a><small> 25K</small>
|
||||
├─ <a href="README.en.md">README.en.md</a><small> 5,1K</small>
|
||||
└─ <a href="README.md">README.md</a><small> 6,1K</small>
|
||||
</pre>
|
||||
|
|
13
README.en.md
|
@ -1,10 +1,10 @@
|
|||
# [Dispatcher](README.md)
|
||||
|
||||
Creating the archive, switching a domain, saving scripts in the directories of projects and publishing the repositories on to server.
|
||||
Creating the archive, switching a domain, saving scripts in the directories of projects and publishing repositories on the server.
|
||||
|
||||
| № | Bash script | Actions performed | (+) |
|
||||
|:-:|:--------------------------------------------------------------|:------------------------------------------------------------------------------------------------|:-----------------------------------------:|
|
||||
| 1 | [**archive_backup.sh**](bash_scripts/archive_backup.sh) | Creating a common archive for the directories of projects on the current date. | |
|
||||
| 1 | [**archive_backup.sh**](bash_scripts/archive_backup.sh) | Creating a common archive for the directories of projects on the current date. | [png](print_screen/archive_backup.png) |
|
||||
| | [archive_cleanup.sh](bash_scripts/archive_cleanup.sh) | Deleting files and folders from the directories of projects before restoring the archive. | [png](print_screen/archive_cleanup.png) |
|
||||
| | [archive_packaging.sh](bash_scripts/archive_packaging.sh) | Building websites, packaging and copying archives for deployment. | [gif](print_screen/archive_packaging.gif) |
|
||||
| 2 | [**info_param.sh**](bash_scripts/info_param.sh) | Parameter for other scripts. Switching the domain of the remote repository. | |
|
||||
|
@ -12,12 +12,13 @@ Creating the archive, switching a domain, saving scripts in the directories of p
|
|||
| | [info_tree_license.sh](bash_scripts/info_tree_license.sh) | Building a directory tree for each project and copying license files. | [png](print_screen/info_tree_license.png) |
|
||||
| 3 | [**repo_compose.sh**](bash_scripts/repo_compose.sh) | Creating scripts from templates with parameters and saving them in the directories of projects. | [png](print_screen/repo_compose.png) |
|
||||
| | [repo_forgejo.tmpl.sh](bash_scripts/repo_forgejo.tmpl.sh) | Template of a script without parameters to create a remote repository forgejo. | |
|
||||
| | [repo_forgejo2.tmpl.sh](bash_scripts/repo_forgejo2.tmpl.sh) | Template of a script without parameters to deploy a website on the server codeberg. | |
|
||||
| | [repo_forgejo2.tmpl.sh](bash_scripts/repo_forgejo2.tmpl.sh) | Template of a script without parameters to publish a website on the server codeberg. | |
|
||||
| | [repo_gitlab.tmpl.sh](bash_scripts/repo_gitlab.tmpl.sh) | Template of a script without parameters to create a remote repository gitlab. | |
|
||||
| | [repo_local.tmpl.sh](bash_scripts/repo_local.tmpl.sh) | Template of a script without parameters to create a local repository git. | |
|
||||
| | [repo_testing.smpl.sh](bash_scripts/repo_testing.smpl.sh) | Sample of a script for testing the accessibility of pages in the web-interface on the server. | [png](print_screen/repo_testing.smpl.png) |
|
||||
| 4 | [**suite_orchestrate.sh**](bash_scripts/suite_orchestrate.sh) | Parallel execution of scripts and publishing the repositories for the directories of projects. | [gif](print_screen/suite_orchestrate.gif) |
|
||||
| | [suite_pages2.sh](bash_scripts/suite_pages2.sh) | Parallel execution of scripts and deploying the websites on the server codeberg. | [gif](print_screen/suite_pages2.gif) |
|
||||
| 4 | [**suite_orchestrate.sh**](bash_scripts/suite_orchestrate.sh) | Execution of scripts. Publishing the source code from the directories of projects. | [gif](print_screen/suite_orchestrate.gif) |
|
||||
| | [suite_pages2.sh](bash_scripts/suite_pages2.sh) | Execution of scripts. Publishing the finished websites on the server codeberg. | [gif](print_screen/suite_pages2.gif) |
|
||||
| | [suite_profile2.sh](bash_scripts/suite_profile2.sh) | Execution of scripts. Publishing the tables of contents of websites on the server codeberg. | [gif](print_screen/suite_profile2.gif) |
|
||||
| | [suite_testing.sh](bash_scripts/suite_testing.sh) | Testing the accessibility of pages in the web-interface on the server. | [png](print_screen/suite_testing.png) |
|
||||
|
||||
## Directories of projects
|
||||
|
||||
|
|
33
README.md
|
@ -2,22 +2,23 @@
|
|||
|
||||
Создание архива, переключение домена, сохранение скриптов в каталогах проектов и публикация репозиториев на сервере.
|
||||
|
||||
| № | Скрипт Bash | Выполняемые действия | (+) |
|
||||
|:-:|:--------------------------------------------------------------|:-----------------------------------------------------------------------------------|:-----------------------------------------:|
|
||||
| 1 | [**archive_backup.sh**](bash_scripts/archive_backup.sh) | Создание общего архива для каталогов проектов на текущую дату. | |
|
||||
| | [archive_cleanup.sh](bash_scripts/archive_cleanup.sh) | Удаление файлов и папок из каталогов проектов перед восстановлением архива. | [png](print_screen/archive_cleanup.png) |
|
||||
| | [archive_packaging.sh](bash_scripts/archive_packaging.sh) | Сборка вёб-сайтов, упаковка и копирование архивов для развёртывания. | [gif](print_screen/archive_packaging.gif) |
|
||||
| 2 | [**info_param.sh**](bash_scripts/info_param.sh) | Параметр для других скриптов. Переключение домена удалённого репозитория. | |
|
||||
| | [info_references.sh](bash_scripts/info_references.sh) | Обновление домена удалённого репозитория в перекрёстных ссылках в описаниях. | [png](print_screen/info_references.png) |
|
||||
| | [info_tree_license.sh](bash_scripts/info_tree_license.sh) | Построение дерева каталогов для каждого проекта и копирование файлов лицензии. | [png](print_screen/info_tree_license.png) |
|
||||
| 3 | [**repo_compose.sh**](bash_scripts/repo_compose.sh) | Создание скриптов из шаблонов с параметрами и сохранение их в каталогах проектов. | [png](print_screen/repo_compose.png) |
|
||||
| | [repo_forgejo.tmpl.sh](bash_scripts/repo_forgejo.tmpl.sh) | Шаблон скрипта без параметров для создания удалённого репозитория forgejo. | |
|
||||
| | [repo_forgejo2.tmpl.sh](bash_scripts/repo_forgejo2.tmpl.sh) | Шаблон скрипта без параметров для развёртывания вёб-сайта на сервере codeberg. | |
|
||||
| | [repo_gitlab.tmpl.sh](bash_scripts/repo_gitlab.tmpl.sh) | Шаблон скрипта без параметров для создания удалённого репозитория gitlab. | |
|
||||
| | [repo_local.tmpl.sh](bash_scripts/repo_local.tmpl.sh) | Шаблон скрипта без параметров для создания локального репозитория git. | |
|
||||
| | [repo_testing.smpl.sh](bash_scripts/repo_testing.smpl.sh) | Образец скрипта для тестирования доступности страниц в вёб-интерфейсе на сервере. | [png](print_screen/repo_testing.smpl.png) |
|
||||
| 4 | [**suite_orchestrate.sh**](bash_scripts/suite_orchestrate.sh) | Параллельное выполнение скриптов и публикация репозиториев для каталогов проектов. | [gif](print_screen/suite_orchestrate.gif) |
|
||||
| | [suite_pages2.sh](bash_scripts/suite_pages2.sh) | Параллельное выполнение скриптов и развёртывание вёб-сайтов на сервере codeberg. | [gif](print_screen/suite_pages2.gif) |
|
||||
| № | Скрипт Bash | Выполняемые действия | (+) |
|
||||
|:-:|:--------------------------------------------------------------|:----------------------------------------------------------------------------------|:-----------------------------------------:|
|
||||
| 1 | [**archive_backup.sh**](bash_scripts/archive_backup.sh) | Создание общего архива для каталогов проектов на текущую дату. | [png](print_screen/archive_backup.png) |
|
||||
| | [archive_cleanup.sh](bash_scripts/archive_cleanup.sh) | Удаление файлов и папок из каталогов проектов перед восстановлением архива. | [png](print_screen/archive_cleanup.png) |
|
||||
| | [archive_packaging.sh](bash_scripts/archive_packaging.sh) | Сборка вёб-сайтов, упаковка и копирование архивов для развёртывания. | [gif](print_screen/archive_packaging.gif) |
|
||||
| 2 | [**info_param.sh**](bash_scripts/info_param.sh) | Параметр для других скриптов. Переключение домена удалённого репозитория. | |
|
||||
| | [info_references.sh](bash_scripts/info_references.sh) | Обновление домена удалённого репозитория в перекрёстных ссылках в описаниях. | [png](print_screen/info_references.png) |
|
||||
| | [info_tree_license.sh](bash_scripts/info_tree_license.sh) | Построение дерева каталогов для каждого проекта и копирование файлов лицензии. | [png](print_screen/info_tree_license.png) |
|
||||
| 3 | [**repo_compose.sh**](bash_scripts/repo_compose.sh) | Создание скриптов из шаблонов с параметрами и сохранение их в каталогах проектов. | [png](print_screen/repo_compose.png) |
|
||||
| | [repo_forgejo.tmpl.sh](bash_scripts/repo_forgejo.tmpl.sh) | Шаблон скрипта без параметров для создания удалённого репозитория forgejo. | |
|
||||
| | [repo_forgejo2.tmpl.sh](bash_scripts/repo_forgejo2.tmpl.sh) | Шаблон скрипта без параметров для публикации вёб-сайта на сервере codeberg. | |
|
||||
| | [repo_gitlab.tmpl.sh](bash_scripts/repo_gitlab.tmpl.sh) | Шаблон скрипта без параметров для создания удалённого репозитория gitlab. | |
|
||||
| | [repo_local.tmpl.sh](bash_scripts/repo_local.tmpl.sh) | Шаблон скрипта без параметров для создания локального репозитория git. | |
|
||||
| 4 | [**suite_orchestrate.sh**](bash_scripts/suite_orchestrate.sh) | Выполнение скриптов. Публикация исходного кода из каталогов проектов. | [gif](print_screen/suite_orchestrate.gif) |
|
||||
| | [suite_pages2.sh](bash_scripts/suite_pages2.sh) | Выполнение скриптов. Публикация готовых вёб-сайтов на сервере codeberg. | [gif](print_screen/suite_pages2.gif) |
|
||||
| | [suite_profile2.sh](bash_scripts/suite_profile2.sh) | Выполнение скриптов. Публикация оглавлений вёб-сайтов на сервере codeberg. | [gif](print_screen/suite_profile2.gif) |
|
||||
| | [suite_testing.sh](bash_scripts/suite_testing.sh) | Тестирование доступности страниц в вёб-интерфейсе на сервере. | [png](print_screen/suite_testing.png) |
|
||||
|
||||
## Каталоги проектов
|
||||
|
||||
|
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 3.9 KiB |
|
@ -1,9 +1,15 @@
|
|||
#!/bin/bash
|
||||
echo "Создание общего архива для каталогов проектов на текущую дату."
|
||||
cd ../.. # выход из папки и из репозитория
|
||||
filename="pomodoro-$(date '+%Y-%m-%d').zip"
|
||||
# сводная строка исключений для всех проектов из файлов ".gitignore"
|
||||
exclusions="$(find . -maxdepth 2 -type f -name '.gitignore' -exec \
|
||||
sed -E "s|^(.*)$|-xr!'\1'|" {} \; | sort | uniq | tr '\n' ' ')"
|
||||
rm -f "$filename"
|
||||
eval "7z a -tzip '$filename' . -xr!'.git' $exclusions" | grep -E '\S'
|
||||
cd ../.. # выход из папки и из репозитория
|
||||
time_ms="$(date '+%s%3N')"
|
||||
rm -vf "$filename" # удаление старого файла
|
||||
# поиск всех каталогов на одном уровне с текущим, кроме папки ".idea", сортировка и добавление
|
||||
# в общий архив их содержимого, за исключением неотслеживаемых файлов по спискам ".gitignore"
|
||||
find . -mindepth 1 -maxdepth 1 -type d -not -path "*.idea*" -printf '%P\n' | sort | xargs -I{} bash -c \
|
||||
"echo 'Обработка += {}' && 7z u -tzip $filename {} -xr!'.git' -xr@'{}/.gitignore' &>/dev/null"
|
||||
# вывод общей информации о целостности полученного архива
|
||||
7z t "$filename" |& grep -E '\S' | grep -E "\-\-|ERROR" -A20
|
||||
# замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды
|
||||
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"
|
||||
|
|
|
@ -4,23 +4,23 @@ echo "Сборка вёб-сайтов, упаковка и копировани
|
|||
function packaging {
|
||||
dir="pomodoro${1}" && red="\e[91m" && green="\e[92m" && norm="\e[0m"
|
||||
# соответствующая строка для вывода сообщений по ходу выполнения функции
|
||||
num="$((7 - ${1}))" && pre="\e[${num}A${dir}: " && aft="\e[K\e[${num}B\r"
|
||||
printf "${pre}%s${aft}" "Обработка."
|
||||
cd "./$dir" &>/dev/null || { printf "${pre}${red}%s${norm}${aft}" "Не найден каталог." && return; }
|
||||
printf "${pre}%s${aft}" "Сборка."
|
||||
./build.sh &>/dev/null || { printf "${pre}${red}%s${norm}${aft}" "Ошибка сборки." && return; }
|
||||
printf "${pre}%s${aft}" "Упаковка."
|
||||
./package.sh &>/dev/null || { printf "${pre}${red}%s${norm}${aft}" "Ошибка упаковки." && return; }
|
||||
printf "${pre}%s${aft}" "Копирование."
|
||||
cp "$dir".zip .. &>/dev/null || { printf "${pre}${red}%s${norm}${aft}" "Ошибка копирования." && return; }
|
||||
printf "${pre}${green}%s${norm}${aft}" "Выполнено."
|
||||
num="$((7 - ${1}))" && pre="\e[${num}A${dir} " && aft="\e[K\e[${num}B\r"
|
||||
printf "${pre}%s %s${aft}" "[•••]" "Обработка."
|
||||
cd "./$dir" &>/dev/null || { printf "${pre}${red}%s${norm} %s${aft}" "[•••]" "Не найден каталог." && return; }
|
||||
printf "${pre}%s %s${aft}" "[#••]" "Сборка."
|
||||
./build.sh &>/dev/null || { printf "${pre}${red}%s${norm} %s${aft}" "[#••]" "Ошибка сборки." && return; }
|
||||
printf "${pre}%s %s${aft}" "[##•]" "Упаковка."
|
||||
./package.sh &>/dev/null || { printf "${pre}${red}%s${norm} %s${aft}" "[##•]" "Ошибка упаковки." && return; }
|
||||
printf "${pre}%s %s${aft}" "[###]" "Копирование."
|
||||
cp "$dir".zip .. &>/dev/null || { printf "${pre}${red}%s${norm} %s${aft}" "[###]" "Ошибка копирования." && return; }
|
||||
printf "${pre}${green}%s${norm} %s${aft}" "[###]" "Выполнено."
|
||||
}
|
||||
export -f packaging
|
||||
cd ../.. # выход из папки и из репозитория
|
||||
time_ms="$(date '+%s%3N')"
|
||||
# смещение курсора вниз на соответствующее количество строк
|
||||
printf 'pomodoro%s\n' {1..6}
|
||||
# обход всех вёб-сайтов и параллельный запуск функции для каждого
|
||||
# вывод номеров вёб-сайтов и параллельный запуск функции для каждого
|
||||
printf 'packaging "%s"\0' {1..6} | xargs -n1 -0 -P0 bash -c
|
||||
# замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды
|
||||
tms="$(($(date '+%s%3N') - time_ms))" && min="$((tms / 1000 / 60))" && sec="$((tms / 1000 % 60))"
|
||||
|
|
|
@ -17,7 +17,7 @@ else
|
|||
fi
|
||||
cd ../.. # выход из папки и из репозитория
|
||||
time_ms="$(date '+%s%3N')"
|
||||
# поиск файлов "README" и параллельная подстановка значений по шаблонам для каждого
|
||||
find . -type f -name "README*.md" -printf '%p\0' | xargs -I{} -n1 -0 -P0 bash -c \
|
||||
"echo '$domain => {}' && sed -i $(printf " -e '%s'" "${expr[@]}") '{}'"
|
||||
# поиск файлов "README" в корне каждого репозитория, замена строк по шаблонам и сортировка вывода
|
||||
find . -maxdepth 2 -type f -name "README*.md" -printf '%p\0' | xargs -I{} -n1 -0 -P0 bash -c \
|
||||
"echo '$domain => {}' && sed -i $(printf " -e '%s'" "${expr[@]}") '{}'" | LC_COLLATE=C sort
|
||||
echo "Общее время выполнения: $(($(date '+%s%3N') - time_ms)) мс."
|
||||
|
|
|
@ -20,7 +20,10 @@ function directory_tree {
|
|||
# префикс текущего элемента, сворачивать синглтоны в одну строку
|
||||
[ "$4" == "one" ] && printf '%s' "/" || printf '\n%s' "$head"
|
||||
# текущий элемент дерева — относительная гиперссылка
|
||||
printf '%s' "<a href='${path#*/}'>${path##*/}</a>"
|
||||
printf '<a href="%s">%s</a>' "${path#*/}" "${path##*/}"
|
||||
# суффикс текущего элемента — размер файла меньшим шрифтом
|
||||
[ -f "$path" ] && printf '<small> %s</small>' \
|
||||
"$(stat -c %s "$path" | numfmt --to=iec --round=nearest)"
|
||||
# рекурсивные вызовы для подкаталогов
|
||||
if [ -d "$path" ]; then
|
||||
local i # счётчик
|
||||
|
@ -46,7 +49,7 @@ function tree_license {
|
|||
fi
|
||||
# строка исключений для "ls" из списка неотслеживаемых файлов ".gitignore"
|
||||
exclusions="-I'.git' $(sed -E "s|^(.*)$|-I'\1'|" .gitignore | tr '\n' ' ')"
|
||||
# помещаем дерево в контейнер, добавляем заголовок и выводим в файл
|
||||
# поместить дерево в контейнер, добавить заголовок и вывести в файл
|
||||
printf '%s\n' "## Дерево каталогов" "" "<pre>" \
|
||||
"$(directory_tree . | grep '\S')" "</pre>" >DIRECTORY_TREE.md
|
||||
}
|
||||
|
|
|
@ -6,10 +6,8 @@ export basedir="$PWD" # текущая папка
|
|||
function compose {
|
||||
echo "Обработка: $1"
|
||||
cd "$1" || return
|
||||
# добавление скриптов в список неотслеживаемых файлов, если ещё не добавлено
|
||||
if [[ ! -f ".gitignore" || "$(grep -cF ".repo_*" ".gitignore")" == 0 ]]; then
|
||||
echo ".repo_*" >>".gitignore" && echo "Обновлён файл: $1/.gitignore"
|
||||
fi
|
||||
# удаление скриптов предыдущей компоновки, если таковые имеются
|
||||
find . -maxdepth 1 -type f -name ".repo_*" -exec rm -f {} \;
|
||||
# подготовка значений для параметров
|
||||
user="golovin" && owner="$user" && repo="$1"
|
||||
case "$1" in
|
||||
|
@ -25,63 +23,74 @@ function compose {
|
|||
pomodoro) description="Описание и оглавление" ;;
|
||||
color*) description="Тема оформления / Цветной помидор" ;;
|
||||
older*) description="Тема оформления / Старый помидор" ;;
|
||||
*) return ;; # шесть помидорных вёб-сайтов и три сопутствующих проекта
|
||||
*) return ;; # шесть помидорных вёб-сайтов и четыре сопутствующих проекта
|
||||
esac
|
||||
file="DIRECTORY_TREE.md"
|
||||
if [ "$domain" == "hub.mos.ru" ]; then
|
||||
model="gitlab" && folder="blob" && wiki_home="-/wikis/home"
|
||||
[ -f "WIKI.md" ] && wiki="$(uni2ascii -aU -qpsn "WIKI.md")"
|
||||
model="gitlab" && [ -f "WIKI.md" ] && wiki="$(uni2ascii -aU -qpsn "WIKI.md")"
|
||||
else
|
||||
model="forgejo" && folder="src/branch" && wiki_home="wiki"
|
||||
[ -f "WIKI.md" ] && wiki="$(basenc "WIKI.md" --base64 -w0)"
|
||||
model="forgejo" && [ -f "WIKI.md" ] && wiki="$(basenc --base64 -w0 "WIKI.md")"
|
||||
fi
|
||||
if [ "$domain" == "codeberg.org" ]; then
|
||||
[[ "$1" =~ [1-6] ]] && description2="Исходные тексты вёб-сайта — https://$domain/$owner/$repo"
|
||||
[ -f "WIKI.md" ] && wiki="$(sed 's|mircloud\.ru|codeberg.page|g' WIKI.md | basenc --base64 -w0)"
|
||||
description="${description//mircloud.ru/codeberg.page}"
|
||||
fi
|
||||
# создание трёх скриптов в каталоге проекта с одинаковой шапкой для всех
|
||||
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='$user'")
|
||||
param_remote+=("repo='$repo'")
|
||||
param_remote+=("description='$description'")
|
||||
param_remote+=("wiki='$wiki'")
|
||||
param_remote+=("token='$(head -n+1 "$basedir/.token_$model")'")
|
||||
# скрипт для создания удалённого репозитория
|
||||
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[@]}" >>".repo_local.sh"
|
||||
tail -n+2 "$basedir/repo_local.tmpl.sh" >>".repo_local.sh"
|
||||
# параметры для тестирования вёб-интерфейса
|
||||
param_testing+=("'https://$domain/$owner/$repo/$folder/master/$file' '$file'")
|
||||
[ "$wiki" ] && param_testing+=("'https://$domain/$owner/$repo/$wiki_home' 'Home'")
|
||||
# скрипт для тестирования вёб-интерфейса
|
||||
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='$description2'")
|
||||
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"
|
||||
# параметры для публикации репозитория
|
||||
repo_publish+=("#!/bin/bash")
|
||||
repo_publish+=("domain='$domain'")
|
||||
repo_publish+=("owner='$owner'")
|
||||
repo_publish+=("user='$user'")
|
||||
repo_publish+=("repo='$repo'")
|
||||
repo_publish+=("dir='$1'")
|
||||
repo_publish+=("description='$description'")
|
||||
repo_publish+=("wiki='$wiki'")
|
||||
repo_publish+=("token='$(head -n+1 "$basedir/.token_$model")'")
|
||||
# шаблоны для публикации репозитория
|
||||
tmpl_remote="$basedir/repo_$model.tmpl.sh"
|
||||
tmpl_local="$basedir/repo_local.tmpl.sh"
|
||||
# место вставки для локального шаблона
|
||||
local="$(grep -nF '#LOCAL#' "$tmpl_remote" | sed 's|:.*$||')"
|
||||
{ # скрипт для публикации репозитория
|
||||
printf '%s\n' "${repo_publish[@]}"
|
||||
head -n+"$((local - 1))" "$tmpl_remote" | tail -n+2
|
||||
tail -n+2 "$tmpl_local"
|
||||
tail -n+"$((local + 1))" "$tmpl_remote"
|
||||
} >".repo_publish.sh"
|
||||
chmod 555 ".repo_publish.sh"
|
||||
# два скрипта для публикации вёб-сайтов
|
||||
if [[ "$domain" == "codeberg.org" ]]; then
|
||||
# шесть помидорных вёб-сайтов и один общий помидор
|
||||
[[ "$1" =~ [1-6] ]] && group="$owner$repo" || group="pomodoro"
|
||||
if [[ "$1" =~ [1-6] ]]; then
|
||||
# параметры для развёртывания вёб-сайта
|
||||
param_pages+=("#!/bin/bash")
|
||||
param_pages+=("domain='$domain'")
|
||||
param_pages+=("owner='$group'")
|
||||
param_pages+=("folder='_site'")
|
||||
param_pages+=("repo='pages'")
|
||||
param_pages+=("avatar='website'")
|
||||
param_pages+=("description='$description2'")
|
||||
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 555 ".repo_pages2.sh"
|
||||
fi
|
||||
if [[ "$1" == "pomodoro" || "$1" =~ [1-5] ]]; then
|
||||
# параметры для оглавления вёб-сайта
|
||||
param_profile+=("#!/bin/bash")
|
||||
param_profile+=("domain='$domain'")
|
||||
param_profile+=("owner='$group'")
|
||||
param_profile+=("folder='_profile'")
|
||||
param_profile+=("repo='.profile'")
|
||||
param_profile+=("avatar='pomodoro'")
|
||||
param_profile+=("description='Оглавление / Contents'")
|
||||
param_profile+=("token='$(head -n+1 "$basedir/.token_forgejo")'")
|
||||
# скрипт для оглавления вёб-сайта
|
||||
printf '%s\n' "${param_profile[@]}" >".repo_profile2.sh"
|
||||
tail -n+2 "$basedir/repo_forgejo2.tmpl.sh" >>".repo_profile2.sh"
|
||||
chmod 555 ".repo_profile2.sh"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
export -f compose
|
||||
|
|
|
@ -1,56 +1,76 @@
|
|||
#!/bin/false
|
||||
if [[ -z "$domain" || -z "$token" || -z "$owner" || -z "$repo" || -z "$description" || -z "$user" ]]; then
|
||||
if [[ -z "$domain" || -z "$token" || -z "$owner" || -z "$repo" || -z "$description" || -z "$user" || -z "$dir" ]]; then
|
||||
echo "Не указаны обязательные параметры." && exit 1
|
||||
fi
|
||||
if [ -z "$1" ]; then
|
||||
echo "Создание удалённого репозитория для текущего проекта."
|
||||
fi
|
||||
time_ms="$(date '+%s%3N')"
|
||||
if [[ -z "$1" || "$1" == "delete" ]]; then
|
||||
echo "Удаление старого репозитория."
|
||||
curl -i -X DELETE "https://$domain/api/v1/repos/$owner/$repo" \
|
||||
curl -f -X DELETE "https://$domain/api/v1/repos/$owner/$repo" \
|
||||
-H "Authorization: token $token" \
|
||||
-H "Accept: application/json"
|
||||
-H "Accept: application/json" &>/dev/null \
|
||||
|| { echo "Не удалось удалить репозиторий на сервере."; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "create" ]]; then
|
||||
echo "Создание нового репозитория пользователя."
|
||||
curl -i -X POST "https://$domain/api/v1/user/repos" \
|
||||
curl -f -X POST "https://$domain/api/v1/user/repos" \
|
||||
-H "Authorization: token $token" \
|
||||
-H "Accept: application/json" \
|
||||
-H "Content-Type: application/json" -d "{ \"name\": \"$repo\", \"description\": \"$description\" }"
|
||||
-H "Content-Type: application/json" -d "{
|
||||
\"name\": \"$repo\", \"description\": \"$description\" }" &>/dev/null \
|
||||
|| { echo "Не удалось создать репозиторий на сервере."; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "transfer" ]]; then
|
||||
if [ "$user" != "$owner" ]; then
|
||||
echo "Перемещение репозитория в группу."
|
||||
curl -i -X POST "https://$domain/api/v1/repos/$user/$repo/transfer" \
|
||||
curl -f -X POST "https://$domain/api/v1/repos/$user/$repo/transfer" \
|
||||
-H "Authorization: token $token" \
|
||||
-H "Accept: application/json" \
|
||||
-H "Content-Type: application/json" -d "{ \"new_owner\": \"$owner\" }"
|
||||
-H "Content-Type: application/json" -d "{ \"new_owner\": \"$owner\" }" &>/dev/null \
|
||||
|| { echo "Не удалось переместить репозиторий в группу." && exit 1; }
|
||||
fi
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "options" ]]; then
|
||||
[ "$wiki" ] && has_wiki=true || has_wiki=false
|
||||
[ -n "$wiki" ] && has_wiki=true || has_wiki=false
|
||||
if [[ -z "$1" || "$1" == "patch" ]]; then
|
||||
echo "Изменение свойств репозитория / отключение ненужного."
|
||||
curl -i -X PATCH "https://$domain/api/v1/repos/$owner/$repo" \
|
||||
curl -f -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\": $has_wiki }"
|
||||
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
|
||||
\"has_wiki\": $has_wiki }" &>/dev/null \
|
||||
|| { echo "Не удалось изменить свойства репозитория на сервере." && exit 1; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "wiki" ]] && [[ -n "$wiki" ]]; then
|
||||
echo "Добавление страницы wiki в репозиторий."
|
||||
curl -f -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\" }" &>/dev/null \
|
||||
|| { echo "Не удалось добавить страницу wiki для репозитория." && exit 1; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "avatar" ]]; then
|
||||
echo "Добавление аватарки для репозитория."
|
||||
[ "$user" != "$owner" ] && picture="website" || picture="$repo"
|
||||
avatar=$(basenc "../dispatcher/avatars/$picture.jpg" --base64 -w0)
|
||||
curl -i -X POST "https://$domain/api/v1/repos/$owner/$repo/avatar" \
|
||||
curl -f -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\" }"
|
||||
-H "Content-Type: application/json" -d "{ \"image\": \"$avatar\" }" &>/dev/null \
|
||||
|| { echo "Не удалось добавить аватарку для репозитория." && exit 1; }
|
||||
fi
|
||||
#LOCAL#
|
||||
if [ -z "$1" ]; then
|
||||
echo "Ожидание 3 секунды." && sleep 3
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "testing" ]]; then
|
||||
echo "Получение списка ветвей для удалённого репозитория."
|
||||
curl -f -X GET "https://$domain/api/v1/repos/$owner/$repo/branches" \
|
||||
-H "Authorization: token $token" \
|
||||
-H "Accept: application/json" 2>/dev/null | grep -v '^null$' &>/dev/null \
|
||||
|| { echo "Не удалось получить список ветвей для репозитория." && exit 1; }
|
||||
fi
|
||||
if [ -z "$1" ]; then
|
||||
echo "Общее время выполнения: $(($(date '+%s%3N') - time_ms)) мс."
|
||||
|
|
|
@ -1,59 +1,79 @@
|
|||
#!/bin/false
|
||||
if [[ -z "$domain" || -z "$token" || -z "$owner" || -z "$repo" || -z "$description" || -z "$user" ]]; then
|
||||
if [[ -z "$domain" || -z "$token" || -z "$owner" || -z "$repo" || -z "$description" || -z "$folder" ]]; then
|
||||
echo "Не указаны обязательные параметры." && exit 1
|
||||
elif [ "$domain" != "codeberg.org" ]; then
|
||||
echo "Некорректно указан сервер." && exit 1
|
||||
fi
|
||||
cd _site || exit 1
|
||||
if [ -z "$1" ]; then
|
||||
echo "Создание удалённого репозитория, локального репозитория, отправка данных и проверка их получения."
|
||||
if [[ -z "$1" || "$1" == "prepare" ]] && [[ "$folder" == ".profile" ]]; then
|
||||
echo "Создание каталога и создание файлов в каталоге."
|
||||
rm -rf "$folder" && mkdir "$folder"
|
||||
if [[ "$owner" == "pomodoro" ]]; then
|
||||
expr+=" -e 's|details open|details|'"
|
||||
fi
|
||||
expr+=" -e 's|mircloud\.ru|codeberg.page|g'"
|
||||
eval "sed $expr 'WIKI.md'" >"$folder/README.md"
|
||||
echo "*.md linguist-language=INFO" >"$folder/.gitattributes"
|
||||
fi
|
||||
cd "$folder" || exit 1
|
||||
time_ms="$(date '+%s%3N')"
|
||||
if [[ -z "$1" || "$1" == "remote" ]]; then
|
||||
if [[ -z "$1" || "$1" == "delete" ]]; then
|
||||
echo "Удаление старого репозитория на сервере."
|
||||
curl -i -X DELETE "https://$domain/api/v1/repos/$owner/$repo" \
|
||||
curl -f -X DELETE "https://$domain/api/v1/repos/$owner/$repo" \
|
||||
-H "Authorization: token $token" \
|
||||
-H "Accept: application/json"
|
||||
-H "Accept: application/json" &>/dev/null \
|
||||
|| { echo "Не удалось удалить репозиторий на сервере."; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "create" ]]; then
|
||||
echo "Создание нового репозитория в группе на сервере."
|
||||
curl -i -X POST "https://$domain/api/v1/orgs/$owner/repos" \
|
||||
curl -f -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\" }"
|
||||
\"name\": \"$repo\", \"description\": \"$description\" }" &>/dev/null \
|
||||
|| { echo "Не удалось создать репозиторий на сервере." && exit 1; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "patch" ]]; then
|
||||
echo "Изменение свойств репозитория / отключение ненужного."
|
||||
curl -i -X PATCH "https://$domain/api/v1/repos/$owner/$repo" \
|
||||
curl -f -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 }"
|
||||
\"has_wiki\": false }" &>/dev/null \
|
||||
|| { echo "Не удалось изменить свойства репозитория на сервере." && exit 1; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "avatar" ]]; then
|
||||
echo "Добавление аватарки для репозитория."
|
||||
avatar=$(basenc "../../dispatcher/avatars/website.jpg" --base64 -w0)
|
||||
curl -i -X POST "https://$domain/api/v1/repos/$owner/$repo/avatar" \
|
||||
avatar=$(basenc "../../dispatcher/avatars/$avatar.jpg" --base64 -w0)
|
||||
curl -f -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\" }"
|
||||
-H "Content-Type: application/json" -d "{ \"image\": \"$avatar\" }" &>/dev/null \
|
||||
|| { echo "Не удалось добавить аватарку для репозитория." && exit 1; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "local" ]]; then
|
||||
echo "Пересоздание локального репозитория и отправка данных на сервер."
|
||||
echo "Создание локального репозитория."
|
||||
rm -rf ".git" # удаление старого репозитория
|
||||
git init -b "master"
|
||||
git remote add "$domain" "git@$domain:$owner/$repo.git"
|
||||
git add --all
|
||||
git commit -m "$(printf '%(%F %T)T' "$(stat . -c'%W')")"
|
||||
git commit -m "$(date -I'seconds' -d"@$(stat . -c'%W')")"
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "push" ]]; then
|
||||
echo "Подключение к удалённому репозиторию и передача данных."
|
||||
git remote add "$domain" "git@$domain:$owner/$repo.git"
|
||||
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" \
|
||||
echo "Получение списка ветвей для удалённого репозитория."
|
||||
curl -f -X GET "https://$domain/api/v1/repos/$owner/$repo/branches" \
|
||||
-H "Authorization: token $token" \
|
||||
-H "Accept: application/json"
|
||||
-H "Accept: application/json" 2>/dev/null | grep -v '^null$' &>/dev/null \
|
||||
|| { echo "Не удалось получить список ветвей для репозитория." && exit 1; }
|
||||
fi
|
||||
if [ -z "$1" ]; then
|
||||
echo "Общее время выполнения: $(($(date '+%s%3N') - time_ms)) мс."
|
||||
|
|
|
@ -1,67 +1,70 @@
|
|||
#!/bin/false
|
||||
if [[ -z "$domain" || -z "$token" || -z "$owner" || -z "$repo" || -z "$description" || -z "$user" ]]; then
|
||||
if [[ -z "$domain" || -z "$token" || -z "$owner" || -z "$repo" || -z "$description" || -z "$user" || -z "$dir" ]]; then
|
||||
echo "Не указаны обязательные параметры." && exit 1
|
||||
fi
|
||||
if [ -z "$1" ]; then
|
||||
echo "Создание удалённого репозитория для текущего проекта."
|
||||
fi
|
||||
time_ms="$(date '+%s%3N')"
|
||||
if [[ -z "$1" || "$1" == "delete" ]]; then
|
||||
echo "Удаление старого репозитория."
|
||||
curl -i -X DELETE "https://$domain/api/v4/projects/$owner%2F$repo" \
|
||||
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\" }"
|
||||
echo
|
||||
-H "Content-Type: application/json" -d "{
|
||||
\"permanently_remove\": \"true\", \"full_path\": \"$owner/$repo\" }" &>/dev/null \
|
||||
|| { echo "Не удалось удалить репозиторий на сервере."; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "create" ]]; then
|
||||
echo "Создание нового репозитория пользователя."
|
||||
curl -i -X POST "https://$domain/api/v4/projects" \
|
||||
-H "PRIVATE-TOKEN: $token" \
|
||||
-H "Content-Type: application/json" -d "{ \"name\": \"$repo\", \"description\": \"$description\" }"
|
||||
echo
|
||||
if [ "$user" != "$owner" ]; then
|
||||
echo "Перемещение репозитория в группу."
|
||||
curl -i -X PUT "https://$domain/api/v4/projects/$user%2F$repo/transfer?namespace=$owner" \
|
||||
-H "PRIVATE-TOKEN: $token"
|
||||
echo
|
||||
fi
|
||||
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" \
|
||||
curl -f -X POST "https://$domain/api/v4/projects" \
|
||||
-H "PRIVATE-TOKEN: $token" \
|
||||
-H "Content-Type: application/json" -d "{
|
||||
\"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\": \"$has_wiki\", \"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\" }"
|
||||
echo
|
||||
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
|
||||
\"name\": \"$repo\", \"description\": \"$description\" }" &>/dev/null \
|
||||
|| { echo "Не удалось создать репозиторий на сервере."; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "transfer" ]]; then
|
||||
if [ "$user" != "$owner" ]; then
|
||||
echo "Перемещение репозитория в группу."
|
||||
curl -f -X PUT "https://$domain/api/v4/projects/$user%2F$repo/transfer?namespace=$owner" \
|
||||
-H "PRIVATE-TOKEN: $token" &>/dev/null \
|
||||
|| { echo "Не удалось переместить репозиторий в группу." && exit 1; }
|
||||
fi
|
||||
fi
|
||||
[ -n "$wiki" ] && has_wiki="enabled" || has_wiki="disabled"
|
||||
if [[ -z "$1" || "$1" == "patch" ]]; then
|
||||
echo "Изменение свойств репозитория / отключение ненужного."
|
||||
curl -f -X PUT "https://$domain/api/v4/projects/$owner%2F$repo" \
|
||||
-H "PRIVATE-TOKEN: $token" \
|
||||
-H "Content-Type: application/json" -d "{
|
||||
\"request_access_enabled\": false, \"issues_enabled\": false, \"lfs_enabled\": false, \"packages_enabled\": false,
|
||||
\"builds_access_level\": \"disabled\", \"forking_access_level\": \"disabled\", \"snippets_access_level\": \"disabled\",
|
||||
\"analytics_access_level\": \"disabled\", \"releases_access_level\": \"disabled\", \"show_default_award_emojis\": false,
|
||||
\"merge_requests_access_level\": \"disabled\", \"wiki_access_level\": \"$has_wiki\", \"container_registry_enabled\": false,
|
||||
\"security_and_compliance_access_level\": \"disabled\", \"warn_about_potentially_unwanted_characters\": false }" &>/dev/null \
|
||||
|| { echo "Не удалось изменить свойства репозитория на сервере." && exit 1; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "wiki" ]] && [[ -n "$wiki" ]]; then
|
||||
echo "Добавление страницы wiki в репозиторий."
|
||||
curl -f -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\" }" &>/dev/null \
|
||||
|| { echo "Не удалось добавить страницу wiki для репозитория." && exit 1; }
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "avatar" ]]; then
|
||||
echo "Добавление аватарки для репозитория."
|
||||
[ "$user" != "$owner" ] && picture="website" || picture="$repo"
|
||||
curl -i -X PUT "https://$domain/api/v4/projects/$owner%2F$repo" \
|
||||
curl -f -X PUT "https://$domain/api/v4/projects/$owner%2F$repo" \
|
||||
-H "PRIVATE-TOKEN: $token" \
|
||||
-F "avatar=@../dispatcher/avatars/$picture.jpg"
|
||||
echo
|
||||
-F "avatar=@../dispatcher/avatars/$picture.jpg" &>/dev/null \
|
||||
|| { echo "Не удалось добавить аватарку для репозитория." && exit 1; }
|
||||
fi
|
||||
#LOCAL#
|
||||
if [ -z "$1" ]; then
|
||||
echo "Ожидание 3 секунды." && sleep 3
|
||||
fi
|
||||
if [[ -z "$1" || "$1" == "testing" ]]; then
|
||||
echo "Получение списка ветвей для удалённого репозитория."
|
||||
curl -f -X GET "https://$domain/api/v4/projects/$owner%2F$repo/repository/branches" \
|
||||
-H "PRIVATE-TOKEN: $token" 2>/dev/null | grep -v '^\[\]$' &>/dev/null \
|
||||
|| { echo "Не удалось получить список ветвей для репозитория." && exit 1; }
|
||||
fi
|
||||
if [ -z "$1" ]; then
|
||||
echo "Общее время выполнения: $(($(date '+%s%3N') - time_ms)) мс."
|
||||
|
|
|
@ -1,38 +1,31 @@
|
|||
#!/bin/false
|
||||
if [[ -z "$domain" || -z "$owner" || -z "$repo" || -z "$dir" ]]; then
|
||||
echo "Не указаны обязательные параметры." && exit 1
|
||||
if [[ -z "$1" || "$1" == "local" ]]; then
|
||||
echo "Создание локального репозитория."
|
||||
rm -rf .git # удаление старого репозитория
|
||||
git init -b master
|
||||
git add .git*
|
||||
git commit -m "Инициализация / $dir"
|
||||
find . -type f | grep -E 'CONTRIBUTING|LICENSE' | xargs git add
|
||||
git commit -m "Открытая лицензия РФ"
|
||||
find . -type f -name '*.md' | grep -E 'TREE|WIKI|README|VIEW' | xargs git add
|
||||
git commit -m "Описание проекта"
|
||||
find . -type f | grep -E '(yml|Gemfile.*|gemspec|robots.txt)$' | xargs git add
|
||||
git commit -m "Настройки"
|
||||
git add \*.sh
|
||||
git commit -m "Скрипты bash"
|
||||
find . -type f | grep -E '(min.css|min.js|woff)$' | xargs git add
|
||||
git commit -m "Сторонние материалы"
|
||||
find . -type f | grep -E '(bmp|gif|ico|jpg|png|svg)$' | xargs git add
|
||||
git commit -m "Картинки"
|
||||
git add --all
|
||||
# преобразование шаблонов "glob" в расширенные выражения "regexp"
|
||||
patterns="$(sed 's|\.|\\.|;s|*|.*|' .gitignore | tr '\n' '|')\.git"
|
||||
# выбор всех файлов в каталоге, кроме списка ".gitignore", сортировка и внесение в репозиторий
|
||||
find . -type f -printf '%P\n' | grep -vE "(^|.+/)($patterns)(/.+|$)" | LC_COLLATE=C sort -r \
|
||||
| xargs -I{} -d'\n' bash -c 'echo "Обработка: {}" && git commit "{}" -m "{}" &>/dev/null'
|
||||
fi
|
||||
echo "Создание локального репозитория, подключение к удалённому и передача данных."
|
||||
time_ms="$(date '+%s%3N')"
|
||||
# строка исключений для "find" из списка неотслеживаемых файлов ".gitignore"
|
||||
exclusions="-not -path '*/.git/*' $(sed -E "s|^(.*)$|-not -path '*/\1*'|" .gitignore | tr '\n' ' ')"
|
||||
# перевести размеры файла в человеко-читаемую строку, отбросить нули из дробной части и добавить пробел
|
||||
function BKM { numfmt --to=iec --format="%.2f" --suffix="B" "$1" | sed -r 's|,{,1}0{,2}([BKM])| \1|'; }
|
||||
rm -rf .git
|
||||
git init -b master
|
||||
git remote add "$domain" "git@$domain:$owner/$repo.git"
|
||||
git add .git*
|
||||
git commit -m "Инициализация / $dir"
|
||||
if [ "$domain" == "hub.mos.ru" ]; then
|
||||
echo "Второй пуш, потому что лингвист с первого раза не срабатывает."
|
||||
if [[ -z "$1" || "$1" == "push" ]]; then
|
||||
echo "Подключение к удалённому репозиторию и передача данных."
|
||||
git remote add "$domain" "git@$domain:$owner/$repo.git"
|
||||
git push -u "$domain" master
|
||||
fi
|
||||
find . -type f | grep -E 'CONTRIBUTING|LICENSE' | xargs git add
|
||||
git commit -m "Открытая лицензия РФ"
|
||||
find . -type f -name '*.md' | grep -E 'TREE|WIKI|README|VIEW' | xargs git add
|
||||
git commit -m "Описание проекта"
|
||||
find . -type f | grep -E '(yml|Gemfile.*|gemspec|robots.txt)$' | xargs git add
|
||||
git commit -m "Настройки"
|
||||
git add \*.sh
|
||||
git commit -m "Скрипты bash"
|
||||
find . -type f | grep -E '(min.css|min.js|woff)$' | xargs git add
|
||||
git commit -m "Сторонние материалы"
|
||||
find . -type f | grep -E '(bmp|gif|ico|jpg|png|svg)$' | xargs git add
|
||||
git commit -m "Картинки"
|
||||
while read -r file size; do
|
||||
echo "Обработка: $file"
|
||||
git add "$file"
|
||||
git commit -m "${file#*/} / $(BKM "$size")"
|
||||
done < <(eval "find . -type f $exclusions -printf '%p %s\n'" | LC_COLLATE=C sort -r)
|
||||
git push -u "$domain" master
|
||||
echo "Общее время выполнения: $(($(date '+%s%3N') - time_ms)) мс."
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
#!/bin/bash
|
||||
echo "Образец скрипта для тестирования доступности страниц в вёб-интерфейсе на сервере."
|
||||
domain="git.org.ru" && source info_param.sh
|
||||
# две страницы для тестирования
|
||||
file="DIRECTORY_TREE.md"
|
||||
if [ "$domain" == "hub.mos.ru" ]; then
|
||||
folder="blob" && wiki_home="-/wikis/home"
|
||||
else
|
||||
folder="src/branch" && wiki_home="wiki"
|
||||
fi
|
||||
# подготовка массива строк — адрес страницы и название файла через пробел
|
||||
for repo in {1..6}; do
|
||||
#pages+=("'https://$domain/golovin/$repo/$folder/master/$file' '$file'")
|
||||
pages+=("'https://$domain/pomodoro/$repo/$folder/master/$file' '$file'")
|
||||
pages+=("'https://$domain/pomodoro/$repo/$wiki_home' 'Home'")
|
||||
done
|
||||
for repo in {pomodoro,older-tomato-theme,color-tomato-theme}; do
|
||||
pages+=("'https://$domain/golovin/$repo/$folder/master/$file' '$file'")
|
||||
pages+=("'https://$domain/golovin/$repo/$wiki_home' 'Home'")
|
||||
done
|
||||
# тестирование доступности страниц
|
||||
function testing {
|
||||
# название файла должно находиться в заголовке страницы, иначе сервер должен вернуть ошибку
|
||||
case "$(curl "$1" 2>/dev/null | grep -oP '(?<=<title>).*(?=</title>)' | grep -cF "$2")" in
|
||||
0) color="91" ;; # светло-красный цвет для отсутствующих страниц
|
||||
*) color="0" ;; # обычный цвет для всех остальных страниц
|
||||
esac
|
||||
# текст соответствующего цвета и адрес страницы
|
||||
printf "\e[${color}m%s\e[0m %s\n" "Страница:" "$1"
|
||||
}
|
||||
export -f testing
|
||||
time_ms="$(date '+%s%3N')"
|
||||
# запуск параллельного тестирования строк массива и сортировка результатов
|
||||
printf "testing %s\0" "${pages[@]}" | xargs -n1 -0 -P0 bash -c | sort -r -k2
|
||||
echo "Общее время выполнения: $(($(date '+%s%3N') - time_ms)) мс."
|
|
@ -1,50 +1,62 @@
|
|||
#!/bin/bash
|
||||
echo "Параллельное выполнение скриптов и публикация репозиториев для каталогов проектов."
|
||||
echo "Публикация исходного кода из каталогов проектов."
|
||||
# выполнение скриптов внутри каталога
|
||||
function orchestrate {
|
||||
dir="${1#*:}" && red="\e[91m" && green="\e[92m" && norm="\e[0m"
|
||||
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" || return
|
||||
pattern="^HTTP/[1,2].{,2}? [4,5]"
|
||||
printf "${pre}%s${aft}" "Создание репозитория на сервере."
|
||||
for ((ms1 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms1 < 60000; pass = 0)); do
|
||||
# 1 Создание удалённого репозитория и проверка корректности ответов от сервера
|
||||
for ((dot = 1, ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; dot++, remote = 0)); do
|
||||
ellipsis="$(seq -s '.' 0 "$dot" | tr -d '0-9')"
|
||||
case "$(./.repo_remote.sh 2>/dev/null | tail -n+10 | grep -cE "$pattern")" in
|
||||
0) remote=1 && break ;; *) printf "${pre}%s${aft}" "Ошибка 400-500 при подключении к серверу${ellipsis}" ;;
|
||||
esac
|
||||
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${aft}" "Создание локального репозитория." ;;
|
||||
*) printf "${pre}%s${aft}" "Создание на сервере более 10 секунд." && continue ;;
|
||||
1) printf "${pre}%s %s${aft}" "[#######••]" "Создание локального репозитория." ;;
|
||||
*) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Создание на сервере более 20 секунд." && continue ;;
|
||||
esac
|
||||
# 2 Создание локального репозитория и отправка данных на сервер
|
||||
./.repo_local.sh &>/dev/null
|
||||
# 3 Проверка доступности данных в вёб-интерфейсе на сервере
|
||||
printf "${pre}%s${aft}" "Проверка доступности данных."
|
||||
for ((dot = 1, ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; dot++, testing = 0)); do
|
||||
ellipsis="$(seq -s '.' 0 "$dot" | tr -d '0-9')"
|
||||
case "$(./.repo_testing.sh 2>/dev/null | grep -cF "[91m")" in
|
||||
0) testing=1 && break ;; *) printf "${pre}%s${aft}" "Ожидание данных на сервере${ellipsis}" ;;
|
||||
esac
|
||||
./.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}%s${aft}" "Проверка данных более 10 секунд." ;;
|
||||
*) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••••]" "Проверка данных более 20 секунд." ;;
|
||||
esac
|
||||
done
|
||||
case "$pass" in
|
||||
1) printf "${pre}${green}%s${norm}${aft}" "Выполнено." ;;
|
||||
*) printf "${pre}${red}%s${norm}${aft}" "Ожидание более 60 секунд." ;;
|
||||
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 -not -name ".idea" -printf '%P\n' | sort -r | grep -n '\S')
|
||||
# поиск всех каталогов на одном уровне с текущим, кроме папки ".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
|
||||
# вывод строк массива и параллельный запуск функции для каждого каталога
|
||||
|
|
|
@ -1,43 +1,49 @@
|
|||
#!/bin/bash
|
||||
echo "Параллельное выполнение скриптов и развёртывание вёб-сайтов на сервере codeberg."
|
||||
echo "Публикация готовых вёб-сайтов на сервере codeberg."
|
||||
# выполнение скрипта внутри каталога вёб-сайта
|
||||
function pages2 {
|
||||
dir="pomodoro${1}" && red="\e[91m" && green="\e[92m" && norm="\e[0m"
|
||||
dir="pomodoro${1}" && red="\e[91m" && green="\e[92m" && yellow="\e[93m" && norm="\e[0m"
|
||||
# соответствующая строка для вывода сообщений по ходу выполнения функции
|
||||
num="$((7 - ${1}))" && pre="\e[${num}A${dir}: " && aft="\e[K\e[${num}B\r"
|
||||
cd "$dir" || return
|
||||
pattern="^HTTP/[1,2].{,2}? [4,5]"
|
||||
printf "${pre}%s${aft}" "Создание репозитория на сервере."
|
||||
for ((ms1 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms1 < 60000; pass = 0)); do
|
||||
# 1 Создание удалённого репозитория и проверка корректности ответов от сервера
|
||||
for ((dot = 1, ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; dot++, remote = 0)); do
|
||||
ellipsis="$(seq -s '.' 0 "$dot" | tr -d '0-9')"
|
||||
case "$(./.repo_pages2.sh "remote" 2>/dev/null | tail -n+10 | grep -cE "$pattern")" in
|
||||
0) remote=1 && break ;; *) printf "${pre}%s${aft}" "Ошибка 400-500 при подключении к серверу${ellipsis}" ;;
|
||||
esac
|
||||
num="$((7 - ${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_pages2.sh "delete" &>/dev/null
|
||||
printf "${pre}%s %s${aft}" "[##•••••]" "Создание нового репозитория в группе."
|
||||
./.repo_pages2.sh "create" &>/dev/null || continue
|
||||
printf "${pre}%s %s${aft}" "[###••••]" "Изменение свойств репозитория."
|
||||
./.repo_pages2.sh "patch" &>/dev/null || continue
|
||||
printf "${pre}%s %s${aft}" "[####•••]" "Добавление аватарки для репозитория."
|
||||
./.repo_pages2.sh "avatar" &>/dev/null || continue
|
||||
remote=1 && break # завершение цикла
|
||||
done
|
||||
case "$remote" in
|
||||
1) printf "${pre}%s${aft}" "Создание локального репозитория." ;;
|
||||
*) printf "${pre}%s${aft}" "Создание на сервере более 10 секунд." && continue ;;
|
||||
1) printf "${pre}%s %s${aft}" "[#####••]" "Создание локального репозитория." ;;
|
||||
*) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••]" "Создание на сервере более 20 секунд." && continue ;;
|
||||
esac
|
||||
# 2 Создание локального репозитория и отправка данных на сервер
|
||||
./.repo_pages2.sh "local" &>/dev/null
|
||||
printf "${pre}%s %s${aft}" "[######•]" "Отправка локальных данных на сервер."
|
||||
./.repo_pages2.sh "push" &>/dev/null
|
||||
# 3 Проверка корректности получения данных на сервере
|
||||
printf "${pre}%s${aft}" "Проверка доступности данных."
|
||||
for ((dot = 1, ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 10000; dot++, testing = 0)); do
|
||||
ellipsis="$(seq -s '.' 0 "$dot" | tr -d '0-9')"
|
||||
case "$(./.repo_pages2.sh "testing" 2>/dev/null | grep -cE "$pattern")" in
|
||||
0) testing=1 && break ;; *) printf "${pre}%s${aft}" "Ожидание данных на сервере${ellipsis}" ;;
|
||||
esac
|
||||
printf "${pre}%s %s${aft}" "[#######]" "Проверка получения данных на сервере."
|
||||
for ((lap = 1, ms2 = "$(date '+%s%3N')"; $(date '+%s%3N') - ms2 < 20000; lap++, testing = 0)); do
|
||||
track=7 && shift="$(tr -d '-' <<<$((lap / track % 2 * track - lap % track)))"
|
||||
progressbar="$(printf "[%$((track - shift))s" | sed 's| |•|g')$(printf "%${shift}s]" | sed 's| |#|g')"
|
||||
./.repo_pages2.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}%s${aft}" "Проверка данных более 10 секунд." ;;
|
||||
*) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••]" "Проверка данных более 20 секунд." ;;
|
||||
esac
|
||||
done
|
||||
case "$pass" in
|
||||
1) printf "${pre}${green}%s${norm}${aft}" "Выполнено." ;;
|
||||
*) printf "${pre}${red}%s${norm}${aft}" "Ожидание более 60 секунд." ;;
|
||||
1) printf "${pre}${green}%s${norm} %s${aft}" "[#######]" "Выполнено." ;;
|
||||
*) printf "${pre}${red}%s${norm} %s${aft}" "[•••••••]" "Ожидание более 10 минут." ;;
|
||||
esac
|
||||
}
|
||||
export -f pages2
|
||||
|
@ -45,7 +51,7 @@ cd ../.. # выход из папки и из репозитория
|
|||
time_ms="$(date '+%s%3N')"
|
||||
# смещение курсора вниз на соответствующее количество строк
|
||||
printf 'pomodoro%s\n' {1..6}
|
||||
# обход всех вёб-сайтов и параллельный запуск функции для каждого
|
||||
# вывод номеров вёб-сайтов и параллельный запуск функции для каждого
|
||||
printf 'pages2 "%s"\0' {1..6} | xargs -n1 -0 -P0 bash -c
|
||||
# замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды
|
||||
tms="$(($(date '+%s%3N') - time_ms))" && min="$((tms / 1000 / 60))" && sec="$((tms / 1000 % 60))"
|
||||
|
|
61
bash_scripts/suite_profile2.sh
Executable file
|
@ -0,0 +1,61 @@
|
|||
#!/bin/bash
|
||||
echo "Публикация оглавлений вёб-сайтов на сервере codeberg."
|
||||
# выполнение скрипта внутри каталога вёб-сайта
|
||||
function profile2 {
|
||||
dir="pomodoro" && red="\e[91m" && green="\e[92m" && yellow="\e[93m" && norm="\e[0m"
|
||||
# соответствующая строка для вывода сообщений по ходу выполнения функции
|
||||
case "$1" in "") dir="$dir " && num="6" ;; *) dir="$dir${1}" && num="$((6 - ${1}))" ;; esac
|
||||
pre="\e[${num}A${dir} " && aft="\e[K\e[${num}B\r"
|
||||
cd "${dir// /}" || { printf "${pre}${red}%s${norm} %s${aft}" "[•••••••]" "Не найден каталог." && return 1; }
|
||||
printf "${pre}%s %s${aft}" "[•••••••]" "Пересоздание файлов в каталоге."
|
||||
./.repo_profile2.sh "prepare" &>/dev/null
|
||||
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_profile2.sh "delete" &>/dev/null
|
||||
printf "${pre}%s %s${aft}" "[##•••••]" "Создание нового репозитория в группе."
|
||||
./.repo_profile2.sh "create" &>/dev/null || continue
|
||||
printf "${pre}%s %s${aft}" "[###••••]" "Изменение свойств репозитория."
|
||||
./.repo_profile2.sh "patch" &>/dev/null || continue
|
||||
printf "${pre}%s %s${aft}" "[####•••]" "Добавление аватарки для репозитория."
|
||||
./.repo_profile2.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_profile2.sh "local" &>/dev/null
|
||||
printf "${pre}%s %s${aft}" "[######•]" "Отправка локальных данных на сервер."
|
||||
./.repo_profile2.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=7 && shift="$(tr -d '-' <<<$((lap / track % 2 * track - lap % track)))"
|
||||
progressbar="$(printf "[%$((track - shift))s" | sed 's| |•|g')$(printf "%${shift}s]" | sed 's| |#|g')"
|
||||
./.repo_profile2.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 profile2
|
||||
cd ../.. # выход из папки и из репозитория
|
||||
time_ms="$(date '+%s%3N')"
|
||||
# смещение курсора вниз на соответствующее количество строк
|
||||
printf 'pomodoro%s\n' "" {1..5}
|
||||
# вывод номеров вёб-сайтов и параллельный запуск функции для каждого
|
||||
printf 'profile2 "%s"\0' "" {1..5} | 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"
|
27
bash_scripts/suite_testing.sh
Executable file
|
@ -0,0 +1,27 @@
|
|||
#!/bin/bash
|
||||
echo "Тестирование доступности страниц в вёб-интерфейсе на сервере."
|
||||
domain="git.org.ru" && source info_param.sh
|
||||
file="DIRECTORY_TREE.md" # две тестовые страницы для каждого проекта
|
||||
[ "$domain" == "hub.mos.ru" ] && folder="blob" || folder="src/branch"
|
||||
[ "$domain" == "hub.mos.ru" ] && wiki_home="-/wikis/home" || wiki_home="wiki"
|
||||
# подготовка массива строк — адрес страницы и название файла через пробел
|
||||
for repo in {1..6} {dispatcher,pomodoro,older-tomato-theme,color-tomato-theme}; do
|
||||
case "$repo" in [1-6]) owner="pomodoro" ;; *) owner="golovin" ;; esac
|
||||
pages+=("'https://$domain/$owner/$repo/$folder/master/$file' '$file'")
|
||||
pages+=("'https://$domain/$owner/$repo/$wiki_home' 'Home'")
|
||||
done
|
||||
# тестирование доступности страниц
|
||||
function testing {
|
||||
# название файла должно быть в заголовке страницы, иначе конвейер должен вернуть ошибку,
|
||||
# обычный цвет для существующих страниц, светло-красный цвет для несуществующих страниц
|
||||
curl -f "$1" 2>/dev/null | grep -q "<title>.*$2.*</title>" && color="0" || color="91"
|
||||
# текст соответствующего цвета и адрес страницы
|
||||
printf "\e[${color}m%s\e[0m %s\n" "Страница:" "$1"
|
||||
}
|
||||
export -f testing
|
||||
time_ms="$(date '+%s%3N')"
|
||||
# вывод строк массива, параллельный запуск функции и сортировка результатов
|
||||
printf "testing %s\0" "${pages[@]}" | xargs -n1 -0 -P0 bash -c | sort -k2
|
||||
# замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды
|
||||
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"
|
|
@ -1,17 +1,22 @@
|
|||
|  |
|
||||
|:------------------------------------------------|
|
||||
| archive_cleanup.png |
|
||||
|  |
|
||||
| archive_packaging.gif |
|
||||
|  |
|
||||
| info_references.png |
|
||||
|  |
|
||||
| info_tree_license.png |
|
||||
|  |
|
||||
| repo_compose.png |
|
||||
|  |
|
||||
| repo_testing.smpl.png |
|
||||
|  |
|
||||
| suite_orchestrate.gif |
|
||||
|  |
|
||||
| suite_pages2.gif |
|
||||
| Вывод в консоль |
|
||||
|:-------------------------------------------------------------|
|
||||
| [archive_backup.sh](../bash_scripts/archive_backup.sh) |
|
||||
|  |
|
||||
| [archive_cleanup.sh](../bash_scripts/archive_cleanup.sh) |
|
||||
|  |
|
||||
| [archive_packaging.sh](../bash_scripts/archive_packaging.sh) |
|
||||
|  |
|
||||
| [info_references.sh](../bash_scripts/info_references.sh) |
|
||||
|  |
|
||||
| [info_tree_license.sh](../bash_scripts/info_tree_license.sh) |
|
||||
|  |
|
||||
| [repo_compose.sh](../bash_scripts/repo_compose.sh) |
|
||||
|  |
|
||||
| [suite_orchestrate.sh](../bash_scripts/suite_orchestrate.sh) |
|
||||
|  |
|
||||
| [suite_pages2.sh](../bash_scripts/suite_pages2.sh) |
|
||||
|  |
|
||||
| [suite_profile2.sh](../bash_scripts/suite_profile2.sh) |
|
||||
|  |
|
||||
| [suite_testing.sh](../bash_scripts/suite_testing.sh) |
|
||||
|  |
|
||||
|
|
BIN
print_screen/archive_backup.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 113 KiB |
Before Width: | Height: | Size: 488 KiB After Width: | Height: | Size: 293 KiB |
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 110 KiB |
BIN
print_screen/suite_profile2.gif
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
print_screen/suite_testing.png
Normal file
After Width: | Height: | Size: 3.9 KiB |