agent: implement issue #7 - Fix: 修复 comment 的 bug
This commit is contained in:
@@ -38,6 +38,17 @@ class GiteaComment:
|
||||
updated_at: datetime | None
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class GiteaPullReview:
|
||||
id: int
|
||||
body: str
|
||||
author: str
|
||||
state: str
|
||||
html_url: str
|
||||
submitted_at: datetime | None
|
||||
updated_at: datetime | None
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class GiteaRepository:
|
||||
owner: str
|
||||
@@ -178,6 +189,55 @@ class GiteaClient:
|
||||
response.raise_for_status()
|
||||
return comment_from_payload(response.json())
|
||||
|
||||
def list_pull_request_reviews(self, *, owner: str, name: str, pr_number: int) -> list[GiteaPullReview]:
|
||||
reviews: list[GiteaPullReview] = []
|
||||
page = 1
|
||||
limit = 50
|
||||
while True:
|
||||
response = self.client.get(
|
||||
f"/repos/{owner}/{name}/pulls/{pr_number}/reviews",
|
||||
params={"page": page, "limit": limit},
|
||||
)
|
||||
if response.status_code == 404:
|
||||
return reviews
|
||||
response.raise_for_status()
|
||||
payload = response.json()
|
||||
if not payload:
|
||||
break
|
||||
reviews.extend(pull_review_from_payload(item) for item in payload)
|
||||
if len(payload) < limit:
|
||||
break
|
||||
page += 1
|
||||
return reviews
|
||||
|
||||
def list_pull_request_review_comments(
|
||||
self,
|
||||
*,
|
||||
owner: str,
|
||||
name: str,
|
||||
pr_number: int,
|
||||
review_id: int,
|
||||
) -> list[GiteaComment]:
|
||||
comments: list[GiteaComment] = []
|
||||
page = 1
|
||||
limit = 50
|
||||
while True:
|
||||
response = self.client.get(
|
||||
f"/repos/{owner}/{name}/pulls/{pr_number}/reviews/{review_id}/comments",
|
||||
params={"page": page, "limit": limit},
|
||||
)
|
||||
if response.status_code == 404:
|
||||
return comments
|
||||
response.raise_for_status()
|
||||
payload = response.json()
|
||||
if not payload:
|
||||
break
|
||||
comments.extend(review_comment_from_payload(item) for item in payload)
|
||||
if len(payload) < limit:
|
||||
break
|
||||
page += 1
|
||||
return comments
|
||||
|
||||
def close_issue(self, *, owner: str, name: str, issue_number: int) -> None:
|
||||
response = self.client.patch(
|
||||
f"/repos/{owner}/{name}/issues/{issue_number}",
|
||||
@@ -225,6 +285,20 @@ def pull_request_from_payload(payload: dict[str, Any]) -> GiteaPullRequest:
|
||||
)
|
||||
|
||||
|
||||
def pull_review_from_payload(payload: dict[str, Any]) -> GiteaPullReview:
|
||||
user_payload = payload.get("user") or {}
|
||||
author = user_payload.get("login") or user_payload.get("username") or ""
|
||||
return GiteaPullReview(
|
||||
id=int(payload["id"]),
|
||||
body=payload.get("body") or "",
|
||||
author=str(author),
|
||||
state=payload.get("state") or "",
|
||||
html_url=payload.get("html_url") or payload.get("url") or "",
|
||||
submitted_at=parse_gitea_dt(payload.get("submitted_at")),
|
||||
updated_at=parse_gitea_dt(payload.get("updated_at")),
|
||||
)
|
||||
|
||||
|
||||
def comment_from_payload(payload: dict[str, Any]) -> GiteaComment:
|
||||
user_payload = payload.get("user") or payload.get("poster") or {}
|
||||
author = user_payload.get("login") or user_payload.get("username") or ""
|
||||
@@ -238,6 +312,29 @@ def comment_from_payload(payload: dict[str, Any]) -> GiteaComment:
|
||||
)
|
||||
|
||||
|
||||
def review_comment_from_payload(payload: dict[str, Any]) -> GiteaComment:
|
||||
comment = comment_from_payload(payload)
|
||||
path = payload.get("path")
|
||||
position = payload.get("position") or payload.get("original_position")
|
||||
location_parts = []
|
||||
if path:
|
||||
location_parts.append(str(path))
|
||||
if position:
|
||||
location_parts.append(f"line {position}")
|
||||
if not location_parts:
|
||||
return comment
|
||||
location = ":".join(location_parts)
|
||||
body = f"Inline comment on {location}\n\n{comment.body}"
|
||||
return GiteaComment(
|
||||
id=comment.id,
|
||||
body=body,
|
||||
author=comment.author,
|
||||
html_url=comment.html_url,
|
||||
created_at=comment.created_at,
|
||||
updated_at=comment.updated_at,
|
||||
)
|
||||
|
||||
|
||||
def parse_gitea_dt(value: str | None) -> datetime | None:
|
||||
if not value:
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user