2023-12-17 08:06:45 +03:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
echo "Построение дерева каталогов для каждого проекта и копирование файлов лицензии."
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# отсортированный список файлов и каталогов
|
2023-12-17 08:06:45 +03:00
|
|
|
|
function list_directory_contents {
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# сначала заглавные буквы, потом строчные, сначала каталоги, потом файлы
|
2023-12-17 08:06:45 +03:00
|
|
|
|
eval "LC_COLLATE=C ls -A --group-directories-first $exclusions $1"
|
|
|
|
|
}
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# дерево каталогов со ссылками
|
2023-12-17 08:06:45 +03:00
|
|
|
|
function directory_tree {
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# аргументы
|
2023-12-17 08:06:45 +03:00
|
|
|
|
local path="$1"
|
|
|
|
|
local head="$2"
|
|
|
|
|
local tail="$3"
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# префикс для текущего элемента
|
2023-12-17 08:06:45 +03:00
|
|
|
|
if [ "one" == "$4" ]; then
|
|
|
|
|
echo -n "/"
|
|
|
|
|
else
|
|
|
|
|
echo -ne "\n$head"
|
|
|
|
|
fi
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# текущий элемент дерева
|
2023-12-17 08:06:45 +03:00
|
|
|
|
echo -n "<a href='${path#*/}'>${path##*/}</a>"
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# рекурсивные вызовы для подкаталогов
|
2023-12-17 08:06:45 +03:00
|
|
|
|
if [ -d "$path" ]; then
|
2023-12-17 08:20:25 +03:00
|
|
|
|
local list # массив файлов и каталогов
|
2023-12-17 08:06:45 +03:00
|
|
|
|
readarray -t list <<<"$(list_directory_contents "$path")"
|
2023-12-17 08:20:25 +03:00
|
|
|
|
local len=${#list[@]} # размер массива
|
|
|
|
|
local i # счётчик
|
2023-12-17 08:06:45 +03:00
|
|
|
|
for ((i = 0; i < len; i++)); do
|
|
|
|
|
if [ -z "${list[$i]}" ]; then
|
2023-12-17 08:20:25 +03:00
|
|
|
|
continue # пропустить пустой каталог
|
2023-12-17 08:06:45 +03:00
|
|
|
|
elif ((len == 1)); then
|
|
|
|
|
directory_tree "$path/${list[$i]}" "$tail" "$tail" "one"
|
|
|
|
|
elif ((i < len - 1)); then
|
|
|
|
|
directory_tree "$path/${list[$i]}" "$tail├─ " "$tail│ "
|
|
|
|
|
else
|
|
|
|
|
directory_tree "$path/${list[$i]}" "$tail└─ " "$tail "
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
fi
|
|
|
|
|
}
|
2023-12-17 08:20:25 +03:00
|
|
|
|
cd .. # выходим из папки в корень репозитория
|
|
|
|
|
basedir=$(pwd) # текущий репозиторий
|
|
|
|
|
currentTimeMillis=$(date '+%s%3N')
|
|
|
|
|
# обходим все репозитории, расположенные на одном уровне с текущим
|
2023-12-17 08:06:45 +03:00
|
|
|
|
find .. -mindepth 1 -maxdepth 1 -type d | sort -r | while read -r dir; do
|
|
|
|
|
echo "Обработка: $dir"
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# заходим в каталог, иначе пропускаем итерацию
|
2023-12-17 08:06:45 +03:00
|
|
|
|
cd "$dir" || continue
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# строка исключений для 'ls' из списка '.gitignore' — неотслеживаемые файлы
|
2023-12-17 08:06:45 +03:00
|
|
|
|
exclusions="-I \".git\" $(sed 's/^/ -I "/;s/$/"/' .gitignore | tr -d '\n')"
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# помещаем дерево в контейнер, добавляем заголовок и выводим в файл
|
2023-12-17 08:06:45 +03:00
|
|
|
|
{
|
|
|
|
|
echo "## Дерево каталогов"
|
|
|
|
|
echo -ne "\n<pre>"
|
|
|
|
|
directory_tree .
|
|
|
|
|
echo -e "\n</pre>"
|
|
|
|
|
} >DIRECTORY_TREE.md
|
2023-12-17 08:20:25 +03:00
|
|
|
|
# копирование файлов из этого репозитория во все остальные
|
2023-12-17 08:06:45 +03:00
|
|
|
|
if [ "${dir##*/}" != "${basedir##*/}" ]; then
|
|
|
|
|
rm CONTRIBUTING.md
|
|
|
|
|
rm ./*LICENSE*
|
|
|
|
|
cp "$basedir"/CONTRIBUTING.md .
|
|
|
|
|
cp "$basedir"/*LICENSE* .
|
|
|
|
|
fi
|
|
|
|
|
done
|
2023-12-17 08:20:25 +03:00
|
|
|
|
echo "Время выполнения: $(("$(date '+%s%3N')" - "$currentTimeMillis")) мс."
|