Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion gitea/apiobject.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,13 +343,36 @@ def request(cls, gitea: "Gitea", owner: str, repo: str, ref: str):
return cls._request(gitea, {"owner": owner, "repo": repo, "ref": ref})


class Tag(ReadonlyApiObject):
def __init__(self, gitea):
super().__init__(gitea)

def __eq__(self, other):
if not isinstance(other, Branch):
return False
return self.id == other.id and self.name == other.name

def __hash__(self):
return hash(self.id) ^ hash(self.name)

_fields_to_parsers = {
# This is not a commit object
# "commit": lambda gitea, c: Commit.parse_response(gitea, c)
}

@classmethod
def request(cls, gitea: "Gitea", owner: str, repo: str, ref: str):
return cls._request(gitea, {"owner": owner, "repo": repo, "ref": ref})


class Repository(ApiObject):
API_OBJECT = """/repos/{owner}/{name}""" # <owner>, <reponame>
REPO_MIGRATE = """/repos/migrate"""
REPO_IS_COLLABORATOR = """/repos/%s/%s/collaborators/%s""" # <owner>, <reponame>, <username>
REPO_PERMISSION = """/repos/%s/%s/collaborators/%s/permission"""
REPO_SEARCH = """/repos/search/%s""" # <reponame>
REPO_BRANCHES = """/repos/%s/%s/branches""" # <owner>, <reponame>
REPO_TAGS = """/repos/%s/%s/tags""" # <owner>, <reponame>
REPO_ISSUES = """/repos/{owner}/{repo}/issues""" # <owner, reponame>
REPO_DELETE = """/repos/%s/%s""" # <owner>, <reponame>
REPO_TIMES = """/repos/%s/%s/times""" # <owner>, <reponame>
Expand Down Expand Up @@ -424,7 +447,7 @@ def commit(self):

def get_branches(self) -> List["Branch"]:
"""Get all the Branches of this Repository."""
results = self.gitea.requests_get(Repository.REPO_BRANCHES % (self.owner.username, self.name))
results = self.gitea.requests_get_paginated(Repository.REPO_BRANCHES % (self.owner.username, self.name))
return [Branch.parse_response(self.gitea, result) for result in results]

def add_branch(self, create_from: Branch, newname: str) -> "Branch":
Expand All @@ -434,6 +457,17 @@ def add_branch(self, create_from: Branch, newname: str) -> "Branch":
result = self.gitea.requests_post(Repository.REPO_BRANCHES % (self.owner.username, self.name), data=data)
return Branch.parse_response(self.gitea, result)

def get_tags(self) -> List["Tag"]:
"""Get all the Tags of this Repository."""
results = self.gitea.requests_get_paginated(Repository.REPO_TAGS % (self.owner.username, self.name))
return [Tag.parse_response(self.gitea, result) for result in results]

def add_tag(self, tag_name: str, target: str, message: str) -> "Tag":
"""Add a tag to the repository ('target' is commit/hash)"""
data = {"tag_name": tag_name, "target": target, "message": message}
result = self.gitea.requests_post(Repository.REPO_TAGS % (self.owner.username, self.name), data=data)
return Tag.parse_response(self.gitea, result)

def get_issues(self) -> List["Issue"]:
"""Get all Issues of this Repository (open and closed)"""
return self.get_issues_state(Issue.OPENED) + self.get_issues_state(Issue.CLOSED)
Expand Down
50 changes: 45 additions & 5 deletions tests/test_api_longtests.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,18 @@ def instance(scope="module"):
test_repo = "repo_" + uuid.uuid4().hex[:8]


def prepare_test_org(instance):
try:
return Organization.request(instance, test_org)
except NotFoundException:
user = instance.create_user(
test_user, test_user + "@example.org", "abcdefg1.23AB", send_notify=False
)
return instance.create_org(user, test_org, "some Description for longtests")


def test_list_repos(instance):
user = instance.create_user(
test_user, test_user + "@example.org", "abcdefg1.23AB", send_notify=False
)
org = instance.create_org(user, test_org, "some Description for longtests")
org = prepare_test_org(instance)
repos = org.get_repositories()
assert len(repos) == 0
# test a number of repository listings larger than the pagination number (default 50)
Expand All @@ -46,7 +53,7 @@ def test_list_repos(instance):


def test_list_issue(instance):
org = Organization.request(instance, test_org)
org = prepare_test_org(instance)
repo = instance.create_repo(
org, test_repo, "Testing a huge number of Issues and how they are listed"
)
Expand All @@ -59,3 +66,36 @@ def test_list_issue(instance):
)
issues = repo.get_issues()
assert len(issues) > 98


def test_list_branches(instance):
org = prepare_test_org(instance)
repo = instance.create_repo(
org, test_repo, "Testing a huge number of Branches and how they are listed"
)
branches = repo.get_branches()
master = [b for b in branches if b.name == "master"]
assert len(master) > 0

for x in range(0, 54):
repo.add_branch(master[0], "test_branch_" + str(x) + "_" + str(uuid.uuid4().hex[:8]))

branches = repo.get_branches()
assert len(branches) >= 53

def test_list_tags(instance):
org = prepare_test_org(instance)
repo = instance.create_repo(
org, test_repo, "Testing a huge number of Tags and how they are listed"
)
branches = repo.get_branches()
master = [b for b in branches if b.name == "master"]
assert len(master) > 0

# Add all tags on last 'master' branch commit
for x in range(0, 54):
repo.add_tag("test_tag_" + str(x) + "_" + str(uuid.uuid4().hex[:8]), master[0].commit["id"], "test tag")

tags = repo.get_tags()
assert len(tags) >= 53