feat: persist repository rename identity
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Build and Publish Multi-Context Image / build-and-push (push) Successful in 24s

Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a049a4-ee9f-78e1-9d66-2cb0f9bea3e3
This commit is contained in:
tegwick 2026-08-28 22:08:21 +02:00
parent 13f7a10018
commit 8988a093f2
10 changed files with 1454 additions and 4 deletions

View file

@ -11,6 +11,7 @@ from pathlib import Path
from fastapi import APIRouter, Depends, HTTPException, Response, status
from sqlalchemy import case, func, or_, select
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import noload
@ -28,6 +29,7 @@ from api.models.domain import Domain
from api.models.interface_change import InterfaceChange
from api.models.managed_repo import ManagedRepo
from api.models.repo_goal import RepoGoal
from api.models.repository_rename import RepositorySlug
from api.models.tpsc import TPSCSnapshot
from api.models.task import Task
from api.models.workplan import Workplan
@ -51,6 +53,7 @@ from api.schemas.managed_repo import (
from api.services.sbom_nexus import SBOMNexusError
from api.services.sbom_nexus import get_json as get_sbom_nexus_json
from api.services.sbom_nexus import reads_from_nexus
from api.services.repository_identity import stage_initial_repository_identity
from hub_core.routers.repos import create_repos_router
router = APIRouter(prefix="/repos", tags=["repos"])
@ -150,7 +153,10 @@ async def register_repo(
if domain_obj is None:
raise HTTPException(status_code=404, detail=f"Domain '{body.domain_slug}' not found")
existing = await session.execute(select(ManagedRepo).where(ManagedRepo.slug == body.slug))
if existing.scalar_one_or_none():
claimed_slug = await session.execute(
select(RepositorySlug).where(RepositorySlug.slug == body.slug)
)
if existing.scalar_one_or_none() or claimed_slug.scalar_one_or_none():
raise HTTPException(status_code=409, detail=f"Repo slug '{body.slug}' already exists")
payload = body.model_dump()
@ -179,7 +185,16 @@ async def register_repo(
standard_version=body.standard_version,
)
session.add(repo)
await session.commit()
await session.flush()
stage_initial_repository_identity(session, repo)
try:
await session.commit()
except IntegrityError as exc:
await session.rollback()
raise HTTPException(
status_code=409,
detail=f"Repo slug '{body.slug}' is already claimed",
) from exc
await session.refresh(repo)
await _publish_repo_registered(repo, body, domain_obj)
return repo