From cbcf7737d0be07cc6975f532273a7f382af6ad16 Mon Sep 17 00:00:00 2001 From: repair-agent Date: Thu, 26 Mar 2026 11:16:32 +0800 Subject: [PATCH] fix: auto repair bugs #71 --- app/main.py | 25 +++++++++++++++++++++++-- test_bug71.db | Bin 0 -> 32768 bytes 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 test_bug71.db diff --git a/app/main.py b/app/main.py index 3e0ce13..54275e2 100644 --- a/app/main.py +++ b/app/main.py @@ -3,6 +3,7 @@ from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse from sqlmodel.ext.asyncio.session import AsyncSession from sqlmodel import select, func, text +from sqlalchemy.exc import IntegrityError from .database import init_db, get_session, get_engine from .models import ErrorLog, ErrorLogCreate, LogStatus, TaskStatusUpdate, RepairTask, RepairTaskCreate, Project, ProjectUpdate from .gitea_client import GiteaClient @@ -163,9 +164,29 @@ async def report_log(log_data: ErrorLogCreate, session: AsyncSession = Depends(g ) session.add(new_log) - await session.commit() - await session.refresh(new_log) + try: + await session.commit() + except IntegrityError: + await session.rollback() + # Race condition: another request inserted the same fingerprint concurrently. + # Re-query and update the existing record instead. + dup_stmt = select(ErrorLog).where(ErrorLog.fingerprint == fingerprint) + dup_results = await session.exec(dup_stmt) + dup_log = dup_results.first() + if dup_log: + dup_log.error_message = log_data.error.get("message", dup_log.error_message) + dup_log.stack_trace = log_data.error.get("stack_trace", dup_log.stack_trace) + dup_log.context = log_data.context or dup_log.context + dup_log.timestamp = log_data.timestamp or datetime.utcnow() + if log_data.commit_hash: + dup_log.commit_hash = log_data.commit_hash + session.add(dup_log) + await session.commit() + await session.refresh(dup_log) + return {"message": "Log deduplicated (content updated)", "id": dup_log.id, "status": dup_log.status} + raise + await session.refresh(new_log) return {"message": "Log reported", "id": new_log.id} # ==================== Agent Tasks ==================== diff --git a/test_bug71.db b/test_bug71.db new file mode 100644 index 0000000000000000000000000000000000000000..1a25295fdb41ae58ddaf09452b426f9c9df4e5f0 GIT binary patch literal 32768 zcmeI*Jqp4=5C+hR{|JU0A*Beh@d6&eMg)5U3Kk+r@Dg6y4VpH!!kgt|7IqhwcY!(V zch}}zUha?EsVO&6M3%+2EF+>ynSC=&eVH;!=_>0sJ-v$c^R;L%6cKry*Ynk9&5k{< z91$QufB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5;&-xQdnZ?!Z2+CENc=ll&*1}TaF0RjXF5FkK+009C7 J2oU&lfj1nu3EBVv literal 0 HcmV?d00001 -- 2.47.2