Добавлены скрипты для клонирования проектов из TSV-файла:

- clone_projects.sh — Bash-скрипт для Linux/Mac
- clone_projects.bat — Batch-скрипт для Windows
- projects.tsv — пример файла со списком проектов
- test_relative_paths.sh — вспомогательный скрипт для тестирования относительных путей
Обновлён .gitignore для корректной работы с этими файлами.
This commit is contained in:
2025-08-26 23:30:58 +04:00
parent 95a776e1c5
commit c9943521c5
5 changed files with 205 additions and 2 deletions

5
.gitignore vendored
View File

@@ -4,10 +4,11 @@
# But not these files...
!.gitignore
!.cursor/
!.cursor/**
!*.sh
!*.bat
!*.bash
!*.zsh
!*.fish
!*.mdc
!.cursor/**
!*.tsv

82
clone_projects.bat Executable file
View File

@@ -0,0 +1,82 @@
@echo off
setlocal enabledelayedexpansion
REM Скрипт для клонирования проектов из TSV файла
REM Формат TSV: check, project_name, project_url
REM Проверяем, что передан аргумент с именем файла
if "%~1"=="" (
echo Использование: %0 ^<tsv_file^> [base_dir]
echo Пример: %0 projects.tsv
echo Пример: %0 projects.tsv C:\Projects
echo Пример: %0 projects.tsv .\projects
echo Пример: %0 projects.tsv ..\workspace
exit /b 1
)
set TSV_FILE=%~1
set BASE_DIR=%~2
REM Если base_dir не указан, используем текущую директорию
if "!BASE_DIR!"=="" set BASE_DIR=.
REM Проверяем существование файла
if not exist "%TSV_FILE%" (
echo Ошибка: Файл '%TSV_FILE%' не найден
exit /b 1
)
REM Создаем базовую директорию, если она не существует
if not exist "!BASE_DIR!" (
echo Создаем базовую директорию: !BASE_DIR!
mkdir "!BASE_DIR!"
)
echo Начинаем клонирование проектов из файла: %TSV_FILE%
echo Базовая директория: !BASE_DIR!
echo ================================================
REM Читаем TSV файл построчно
for /f "usebackq delims=" %%a in ("%TSV_FILE%") do (
set "line=%%a"
REM Пропускаем пустые строки
if not "!line!"=="" (
REM Разбиваем строку по табуляции
for /f "tokens=1,2,3 delims= " %%b in ("!line!") do (
set "check=%%b"
set "project_name=%%c"
set "project_url=%%d"
REM Пропускаем заголовки
if not "!check!"=="check" (
REM Проверяем, нужно ли клонировать (если check = X)
if /i "!check!"=="X" (
echo Клонирование: !project_name!
echo URL: !project_url!
REM Проверяем, что директория не существует
set "PROJECT_PATH=!BASE_DIR!\!project_name!"
if exist "!PROJECT_PATH!" (
echo Предупреждение: Директория '!PROJECT_PATH!' уже существует, пропускаем
echo ---
) else (
REM Выполняем git clone
git clone "!project_url!" "!PROJECT_PATH!"
if !errorlevel! equ 0 (
echo ✓ Успешно клонирован: !project_name!
) else (
echo ✗ Ошибка при клонировании: !project_name!
)
echo ---
)
) else (
echo Пропускаем: !project_name! (check = '!check!')
)
)
)
)
)
echo Клонирование завершено!
pause

68
clone_projects.sh Executable file
View File

@@ -0,0 +1,68 @@
#!/bin/bash
# Скрипт для клонирования проектов из TSV файла
# Формат TSV: check, project_name, project_url
# Проверяем, что передан аргумент с именем файла
if [ $# -eq 0 ]; then
echo "Использование: $0 <tsv_file> [base_dir]"
echo "Пример: $0 projects.tsv"
echo "Пример: $0 projects.tsv /path/to/projects"
echo "Пример: $0 projects.tsv ./projects"
echo "Пример: $0 projects.tsv ../workspace"
exit 1
fi
TSV_FILE="$1"
BASE_DIR="${2:-.}" # Если base_dir не указан, используем текущую директорию
# Проверяем существование файла
if [ ! -f "$TSV_FILE" ]; then
echo "Ошибка: Файл '$TSV_FILE' не найден"
exit 1
fi
# Создаем базовую директорию, если она не существует
if [ ! -d "$BASE_DIR" ]; then
echo "Создаем базовую директорию: $BASE_DIR"
mkdir -p "$BASE_DIR"
fi
echo "Начинаем клонирование проектов из файла: $TSV_FILE"
echo "Базовая директория: $BASE_DIR"
echo "================================================"
# Читаем TSV файл, пропуская заголовок (если есть)
# Ожидаемый формат: check, project_name, project_url
while IFS=$'\t' read -r check project_name project_url; do
# Пропускаем пустые строки и строки с заголовками
if [[ -z "$check" || "$check" == "check" ]]; then
continue
fi
# Проверяем, нужно ли клонировать (если check = X)
if [[ "$check" == "X" || "$check" == "x" ]]; then
echo "Клонирование: $project_name"
echo "URL: $project_url"
# Проверяем, что директория не существует
PROJECT_PATH="$BASE_DIR/$project_name"
if [ -d "$PROJECT_PATH" ]; then
echo "Предупреждение: Директория '$PROJECT_PATH' уже существует, пропускаем"
echo "---"
continue
fi
# Выполняем git clone
if git clone "$project_url" "$PROJECT_PATH"; then
echo "✓ Успешно клонирован: $project_name"
else
echo "✗ Ошибка при клонировании: $project_name"
fi
echo "---"
else
echo "Пропускаем: $project_name (check = '$check')"
fi
done < "$TSV_FILE"
echo "Клонирование завершено!"

2
projects.tsv Normal file
View File

@@ -0,0 +1,2 @@
check project_name project_url
1 check project_name project_url

50
test_relative_paths.sh Executable file
View File

@@ -0,0 +1,50 @@
#!/bin/bash
# Тестовый скрипт для демонстрации работы с относительными путями
echo "=== Тест относительных путей ==="
echo "Текущая директория: $(pwd)"
echo ""
# Создаем тестовый TSV файл
cat > test_projects.tsv << EOF
check project_name project_url
X test-project-1 https://github.com/octocat/Hello-World.git
X test-project-2 https://github.com/octocat/Hello-World.git
EOF
echo "Создан тестовый файл: test_projects.tsv"
echo ""
# Тест 1: Без указания base_dir (текущая директория)
echo "Тест 1: Клонирование в текущую директорию"
./clone_projects.sh test_projects.tsv
echo ""
# Тест 2: Относительный путь ./projects
echo "Тест 2: Клонирование в ./projects"
./clone_projects.sh test_projects.tsv ./projects
echo ""
# Тест 3: Относительный путь ../test-workspace
echo "Тест 3: Клонирование в ../test-workspace"
./clone_projects.sh test_projects.tsv ../test-workspace
echo ""
# Тест 4: Относительный путь ./nested/folders
echo "Тест 4: Клонирование в ./nested/folders"
./clone_projects.sh test_projects.tsv ./nested/folders
echo ""
echo "=== Результаты ==="
echo "Структура директорий после тестов:"
find . -type d -name "test-project-*" 2>/dev/null | head -10
echo ""
# Очистка (опционально)
read -p "Удалить тестовые файлы и директории? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
rm -rf test_projects.tsv test-project-* projects test-workspace nested
echo "Тестовые файлы удалены"
fi