-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcreate-worktree.bat
More file actions
210 lines (181 loc) · 7.04 KB
/
Copy pathcreate-worktree.bat
File metadata and controls
210 lines (181 loc) · 7.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
:: ============================================
:: TaleSpinner — создание нового git worktree
:: с копированием БД и .env конфигов
:: ============================================
set "REPO_ROOT=%~dp0"
set "REPO_ROOT=%REPO_ROOT:~0,-1%"
set "REMOTE_NAME=origin"
set "BASE_BRANCH=dev"
cd /d "%REPO_ROOT%"
:: Проверка, что мы в git-репозитории
git rev-parse --git-dir >nul 2>&1
if errorlevel 1 (
echo [Ошибка] Запустите скрипт из корня git-репозитория TaleSpinner.
pause
exit /b 1
)
echo.
echo === Создание нового worktree ===
echo.
echo Обновляем базовую ветку %REMOTE_NAME%/%BASE_BRANCH%...
git fetch "%REMOTE_NAME%" "%BASE_BRANCH%" >nul 2>&1
if errorlevel 1 (
echo [Ошибка] Не удалось обновить %REMOTE_NAME%/%BASE_BRANCH%.
pause
exit /b 1
)
git show-ref --verify --quiet "refs/remotes/%REMOTE_NAME%/%BASE_BRANCH%"
if errorlevel 1 (
echo [Ошибка] Ветка %REMOTE_NAME%/%BASE_BRANCH% не найдена.
pause
exit /b 1
)
:: Ввод названия worktree (папка)
set /p "WORKTREE_NAME=Введите название worktree (имя папки, например feature-auth): "
if "%WORKTREE_NAME%"=="" (
echo [Ошибка] Название не может быть пустым.
pause
exit /b 1
)
:: Убираем лишние пробелы и недопустимые символы
set "WORKTREE_NAME=%WORKTREE_NAME: =-%"
set "WORKTREE_NAME=%WORKTREE_NAME:/=-%"
set "WORKTREE_NAME=%WORKTREE_NAME:\=-%"
:: Ввод ветки
set /p "BRANCH_NAME=Введите имя ветки (существующей или новой, например feature/auth): "
if "%BRANCH_NAME%"=="" (
echo [Ошибка] Имя ветки не может быть пустым.
pause
exit /b 1
)
:: Путь к новому worktree (рядом с текущим проектом)
set "PARENT_DIR=%REPO_ROOT%\.."
set "WORKTREE_PATH=%PARENT_DIR%\TaleSpinner_%WORKTREE_NAME%"
set "MAIN_PATH=%PARENT_DIR%\TaleSpinner_v1"
set "SOURCE_ROOT=%REPO_ROOT%"
if /I not "%REPO_ROOT%"=="%MAIN_PATH%" (
if exist "%MAIN_PATH%\.git" (
set "SOURCE_ROOT=%MAIN_PATH%"
)
)
if exist "%WORKTREE_PATH%" (
echo [Ошибка] Папка уже существует: %WORKTREE_PATH%
pause
exit /b 1
)
echo.
echo Параметры:
echo Worktree: %WORKTREE_PATH%
echo Ветка: %BRANCH_NAME%
echo База: %REMOTE_NAME%/%BASE_BRANCH%
echo.
:: Создание worktree
set "BRANCH_SOURCE=new"
git show-ref --verify --quiet "refs/heads/%BRANCH_NAME%"
if not errorlevel 1 set "BRANCH_SOURCE=local"
if "%BRANCH_SOURCE%"=="new" (
git show-ref --verify --quiet "refs/remotes/%REMOTE_NAME%/%BRANCH_NAME%"
if not errorlevel 1 set "BRANCH_SOURCE=remote"
)
if "%BRANCH_SOURCE%"=="local" (
echo Ветка "%BRANCH_NAME%" найдена локально. Добавляем worktree...
git worktree add "%WORKTREE_PATH%" "%BRANCH_NAME%"
) else (
if "%BRANCH_SOURCE%"=="remote" (
echo Ветка "%BRANCH_NAME%" найдена на %REMOTE_NAME%. Создаём локальную tracking-ветку...
git worktree add --track -b "%BRANCH_NAME%" "%WORKTREE_PATH%" "%REMOTE_NAME%/%BRANCH_NAME%"
) else (
echo Ветка "%BRANCH_NAME%" не найдена. Создаём новую от %REMOTE_NAME%/%BASE_BRANCH%...
git worktree add --no-track -b "%BRANCH_NAME%" "%WORKTREE_PATH%" "%REMOTE_NAME%/%BASE_BRANCH%"
)
)
if errorlevel 1 (
echo [Ошибка] Не удалось создать worktree.
pause
exit /b 1
)
set "UPSTREAM_REF="
for /f "delims=" %%u in ('git -C "%WORKTREE_PATH%" rev-parse --abbrev-ref --symbolic-full-name "%BRANCH_NAME%@{upstream}" 2^>nul') do set "UPSTREAM_REF=%%u"
if /I not "%BRANCH_NAME%"=="%BASE_BRANCH%" (
if /I "!UPSTREAM_REF!"=="%REMOTE_NAME%/%BASE_BRANCH%" (
git -C "%WORKTREE_PATH%" branch --unset-upstream "%BRANCH_NAME%" >nul 2>&1
echo [OK] Для ветки %BRANCH_NAME% снят upstream %REMOTE_NAME%/%BASE_BRANCH% (защита от случайного push в dev)
)
)
echo.
echo Worktree создан. Копируем данные...
echo.
:: Копирование server/.env
set "SRC_ENV=%SOURCE_ROOT%\server\.env"
set "DST_ENV=%WORKTREE_PATH%\server\.env"
if exist "%SRC_ENV%" (
if not exist "%WORKTREE_PATH%\server" mkdir "%WORKTREE_PATH%\server"
copy /Y "%SRC_ENV%" "%DST_ENV%" >nul
echo [OK] Скопирован server\.env
) else (
echo [Пропуск] server\.env не найден в исходном проекте
)
:: Копирование server/data/ (БД и связанные файлы)
set "SRC_DATA=%SOURCE_ROOT%\server\data"
set "DST_DATA=%WORKTREE_PATH%\server\data"
if exist "%SRC_DATA%" (
if not exist "%DST_DATA%" mkdir "%DST_DATA%"
:: db.sqlite и WAL-файлы
for %%f in (db.sqlite db.sqlite-wal db.sqlite-shm db.sqlite-journal) do (
if exist "%SRC_DATA%\%%f" (
copy /Y "%SRC_DATA%\%%f" "%DST_DATA%\%%f" >nul
echo [OK] Скопирован server\data\%%f
)
)
:: Дополнительно: media и config, если есть
if exist "%SRC_DATA%\media" (
xcopy /E /I /Y /Q "%SRC_DATA%\media" "%DST_DATA%\media" >nul 2>&1
echo [OK] Скопирована папка server\data\media
)
if exist "%SRC_DATA%\config" (
xcopy /E /I /Y /Q "%SRC_DATA%\config" "%DST_DATA%\config" >nul 2>&1
echo [OK] Скопирована папка server\data\config
)
) else (
echo [Пропуск] server\data не найдена
)
:: Копирование .env из web, если есть
set "SRC_WEB_ENV=%SOURCE_ROOT%\web\.env"
set "SRC_WEB_ENV_LOCAL=%SOURCE_ROOT%\web\.env.local"
if exist "%SRC_WEB_ENV%" (
if not exist "%WORKTREE_PATH%\web" mkdir "%WORKTREE_PATH%\web"
copy /Y "%SRC_WEB_ENV%" "%WORKTREE_PATH%\web\.env" >nul
echo [OK] Скопирован web\.env
)
if exist "%SRC_WEB_ENV_LOCAL%" (
if not exist "%WORKTREE_PATH%\web" mkdir "%WORKTREE_PATH%\web"
copy /Y "%SRC_WEB_ENV_LOCAL%" "%WORKTREE_PATH%\web\.env.local" >nul
echo [OK] Скопирован web\.env.local
)
:: Установка зависимостей в новом worktree
echo.
echo Установка зависимостей...
cd /d "%WORKTREE_PATH%"
call yarn install
if errorlevel 1 (
echo [Предупреждение] yarn install завершился с ошибкой.
) else (
call yarn install:all
if errorlevel 1 (
echo [Предупреждение] yarn install:all завершился с ошибкой.
) else (
echo [OK] Зависимости установлены.
)
)
echo.
echo === Готово ===
echo.
echo Новый worktree: %WORKTREE_PATH%
echo Ветка: %BRANCH_NAME%
echo.
echo Для обновления БД из основного каталога используйте: sync-db-from-main.bat
echo.
pause