bot: Коммит — навигация по дереву репозитория #8

Closed
opened 2026-10-12 19:33:18 +03:00 by Eleboba · 2 comments
Owner

Описание

Требования C-1…C-4 из SPEC §4.1, ARCHITECTURE §2.3: интерактивное перемещение по директориям кнопками.

Желаемый результат

  • «📝 Коммит» → дерево origin/main: кнопки 📁/📄, «⬆️ Вверх», путь в заголовке, пагинация по 20.
  • Карточка файла: размер, последний коммит; «👁 Показать» (текстом или файлом), «✏️ Заменить», «🗑 Удалить» (действия — #26).
  • В папке — «➕ Новый файл», «📁 Новая папка» (#26).
  • Нажатие ≤ 2 с.

Подзадачи

  • app/repo/clone.py — локальный клон в volume, fetch не чаще раза в 10 с
  • app/repo/tree.py — ls-tree, show, последний коммит по пути
  • Экран браузера в app/bot/routers/commit.py, id → путь в FSM
  • Тесты на локальном bare-репозитории

Анализ

Затрагиваемые файлы

Файл Что меняется
app/repo/clone.py новый
app/repo/tree.py новый
app/bot/routers/commit.py браузер

Ограничения и риски

Пути не кладём в callback_data (лимит 64 байта). git — без shell, аргументы списком. Бинарные файлы — только «Показать» файлом.

Как проверить

Пройти services/hello/ и обратно, открыть файл, пагинация на папке с > 20 элементами.


Лог выполнения

2026-10-13

  • Задача переписана под SPEC v2 (QR-доступ, меню из 4 разделов, командная модель — ADR-011…013).

2026-10-15

  • app/repo/git.py (UploadsRepo): клон в GIT_CLONE_DIR, refresh() с троттлингом, list_dir (ls-tree -z -l: папки первыми, пробелы и кириллица в именах), read, last_commit, head. git — subprocess без shell, таймаут, ssh с -F /dev/null.
  • app/bot/routers/commit.py: браузер папки (📁/📄 · размер, ⬆️ Вверх, страницы по 20), карточка файла (размер, последний коммит), «👁 Показать» — <pre> с экранированием или документом для больших/бинарных. Кнопки «новый файл / папка / заменить / удалить» — заглушка до #26. В callback_data только действие + индекс, пути — в FSM.
  • Docker: ключ через GIT_SSH_KEY_B64 (во временный файл 0600 внутри контейнера), клон в volume /data.
  • Тесты: 14 новых на настоящем bare-репозитории (клон, fetch, троттлинг, пагинация, просмотр, бинарь), всего 87, покрытие 91 %.
  • Вживую клон с SourceCraft работает только с личным ключом владельца — ключ бота SourceCraft отвергает (см. #7). По решению владельца SourceCraft отложен; код от него не зависит (адрес и ключ — настройки).
## Описание Требования C-1…C-4 из [SPEC](https://gitea.24studbank.ru/HSE/tgit/src/branch/dev/docs/SPEC.md) §4.1, [ARCHITECTURE](https://gitea.24studbank.ru/HSE/tgit/src/branch/dev/docs/ARCHITECTURE.md) §2.3: интерактивное перемещение по директориям кнопками. ## Желаемый результат - «📝 Коммит» → дерево `origin/main`: кнопки 📁/📄, «⬆️ Вверх», путь в заголовке, пагинация по 20. - Карточка файла: размер, последний коммит; «👁 Показать» (текстом или файлом), «✏️ Заменить», «🗑 Удалить» (действия — #26). - В папке — «➕ Новый файл», «📁 Новая папка» (#26). - Нажатие ≤ 2 с. ## Подзадачи - [x] `app/repo/clone.py` — локальный клон в volume, `fetch` не чаще раза в 10 с - [x] `app/repo/tree.py` — `ls-tree`, `show`, последний коммит по пути - [x] Экран браузера в `app/bot/routers/commit.py`, id → путь в FSM - [x] Тесты на локальном bare-репозитории ## Анализ ### Затрагиваемые файлы | Файл | Что меняется | |------|--------------| | `app/repo/clone.py` | новый | | `app/repo/tree.py` | новый | | `app/bot/routers/commit.py` | браузер | ### Ограничения и риски Пути не кладём в callback_data (лимит 64 байта). git — без shell, аргументы списком. Бинарные файлы — только «Показать» файлом. ## Как проверить Пройти `services/hello/` и обратно, открыть файл, пагинация на папке с > 20 элементами. --- ## Лог выполнения ### 2026-10-13 - Задача переписана под SPEC v2 (QR-доступ, меню из 4 разделов, командная модель — ADR-011…013). ### 2026-10-15 - `app/repo/git.py` (`UploadsRepo`): клон в `GIT_CLONE_DIR`, `refresh()` с троттлингом, `list_dir` (`ls-tree -z -l`: папки первыми, пробелы и кириллица в именах), `read`, `last_commit`, `head`. git — subprocess без shell, таймаут, ssh с `-F /dev/null`. - `app/bot/routers/commit.py`: браузер папки (📁/📄 · размер, ⬆️ Вверх, страницы по 20), карточка файла (размер, последний коммит), «👁 Показать» — `<pre>` с экранированием или документом для больших/бинарных. Кнопки «новый файл / папка / заменить / удалить» — заглушка до #26. В callback_data только действие + индекс, пути — в FSM. - Docker: ключ через `GIT_SSH_KEY_B64` (во временный файл 0600 внутри контейнера), клон в volume `/data`. - Тесты: 14 новых на настоящем bare-репозитории (клон, fetch, троттлинг, пагинация, просмотр, бинарь), всего 87, покрытие 91 %. - Вживую клон с SourceCraft работает только с личным ключом владельца — ключ бота SourceCraft отвергает (см. #7). По решению владельца SourceCraft отложен; код от него не зависит (адрес и ключ — настройки).
Eleboba added this to the M1 · MVP: загрузка → коммит → CI milestone 2026-10-12 19:33:18 +03:00
Eleboba added the botfeaturesize/1 labels 2026-10-12 19:33:18 +03:00
Eleboba self-assigned this 2026-10-12 19:33:18 +03:00
Eleboba added a new dependency 2026-10-12 19:38:48 +03:00
Eleboba changed title from bot: приём и валидация .py-файлов, выбор проекта to bot: Коммит — навигация по дереву репозитория 2026-10-13 22:52:57 +03:00
Author
Owner

Смержено в dev через PR #38 (dbb17bd) — закрываю.

Смержено в `dev` через PR #38 (dbb17bd) — закрываю.
Author
Owner

Зависимость от #7 снята: репозиторий загрузок и ключ бота работают на Gitea (ADR-015), CI — Gitea Actions (ADR-016). #7 остаётся открытой только под SourceCraft.

Зависимость от #7 снята: репозиторий загрузок и ключ бота работают на Gitea (ADR-015), CI — Gitea Actions (ADR-016). #7 остаётся открытой только под SourceCraft.
Sign in to join this conversation.