bot: Коммит — сообщение, Push, конфликты, публикация #9
Notifications
Due Date
No due date set.
Blocks
Depends on
Reference: HSE/tgit#9
Reference in New Issue
Block a user
Описание
Требования C-20…C-25 из SPEC §4.1, Publisher — ARCHITECTURE §2.3.
Желаемый результат
mainот бота с трейлеромTelegram-User: @user (id); ответ с sha и ссылкой ≤ 10 с, запись вpushes.base_shaпо тем же путям → «перезаписать»/«отменить».pull --rebaseпри отказе push (до 3 раз).Подзадачи
app/repo/publisher.pyАнализ
Затрагиваемые файлы
app/repo/publisher.pyapp/bot/routers/commit.pydocker-compose.ymlОграничения и риски
Ключ монтируется read-only. После успешного пуша черновик очищается только после подтверждения push от remote.
Как проверить
Два участника пушат одновременно в разные файлы — два коммита; в один файл — второму предложен конфликт.
Лог выполнения
2026-10-13
2026-10-15
app/repo/publisher.py: lock (пуши по одному) →fetch→ конфликт = пути черновика ∩git diff base_sha origin/main→checkout -B/reset --hard/clean→ применить черновик (удаление чистит опустевшие папки; путь вне клона → отказ) →add -A→ пусто? → коммит отtgit-botс трейлеромTelegram-User: @user (id)→push; отказ →fetch+rebase, до 3 раз; конфликт при rebase →CONFLICT. Лимит 20 пушей/час по таблицеpushes.GIT_COMMIT_URL_TEMPLATE, пока пусто) + «⏳ CI…». Конфликт → список файлов и «Перезаписать».pushesхранитchat_id/message_idсообщения о пуше — #11 будет обновлять его статусом CI/CD.../отклонён, лимит; плюс полный сценарий через бота до коммита в удалённом репозитории. Всего 136, покрытие 91 %.bot: GitPublisher — коммит загрузок в tgit-uploadsto bot: Коммит — сообщение, Push, конфликты, публикацияЗависимость от #7 снята: репозиторий загрузок и ключ бота работают на Gitea (ADR-015), CI — Gitea Actions (ADR-016). #7 остаётся открытой только под SourceCraft.
Смержено в
devчерез PR #38 — закрываю.