fix: keep Gitea links on configured forge (Closes #1072)
CI / lint (pull_request) Successful in 2m47s
CI / build-release (pull_request) Successful in 6s
CI / browser-journey (pull_request) Successful in 2m8s
CI / release-candidate (pull_request) Has been skipped

This commit is contained in:
timmy committed 2026-08-18 08:58:35 +00:00
1 parent 0472e88d91
commit 79f6cecab4
9 files changed
+153 -123

No files matched your search

+22 -29
View File
@@ -445,7 +445,7 @@ def _normalize_global_search_item(item: Any, kind: str) -> dict | None:
return None
repository = item.get("repository")
repository = repository if isinstance(repository, dict) else {}
url = _safe_web_url(item.get("html_url"))
url = _safe_gitea_web_url(item.get("html_url"))
if not (
isinstance(item.get("number"), int)
and isinstance(item.get("title"), str)
@@ -614,7 +614,7 @@ async def work_preview(repository: str, kind: str, number: int) -> dict:
if isinstance(label, dict) and isinstance(label.get("name"), str)
],
"assignees": assignee_names,
"url": _safe_web_url(issue.get("html_url")),
"url": _safe_gitea_web_url(issue.get("html_url")),
"claimable": actual_kind == "issue" and state == "open" and not assignee_names,
"reopenable": actual_kind == "issue" and state == "closed",
"assigned_to_me": bool(login and login in assignee_names),
@@ -650,7 +650,7 @@ def _normalize_available_issue(item: Any) -> dict | None:
"assignees": [],
"updated_at": item.get("updated_at", "")
if isinstance(item.get("updated_at"), str) else "",
"url": _safe_web_url(item.get("html_url")),
"url": _safe_gitea_web_url(item.get("html_url")),
}
@@ -756,13 +756,6 @@ async def issues() -> WorkItems:
)
def _safe_web_url(value: Any) -> str:
if not isinstance(value, str):
return ""
parsed = urlsplit(value)
return value if parsed.scheme in {"http", "https"} and parsed.netloc else ""
def _safe_gitea_web_url(value: Any) -> str:
if not isinstance(value, str) or not value.strip():
return ""
@@ -819,8 +812,8 @@ def _normalize_notifications(threads: Any) -> list[dict]:
subject = thread.get("subject")
repository = repository if isinstance(repository, dict) else {}
subject = subject if isinstance(subject, dict) else {}
subject_url = _safe_web_url(subject.get("html_url"))
latest_url = _safe_web_url(subject.get("latest_comment_html_url"))
subject_url = _safe_gitea_web_url(subject.get("html_url"))
latest_url = _safe_gitea_web_url(subject.get("latest_comment_html_url"))
number_text = (
urlsplit(subject_url).path.rstrip("/").rsplit("/", 1)[-1]
if subject_url
@@ -1053,8 +1046,8 @@ async def notification_detail(thread_id: int) -> dict:
comment = comment if isinstance(comment, dict) else {}
user_value = comment.get("user")
user = user_value if isinstance(user_value, dict) else {}
subject_url = _safe_web_url(subject.get("html_url"))
latest_url = _safe_web_url(comment.get("html_url")) or _safe_web_url(
subject_url = _safe_gitea_web_url(subject.get("html_url"))
latest_url = _safe_gitea_web_url(comment.get("html_url")) or _safe_gitea_web_url(
subject.get("latest_comment_html_url")
)
assignee_values = subject_detail.get("assignees")
@@ -1236,7 +1229,7 @@ async def upload_notification_attachment(
if not isinstance(attachment, dict):
raise ValueError("Gitea attachment response was not an object")
name = attachment.get("name")
url = _safe_web_url(attachment.get("browser_download_url"))
url = _safe_gitea_web_url(attachment.get("browser_download_url"))
size = attachment.get("size")
if not isinstance(name, str) or not name or not url or not isinstance(size, int):
raise ValueError("Gitea did not confirm the attachment")
@@ -1275,7 +1268,7 @@ def _normalize_issue_comment(comment: dict) -> dict:
"created_at": comment.get("created_at", "")
if isinstance(comment.get("created_at"), str)
else "",
"url": _safe_web_url(comment.get("html_url")),
"url": _safe_gitea_web_url(comment.get("html_url")),
}
@@ -1357,7 +1350,7 @@ async def upload_assigned_issue_attachment(
if not isinstance(attachment, dict):
raise ValueError("Gitea attachment response was not an object")
name = attachment.get("name")
url = _safe_web_url(attachment.get("browser_download_url"))
url = _safe_gitea_web_url(attachment.get("browser_download_url"))
size = attachment.get("size")
if not isinstance(name, str) or not name or not url or not isinstance(size, int):
raise ValueError("Gitea did not confirm the attachment")
@@ -1383,7 +1376,7 @@ async def upload_preview_attachment(
if not isinstance(attachment, dict):
raise ValueError("Gitea attachment response was not an object")
name = attachment.get("name")
url = _safe_web_url(attachment.get("browser_download_url"))
url = _safe_gitea_web_url(attachment.get("browser_download_url"))
size = attachment.get("size")
if not isinstance(name, str) or not name or not url or not isinstance(size, int):
raise ValueError("Gitea did not confirm the attachment")
@@ -1410,7 +1403,7 @@ async def upload_assigned_pull_attachment(
if not isinstance(attachment, dict):
raise ValueError("Gitea attachment response was not an object")
name = attachment.get("name")
url = _safe_web_url(attachment.get("browser_download_url"))
url = _safe_gitea_web_url(attachment.get("browser_download_url"))
size = attachment.get("size")
if not isinstance(name, str) or not name or not url or not isinstance(size, int):
raise ValueError("Gitea did not confirm the attachment")
@@ -1586,7 +1579,7 @@ async def create_issue(
"updated_at": issue.get("updated_at", "")
if isinstance(issue.get("updated_at"), str)
else "",
"url": _safe_web_url(issue.get("html_url")),
"url": _safe_gitea_web_url(issue.get("html_url")),
}
@@ -1640,7 +1633,7 @@ async def claim_available_issue(repository: str, number: int) -> dict:
"assignees": logins,
"updated_at": confirmed.get("updated_at", "")
if isinstance(confirmed.get("updated_at"), str) else "",
"url": _safe_web_url(confirmed.get("html_url")),
"url": _safe_gitea_web_url(confirmed.get("html_url")),
}
@@ -1700,7 +1693,7 @@ async def reopen_issue(repository: str, number: int) -> dict:
"assignees": logins,
"updated_at": confirmed.get("updated_at", "")
if isinstance(confirmed.get("updated_at"), str) else "",
"url": _safe_web_url(confirmed.get("html_url")),
"url": _safe_gitea_web_url(confirmed.get("html_url")),
}
@@ -2256,7 +2249,7 @@ async def issue_detail(repository: str, number: int) -> dict:
and isinstance(issue["milestone"].get("title"), str)
else None
),
"url": _safe_web_url(issue.get("html_url")),
"url": _safe_gitea_web_url(issue.get("html_url")),
"labels": [
label["name"] for label in labels
if isinstance(label, dict) and isinstance(label.get("name"), str)
@@ -2297,7 +2290,7 @@ async def issue_dependencies(repository: str, number: int, limit: int = 20) -> l
"number": dependency_number,
"title": item.get("title", "") if isinstance(item.get("title"), str) else "",
"state": "open",
"url": _safe_web_url(item.get("html_url")),
"url": _safe_gitea_web_url(item.get("html_url")),
})
return dependencies
@@ -2425,7 +2418,7 @@ async def _update_issue_content(
"body": body,
"state": issue.get("state", "open"),
"updated_at": issue.get("updated_at", ""),
"url": _safe_web_url(issue.get("html_url")),
"url": _safe_gitea_web_url(issue.get("html_url")),
}
raise IssueEditConflictError("issue changed upstream")
@@ -2450,7 +2443,7 @@ async def _update_issue_content(
"body": body,
"state": confirmed.get("state", "open"),
"updated_at": confirmed.get("updated_at", ""),
"url": _safe_web_url(confirmed.get("html_url")),
"url": _safe_gitea_web_url(confirmed.get("html_url")),
}
@@ -2518,7 +2511,7 @@ async def resolve_work_route(
"number": number,
"title": target.get("title", "") if isinstance(target.get("title"), str) else "",
"state": state,
"url": _safe_web_url(target.get("html_url")),
"url": _safe_gitea_web_url(target.get("html_url")),
**({"is_review": True, "work_reasons": ["review_requested"]} if kind == "review" else {}),
**({
"is_filed": True,
@@ -2623,7 +2616,7 @@ async def pull_completion_detail(repository: str, number: int) -> dict:
"number": number,
"title": pull.get("title") if isinstance(pull.get("title"), str) else "",
"body": pull.get("body") if isinstance(pull.get("body"), str) else "",
"url": _safe_web_url(pull.get("html_url")),
"url": _safe_gitea_web_url(pull.get("html_url")),
"author": user.get("login") if isinstance(user.get("login"), str) else "",
"head_sha": sha,
"state": pull.get("state") if isinstance(pull.get("state"), str) else "",
@@ -2865,7 +2858,7 @@ async def submit_pull_review(
return {
"id": review.get("id"),
"state": review.get("state") or "COMMENT",
"url": _safe_web_url(review.get("html_url")),
"url": _safe_gitea_web_url(review.get("html_url")),
}