diff --git a/repoman.py b/repoman.py index 686046e..a880a53 100644 --- a/repoman.py +++ b/repoman.py @@ -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 ----------------------------------------------------------