bot: Коммит — навигация по дереву репозитория #8
Notifications
Due Date
No due date set.
Blocks
Depends on
Reference: HSE/tgit#8
Reference in New Issue
Block a user
Описание
Требования C-1…C-4 из SPEC §4.1, ARCHITECTURE §2.3: интерактивное перемещение по директориям кнопками.
Желаемый результат
origin/main: кнопки 📁/📄, «⬆️ Вверх», путь в заголовке, пагинация по 20.Подзадачи
app/repo/clone.py— локальный клон в volume,fetchне чаще раза в 10 сapp/repo/tree.py—ls-tree,show, последний коммит по путиapp/bot/routers/commit.py, id → путь в FSMАнализ
Затрагиваемые файлы
app/repo/clone.pyapp/repo/tree.pyapp/bot/routers/commit.pyОграничения и риски
Пути не кладём в callback_data (лимит 64 байта). git — без shell, аргументы списком. Бинарные файлы — только «Показать» файлом.
Как проверить
Пройти
services/hello/и обратно, открыть файл, пагинация на папке с > 20 элементами.Лог выполнения
2026-10-13
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.GIT_SSH_KEY_B64(во временный файл 0600 внутри контейнера), клон в volume/data.bot: приём и валидация .py-файлов, выбор проектаto bot: Коммит — навигация по дереву репозиторияСмержено в
devчерез PR #38 (dbb17bd) — закрываю.Зависимость от #7 снята: репозиторий загрузок и ключ бота работают на Gitea (ADR-015), CI — Gitea Actions (ADR-016). #7 остаётся открытой только под SourceCraft.