1
0
mirror of https://github.com/openSUSE/osc.git synced 2025-08-22 06:28:53 +02:00
Files
github.com_openSUSE_osc/osc/gitea_api/branch.py

100 lines
3.0 KiB
Python

from typing import List
from typing import Optional
from .connection import Connection
from .connection import GiteaHTTPResponse
from .exceptions import BranchExists
class Branch:
def __init__(self, data: dict, *, response: Optional[GiteaHTTPResponse] = None):
self._data = data
self._response = response
@property
def commit(self) -> str:
return self._data["commit"]["id"]
@property
def name(self) -> str:
return self._data["name"]
@classmethod
def get(
cls,
conn: Connection,
owner: str,
repo: str,
branch: str,
) -> "Branch":
"""
Retrieve details about a repository branch.
:param conn: Gitea ``Connection`` instance.
:param owner: Owner of the repo.
:param repo: Name of the repo.
:param branch: Name of the branch.
"""
url = conn.makeurl("repos", owner, repo, "branches", branch)
response = conn.request("GET", url, context={"owner": owner, "repo": repo})
obj = cls(response.json(), response=response)
return obj
@classmethod
def list(
cls,
conn: Connection,
owner: str,
repo: str,
) -> List["Branch"]:
"""
Retrieve details about all repository branches.
:param conn: Gitea ``Connection`` instance.
:param owner: Owner of the repo.
:param repo: Name of the repo.
"""
q = {
"limit": -1,
}
url = conn.makeurl("repos", owner, repo, "branches", query=q)
# XXX: returns 'null' when there are no branches; an empty list would be a better API
response = conn.request("GET", url)
obj_list = [cls(i, response=response) for i in response.json() or []]
return obj_list
@classmethod
def create(
cls,
conn: Connection,
owner: str,
repo: str,
*,
old_ref_name: Optional[str] = None,
new_branch_name: str,
exist_ok: bool = False,
) -> "Branch":
"""
Create a new branch in a repository.
:param conn: Gitea ``Connection`` instance.
:param owner: Owner of the repo.
:param repo: Name of the repo.
:param old_ref_name: Name of the old branch/tag/commit to create from.
:param new_branch_name: Name of the branch to create.
:param exist_ok: A ``BranchExists`` exception is raised when the target exists. Set to ``True`` to avoid throwing the exception.
"""
json_data = {
"new_branch_name": new_branch_name,
"old_ref_name": old_ref_name,
}
url = conn.makeurl("repos", owner, repo, "branches")
try:
response = conn.request("POST", url, json_data=json_data, context={"owner": owner, "repo": repo, "branch": new_branch_name})
obj = cls(response.json(), response=response)
return obj
except BranchExists:
if not exist_ok:
raise
return cls.get(conn, owner, repo, new_branch_name)