import requests from git_flow import GitFlowError from git_flow.git import Commit from git_flow.remote.base import RemoteAPI class GiteaRemoteAPI(RemoteAPI): def __init__(self, base_url: str, repository: str, token: str) -> None: super().__init__(repository, token) self.base_url = base_url def create_pull_request( self, source: str, destination: str, title: str | None = None, description: str | None = None, close_source_branch: bool = True ) -> str: response = requests.post( self.get_endpoint("/pulls"), headers=self.get_headers(), json={ "title": title, "body": description, "head": source, "base": destination, }, ) if response.ok: return "PR creado exitosamente: " + response.json()["html_url"] else: raise GitFlowError("Ocurrió un error al crear el PR: " + response.text) def create_tag(self, tag: str, commit: str) -> str: response = requests.post( self.get_endpoint("/tags"), headers=self.get_headers(), json={"tag_name": tag, "target": commit}, ) if response.ok: return "Tag creado exitosamente: " + tag else: raise GitFlowError("Ocurrió un error al crear el tag: " + response.text) def get_merge_commits(self, merge_commit: str) -> list[Commit]: pr = self.get_json(self.get_endpoint(f"/commits/{merge_commit}/pull")).json() url = self.get_endpoint(f"/pulls/{pr['number']}/commits") items: list = [] page = 1 # Gitea pagina con page / limit while True: batch = self.get_json( url, {"page": page, "limit": 50, "files": "false", "verification": "false"} ).json() items += batch if len(batch) < 50: break page += 1 # La API los devuelve del más viejo al más nuevo return [ Commit( c["sha"][:7], c["commit"]["message"].splitlines()[0], c["commit"]["author"]["email"], len(c["parents"]) > 1, ) for c in reversed(items) ] def list_tags(self, suffix: str = "") -> list[str]: tags = self.get_all_pages(self.get_endpoint("/tags"), 50, size_param="limit") return [t["name"] for t in tags] def get_endpoint(self, resource: str) -> str: return f"{self.base_url}/api/v1/repos/{self.repository}{resource}" def get_headers(self): return { "Accept": "application/json", "Content-Type": "application/json", "Authorization": "token " + self.token, }