filtrar repos por owner usando endpoints dedicados

This commit is contained in:
2026-05-18 10:26:13 +02:00
parent b5935f2511
commit d14c246bcb
+38 -32
View File
@@ -118,39 +118,45 @@ def gitea_get(cfg: Config, path: str, params: dict[str, str] | None = None) -> t
raise RuntimeError(f"no se pudo contactar con {cfg.url}: {e.reason}") from e
def fetch_remote_repos(cfg: Config, owner: str) -> list[RemoteRepo]:
repos: list[RemoteRepo] = []
page = 1
while True:
status, body, _ = gitea_get(
cfg,
"/repos/search",
{"owner": owner, "limit": "50", "page": str(page)},
def _parse_repo_list(body: bytes) -> list[RemoteRepo]:
items = json.loads(body or b"[]")
return [
RemoteRepo(
name=item.get("name", ""),
full_name=item.get("full_name", ""),
clone_url=item.get("clone_url", ""),
ssh_url=item.get("ssh_url", ""),
description=item.get("description") or "",
private=bool(item.get("private", False)),
default_branch=item.get("default_branch") or "main",
)
if status == 401:
raise RuntimeError("401 no autorizado — revisa server.token en la config")
if status >= 400:
raise RuntimeError(f"Gitea devolvió HTTP {status}: {body[:200].decode('utf-8', 'replace')}")
data = json.loads(body or b"{}")
items = data.get("data") or []
if not items:
break
for item in items:
repos.append(
RemoteRepo(
name=item.get("name", ""),
full_name=item.get("full_name", ""),
clone_url=item.get("clone_url", ""),
ssh_url=item.get("ssh_url", ""),
description=item.get("description") or "",
private=bool(item.get("private", False)),
default_branch=item.get("default_branch") or "main",
)
)
if len(items) < 50:
break
page += 1
return repos
for item in items
]
def fetch_remote_repos(cfg: Config, owner: str) -> list[RemoteRepo]:
"""Lista los repos de un owner. Prueba primero como organización, luego como usuario."""
for endpoint in (f"/orgs/{owner}/repos", f"/users/{owner}/repos"):
repos: list[RemoteRepo] = []
page = 1
found = False
while True:
status, body, _ = gitea_get(cfg, endpoint, {"limit": "50", "page": str(page)})
if status == 401:
raise RuntimeError("401 no autorizado — revisa server.token en la config")
if status == 404:
break # no es este tipo, probamos el siguiente
if status >= 400:
raise RuntimeError(f"Gitea devolvió HTTP {status}: {body[:200].decode('utf-8', 'replace')}")
found = True
items = _parse_repo_list(body)
repos.extend(items)
if len(items) < 50:
break
page += 1
if found:
return repos
raise RuntimeError(f"'{owner}' no existe como usuario ni como organización en el servidor")
# --- escaneo local ----------------------------------------------------------