# План: Deploy разных git веток из одной папки
## Проблема
Сейчас проекты идентифицируются по `workdir` — два проекта в одной папке не работают корректно. Нет интеграции с git — нельзя деплоить конкретную ветку или удостовериться, что деплоится та ветка, которая задумана.
## Статус / подход
**Итеративная разработка.** Реализуем минимальный полезный шаг, пользуемся утилитой вживую, и только по мере реальных потребностей добавляем следующее.
Всё, что **не** реализовано сейчас (worktree, stash, `.env` sync и прочие edge cases), вынесено в отдельный файл `docs/git-branch-roadmap.md` — там детальная проработка, но **только для обсуждения**, на будущее. Сюда смотрим, когда понадобится следующий шаг.
---
## Шаг 1 (РЕАЛИЗУЕМ сейчас): поле `branch` + проверка совпадения при деплое
### Решение
Добавить опциональное поле `branch` в проект. Поведение при деплое:
- `branch` **не задан** → деплоим как раньше (полная совместимость, ничего не проверяем).
- `branch` **задан**:
- определить текущую git ветку в `workdir`;
- текущая **совпадает** с `branch` → деплоим напрямую;
- текущая **не совпадает** → **abort** с внятным сообщением.
Никаких worktree, stash, авто-переключений. Только безопасная проверка перед тем, как что-то улетит на прод.
> В подсказках пользователю используем `git switch`.
### Почему именно так
- Устраняет главный риск: деплой не той ветки, чем задумано (например, забыли переключиться с `main` на `hotfix`).
- Нулевая вероятность потери данных — мы ничего не двигаем, не переключаем, не stash'им.
- Минимум кода, ничего не ломает для существующих конфигов.
### Конфиг
```toml
[projects.my-app]
workdir = 'C:\projects\my-app'
branch = "staging"
```
Поле `branch` опционально. Без него — работает как раньше.
### UX
```bash
cd C:\projects\my-app # сейчас на ветке main, в конфиге branch = "staging"
xd deploy
# → error: project 'my-app' is on branch 'main', expected 'staging'.
# Switch branches: git switch staging
# Or deploy a different project.
```
### Изменения по файлам
#### 1. `src/config.rs` — поле `branch` (+валидация)
Добавить в struct `Project` опциональное строковое поле `branch`.
В `Config::validate` (рядом с остальными проверками проекта) добавить: если `branch` задан — отклонить пустую/пробельную строку (`.trim().is_empty()`). Также `.trim()` при сравнении в `deploy()` — чтобы `branch = " staging "` в конфиге корректно матчился с `staging` из git.
Note: валидацию «workdir — git repo» здесь **не** делаем (это рантайм-проверка, зависит от состояния машины, а не от конфига) — она в `deploy()`. В `validate` только синтаксическая проверка ветки.
#### 2. `src/git.rs` — НОВЫЙ МОДУЛЬ
Обёртка над git CLI через `std::process::Command`.
Одна функция `current_branch(workdir) -> Result