Recover external repository renames through verified Forgejo redirects
Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a070b5-4994-7271-bd8b-7c3dbcedec4b
This commit is contained in:
parent
022cf4b727
commit
fe6b8d96c2
4 changed files with 166 additions and 2 deletions
|
|
@ -12,7 +12,7 @@ import os
|
|||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from typing import Protocol
|
||||
from urllib.parse import quote
|
||||
from urllib.parse import quote, urljoin
|
||||
|
||||
import httpx
|
||||
|
||||
|
|
@ -32,6 +32,14 @@ class ForgeRepositoryUnreadable(ForgeRepositoryError):
|
|||
pass
|
||||
|
||||
|
||||
class ForgeRepositoryRedirected(ForgeRepositoryUnreadable):
|
||||
"""Requested coordinate redirects; no credentials are forwarded."""
|
||||
|
||||
def __init__(self, source_url: str, location: str):
|
||||
super().__init__("Forge repository coordinate redirects")
|
||||
self.target_url = urljoin(source_url, location) if location else None
|
||||
|
||||
|
||||
class ForgeRepositoryConflict(ForgeRepositoryError):
|
||||
pass
|
||||
|
||||
|
|
@ -106,6 +114,10 @@ class ForgejoRepositoryGateway:
|
|||
try:
|
||||
async with httpx.AsyncClient(timeout=timeout) as client:
|
||||
response = await client.get(url, headers=self._headers(token))
|
||||
if response.status_code in {301, 302, 303, 307, 308}:
|
||||
raise ForgeRepositoryRedirected(
|
||||
url, response.headers.get("location", "")
|
||||
)
|
||||
if response.status_code == 404:
|
||||
if token is None:
|
||||
raise ForgeRepositoryUnreadable(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue