From 75a9591b985b122ce002a82372df68f5b636b964 Mon Sep 17 00:00:00 2001 From: laromicas Date: Wed, 22 Mar 2023 20:47:43 -0500 Subject: [PATCH 1/5] Support for migration of repositories --- gitea/__init__.py | 3 +- gitea/apiobject.py | 70 ++++++++++++++++++++++++++++++++++++++++++++++ tests/test_api.py | 12 +++++++- 3 files changed, 83 insertions(+), 2 deletions(-) diff --git a/gitea/__init__.py b/gitea/__init__.py index 97bbedd..4a9b7a3 100644 --- a/gitea/__init__.py +++ b/gitea/__init__.py @@ -15,7 +15,8 @@ from .apiobject import ( Milestone, Commit, Comment, - Content + Content, + MigrationServices ) __all__ = [ diff --git a/gitea/apiobject.py b/gitea/apiobject.py index 79f0002..3b2869f 100644 --- a/gitea/apiobject.py +++ b/gitea/apiobject.py @@ -324,6 +324,7 @@ class Branch(ReadonlyApiObject): class Repository(ApiObject): API_OBJECT = """/repos/{owner}/{name}""" # , + REPO_MIGRATE = """/repos/migrate""" REPO_IS_COLLABORATOR = """/repos/%s/%s/collaborators/%s""" # , , REPO_SEARCH = """/repos/search/%s""" # REPO_BRANCHES = """/repos/%s/%s/branches""" # , @@ -575,6 +576,65 @@ class Repository(ApiObject): ) self.deleted = True + def migrate_repo( + self, + service: str, + clone_addr: str, + repo_name: str, + description: str = "", + private: bool = False, + auth_token: str = None, + auth_username: str = None, + auth_password: str = None, + mirror: bool = False, + mirror_interval: str = None, + lfs: bool = False, + lfs_endpoint: str = "", + wiki: bool = True, + labels: bool = False, + issues: bool = False, + pull_requests: bool = True, + releases: bool = True, + milestones: bool = True, + repo_owner: str = None + ): + """ Migrate a Repository from another service. + + Throws: + AlreadyExistsException: If the Repository exists already. + Exception: If something else went wrong. + """ + result = self.gitea.requests_post( + Repository.REPO_MIGRATE, + data={ + "auth_password": auth_password, + "auth_token": auth_token, + "auth_username": auth_username, + "clone_addr": clone_addr, + "description": description, + "issues": issues, + "labels": labels, + "lfs": lfs, + "lfs_endpoint": lfs_endpoint, + "milestones": milestones, + "mirror": mirror, + "mirror_interval": mirror_interval, + "private": private, + "pull_requests": pull_requests, + "releases": releases, + "repo_name": repo_name, + "repo_owner": repo_owner, + "service": service, + "wiki": wiki + } + ) + if "id" in result: + self.gitea.logger.info("Successfully created Job to Migrate Repository %s " % result["name"]) + else: + self.gitea.logger.error(result["message"]) + raise Exception("Repository not Migrated... (gitea: %s)" % result["message"]) + return Repository.parse_response(self, result) + class Milestone(ApiObject): API_OBJECT = """/repos/{owner}/{repo}/milestones/{number}""" # @@ -853,3 +913,13 @@ class Util: return datetime.strptime(time[:-3] + "00", "%Y-%m-%dT%H:%M:%S%z") except ValueError: return datetime.strptime(time[:-3] + "00", "%Y-%m-%dT%H:%M:%S") + +class MigrationServices: + GIT = "1" + GITHUB = "2" + GITEA = "3" + GITLAB = "4" + GOGS = "5" + ONEDEV = "6" + BITBUCKET = "7" + CODEBASE = "8" diff --git a/tests/test_api.py b/tests/test_api.py index 46aa82e..3ce6060 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -3,7 +3,7 @@ import base64 import pytest import uuid -from gitea import Gitea, User, Organization, Team, Repository, Issue, Milestone +from gitea import Gitea, User, Organization, Team, Repository, Issue, Milestone, MigrationServices from gitea import NotFoundException, AlreadyExistsException # put a ".token" file into your directory containg only the token for gitea @@ -386,3 +386,13 @@ def test_delete_user(instance): user.delete() with pytest.raises(NotFoundException) as e: User.request(instance, user_name) + +def test_migrate_repo(instance): + service = Repository(instance) + repo = service.migrate_repo(MigrationServices.GITEA, "https://gitea.com/gitea/awesome-gitea.git", test_repo, "user owned repo") + assert repo.name == test_repo + assert repo.description == "user owned repo" + assert not repo.private + assert repo.owner.username == "test" + repo = Repository.request(instance, "test", test_repo) + repo.delete() From d96a040c33723a01645e27269a90e77aafb35235 Mon Sep 17 00:00:00 2001 From: laromicas Date: Sun, 26 Mar 2023 21:01:13 -0500 Subject: [PATCH 2/5] Changed to default values --- gitea/apiobject.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gitea/apiobject.py b/gitea/apiobject.py index 3b2869f..8c86414 100644 --- a/gitea/apiobject.py +++ b/gitea/apiobject.py @@ -590,12 +590,12 @@ class Repository(ApiObject): mirror_interval: str = None, lfs: bool = False, lfs_endpoint: str = "", - wiki: bool = True, + wiki: bool = False, labels: bool = False, issues: bool = False, - pull_requests: bool = True, - releases: bool = True, - milestones: bool = True, + pull_requests: bool = False, + releases: bool = False, + milestones: bool = False, repo_owner: str = None ): """ Migrate a Repository from another service. From 91f75d8b2b53b368eb967803ffd31f15fe46771e Mon Sep 17 00:00:00 2001 From: laromicas Date: Mon, 27 Mar 2023 09:36:33 -0500 Subject: [PATCH 3/5] Fixed GITBUCKET name --- gitea/apiobject.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitea/apiobject.py b/gitea/apiobject.py index 8c86414..377609e 100644 --- a/gitea/apiobject.py +++ b/gitea/apiobject.py @@ -921,5 +921,5 @@ class MigrationServices: GITLAB = "4" GOGS = "5" ONEDEV = "6" - BITBUCKET = "7" + GITBUCKET = "7" CODEBASE = "8" From 2a24932e2429144b69f53fb9f5ed0571441ef2b6 Mon Sep 17 00:00:00 2001 From: laromicas Date: Wed, 29 Mar 2023 11:14:27 -0500 Subject: [PATCH 4/5] Changed Repo to self --- gitea/apiobject.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitea/apiobject.py b/gitea/apiobject.py index 377609e..6a2bfba 100644 --- a/gitea/apiobject.py +++ b/gitea/apiobject.py @@ -605,7 +605,7 @@ class Repository(ApiObject): Exception: If something else went wrong. """ result = self.gitea.requests_post( - Repository.REPO_MIGRATE, + self.REPO_MIGRATE, data={ "auth_password": auth_password, "auth_token": auth_token, From ba4202fe6fb4e972568c8e445b489848d498fd9b Mon Sep 17 00:00:00 2001 From: Langenfeld Date: Mon, 21 Aug 2023 16:01:44 +0200 Subject: [PATCH 5/5] (fix) migrate function returns repository object with valid gitea, #22 --- gitea/apiobject.py | 16 +++++++++------- tests/test_api.py | 24 +++++++++++++++++++++--- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/gitea/apiobject.py b/gitea/apiobject.py index 1b5c48c..5df39b7 100644 --- a/gitea/apiobject.py +++ b/gitea/apiobject.py @@ -565,7 +565,7 @@ class Repository(ApiObject): self.gitea.requests_post(url, data=data) # TODO: make sure this instance is either updated or discarded - def get_git_content(self: str = None, commit: "Commit" = None) -> List["Content"]: + def get_git_content(self, commit: "Commit" = None) -> List["Content"]: """https://try.gitea.io/api/swagger#/repository/repoGetContentsList""" url = f"/repos/{self.owner.username}/{self.name}/contents" data = {"ref": commit.sha} if commit else {} @@ -613,8 +613,10 @@ class Repository(ApiObject): ) self.deleted = True + @classmethod def migrate_repo( - self, + cls, + gitea: "Gitea", service: str, clone_addr: str, repo_name: str, @@ -641,8 +643,8 @@ class Repository(ApiObject): AlreadyExistsException: If the Repository exists already. Exception: If something else went wrong. """ - result = self.gitea.requests_post( - self.REPO_MIGRATE, + result = gitea.requests_post( + cls.REPO_MIGRATE, data={ "auth_password": auth_password, "auth_token": auth_token, @@ -666,15 +668,15 @@ class Repository(ApiObject): }, ) if "id" in result: - self.gitea.logger.info( + gitea.logger.info( "Successfully created Job to Migrate Repository %s " % result["name"] ) else: - self.gitea.logger.error(result["message"]) + gitea.logger.error(result["message"]) raise Exception( "Repository not Migrated... (gitea: %s)" % result["message"] ) - return Repository.parse_response(self, result) + return Repository.parse_response(gitea, result) class Milestone(ApiObject): diff --git a/tests/test_api.py b/tests/test_api.py index 356ecd1..2fa87bd 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -433,9 +433,9 @@ def test_delete_user(instance): User.request(instance, user_name) -def test_migrate_repo(instance): - service = Repository(instance) - repo = service.migrate_repo( +def test_migrate_repo_gitea(instance): + repo = Repository.migrate_repo( + instance, MigrationServices.GITEA, "https://gitea.com/gitea/awesome-gitea.git", test_repo, @@ -445,5 +445,23 @@ def test_migrate_repo(instance): assert repo.description == "user owned repo" assert not repo.private assert repo.owner.username == "test" + assert "README.md" in [f.name for f in repo.get_git_content()] + repo = Repository.request(instance, "test", test_repo) + repo.delete() + + +def test_migrate_repo_github(instance): + repo = Repository.migrate_repo( + instance, + MigrationServices.GITHUB, + "https://github.com/Langenfeld/py-gitea", + test_repo, + "cloning py-gitea to test py-gitea", + ) + assert repo.name == test_repo + assert repo.description == "cloning py-gitea to test py-gitea" + assert not repo.private + assert repo.owner.username == "test" + assert "README.md" in [f.name for f in repo.get_git_content()] repo = Repository.request(instance, "test", test_repo) repo.delete()