filtrar repos por owner usando endpoints dedicados
This commit is contained in:
+38
-32
@@ -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 ----------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user