diff --git a/gitea_api.py b/gitea_api.py index cca9a3d..188cfff 100644 --- a/gitea_api.py +++ b/gitea_api.py @@ -36,7 +36,7 @@ class GiteaRepoManager: Generates a personal access token internally for API calls. """ - def __init__(self, api_url: str, username: str, password: str, token: Optional[str] = None, otp: Optional[str] = None): + def __init__(self, api_url: str, username: str, password: str, token: str): """ Initialize the GiteaRepoManager with API URL and credentials. @@ -53,59 +53,33 @@ class GiteaRepoManager: self.api_url = api_url.rstrip('/') self.username = username self.password = password - self.token = token or self.generate_token(otp) + self.token = token if self.token: self.headers = { "Authorization": f"token {self.token}", "Content-Type": "application/json" } - logger.info("Created API token 'script_token'. Delete from Gitea settings when done.") else: - logger.error("Failed to generate token during initialization.") - raise ValueError("Failed to generate token") + raise ValueError("Token is required.") - def generate_token(self, otp: Optional[str] = None) -> Optional[str]: - """ - Generate a personal access token for API authentication. - - Args: - otp (Optional[str]): One-time password for 2FA, if enabled. - - Returns: - Optional[str]: The generated token SHA1 string if successful, None otherwise. - """ - url = f"{self.api_url}/api/v1/users/{self.username}/tokens" - auth = (self.username, self.password) - headers = {"X-Gitea-OTP": otp} if otp else {} - data = {"name": "script_token"} - try: - response = requests.post(url, auth=auth, headers=headers, json=data) - logger.debug(f"Token generation request URL: {url}") - logger.debug(f"Request headers: {headers}") - logger.debug(f"Request data: {data}") - logger.debug(f"Response status code: {response.status_code}") - logger.debug(f"Response text: {response.text}") - if response.status_code == 201: - return response.json()["sha1"] - logger.error(f"Error generating token: {response.status_code} - {response.text}") - except requests.RequestException as e: - logger.error(f"Exception during token generation: {e}", exc_info=True) - return None - - def list_repositories(self) -> List[Dict[str, Any]]: + def list_repositories(self,page=1) -> List[Dict[str, Any]]: """ List repositories accessible with the current token. Returns: List[Dict[str, Any]]: List of repository data dictionaries. """ - url = f"{self.api_url}/repos/search?limit=500" + url = f"{self.api_url}/repos/search?limit=500&page={page}" try: response = requests.get(url, headers=self.headers) if response.status_code == 200: - logger.debug("Successfully listed repositories.") - return response.json().get('data', []) - logger.warning(f"Error listing repositories: {response.status_code} - {response.text}") + + result = response.json().get('data', []) + logger.info(f"Successfully listed {len(result)} repositories from page {page}.") + if result: + return result + self.list_repositories(page+1) + if page == 1: + logger.warning(f"Error listing repositories: {response.status_code} - {response.text}") except requests.RequestException as e: logger.error(f"Exception during listing repositories: {e}", exc_info=True) return [] diff --git a/main.py b/main.py index 7b726cc..54ac8ed 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,9 @@ import os import argparse from gitea_api import GiteaRepoManager +import logging +logging.basicConfig(level=logging.INFO) + # Reads by default .env read_env.load_env()