Finishing touch.
This commit is contained in:
parent
10b7e3639f
commit
ed9f398992
48
gitea_api.py
48
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,58 +53,32 @@ 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', [])
|
||||
|
||||
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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user