feat(create_release): add --keep-latest flag to delete previous releases #104
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Контекст
Мастер-копия
create_release.py(используется voice_assistant и — после перевода — video_uniq через curl-download) создаёт релиз и загружает asset, удаляя только existing release с тем же tag (идемпотентность). При новой версии (например v0.1.23) предыдущий релиз v0.1.22 остаётся в списке Releases. Пользователь хочет: при создании нового релиза автоматически удалять все предыдущие, оставляя только последний — чтобы в UI Forgejo всегда был один актуальный релиз.Сейчас удаление предыдущих релизов делается вручную (оркестратор через Python urllib, curl DELETE запрещён permission-правилами). Цель — автоматизировать в CI.
Задача
delete_previous_releases(repo: str, keep_id: int) -> Noneвcreate_release.py:GET /api/v1/repos/{repo}/releases→ список всех релизовrel['id'] != keep_id→DELETE /api/v1/repos/{repo}/releases/{rel['id']}_warn(f"deleting previous release {tag} (id={id})")для каждого удалённого--keep-latest(по умолчаниюFalse— обратно совместимо, существующие репо без флага не меняют поведение).main(): после успешногоcreate_release(repo, tag, body)(когда естьrelease_id), еслиargs.keep_latest→delete_previous_releases(repo, int(release_id)).Контракты
delete_previous_releases(repo, keep_id)использует существующий_api()helper (GET + DELETE).--keep-latest— opt-in:python ..\scripts\create_release.py --keep-latest._warn, не падают CI).Инварианты
delete_existing_release) + если--keep-latestудаляет все остальные.delete_existing_release(repo, tag)→create_release(repo, tag, body)→if keep_latest: delete_previous_releases(repo, release_id)→upload_asset(...).if not release_id: _die).Граничные случаи
delete_previous_releasesничего не делает, warn не печатает._api()уже вызывает_dieна HTTPError. Решение: для delete_previous использовать мягкую обработку (try/except HTTPError →_warn, не падать). Иначе один битый релиз заблокирует весь CI. Рекомендация: добавить параметрsoft: bool = Falseв_api()или отдельный_api_soft()для delete-цикла.rel['id'] != keep_id).Влияние на связанные компоненты
.opencode/scripts/create_release.py— +1 функцияdelete_previous_releases, +argparse, +3 строки в main()..opencode/scripts/release_notes.py— без изменений.voice_assistant/.github/workflows/release.yml— опционально добавить--keep-latest(отдельная задача пользователя, не этого issue).video_uniq/.github/workflows/release.yml— опционально добавить--keep-latest(после перевода video_uniq на curl-download, отдельная задача).Вне scope
git push --delete— требует push-прав, рискует текущим тегом).--keep-latest N(оставить N последних) — только boolean--keep-latest(1 последний).Критерии приемки
python create_release.py --helpпоказывает--keep-latestфлаг.--keep-latest— после успешного POST нового релиза все остальные релизы удаляются (остаётся только созданный).ruff check .opencode/scripts/create_release.py— чисто.mypy .opencode/scripts/create_release.py(если применимо) — 0 errors.slaid098 referenced this issue2026-08-19 00:34:24 +03:00
slaid098 referenced this issue2026-08-19 00:46:09 +03:00