filtrar repos por owner usando endpoints dedicados
This commit is contained in:
+26
-20
@@ -118,25 +118,9 @@ 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
|
raise RuntimeError(f"no se pudo contactar con {cfg.url}: {e.reason}") from e
|
||||||
|
|
||||||
|
|
||||||
def fetch_remote_repos(cfg: Config, owner: str) -> list[RemoteRepo]:
|
def _parse_repo_list(body: bytes) -> list[RemoteRepo]:
|
||||||
repos: list[RemoteRepo] = []
|
items = json.loads(body or b"[]")
|
||||||
page = 1
|
return [
|
||||||
while True:
|
|
||||||
status, body, _ = gitea_get(
|
|
||||||
cfg,
|
|
||||||
"/repos/search",
|
|
||||||
{"owner": owner, "limit": "50", "page": str(page)},
|
|
||||||
)
|
|
||||||
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(
|
RemoteRepo(
|
||||||
name=item.get("name", ""),
|
name=item.get("name", ""),
|
||||||
full_name=item.get("full_name", ""),
|
full_name=item.get("full_name", ""),
|
||||||
@@ -146,11 +130,33 @@ def fetch_remote_repos(cfg: Config, owner: str) -> list[RemoteRepo]:
|
|||||||
private=bool(item.get("private", False)),
|
private=bool(item.get("private", False)),
|
||||||
default_branch=item.get("default_branch") or "main",
|
default_branch=item.get("default_branch") or "main",
|
||||||
)
|
)
|
||||||
)
|
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:
|
if len(items) < 50:
|
||||||
break
|
break
|
||||||
page += 1
|
page += 1
|
||||||
|
if found:
|
||||||
return repos
|
return repos
|
||||||
|
raise RuntimeError(f"'{owner}' no existe como usuario ni como organización en el servidor")
|
||||||
|
|
||||||
|
|
||||||
# --- escaneo local ----------------------------------------------------------
|
# --- escaneo local ----------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user