diff options
author | Nejc Habjan <hab.nejc@gmail.com> | 2021-02-05 01:06:43 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-05 01:06:43 +0100 |
commit | b48563f1ad96e3c70b36f6e55b2fe7ed8d324919 (patch) | |
tree | abb57c07341f358d0b33306555146fc09f2087ec | |
parent | 3935baf1fc5120728949e65397ffb5776bdf1bc7 (diff) | |
parent | ff3013a2afeba12811cb3d860de4d0ea06f90545 (diff) | |
download | gitlab-b48563f1ad96e3c70b36f6e55b2fe7ed8d324919.tar.gz |
Merge pull request #1283 from fajpunk/import_bitbucket
feat: import from bitbucket server
-rw-r--r-- | gitlab/tests/objects/test_projects.py | 38 | ||||
-rw-r--r-- | gitlab/v4/objects/__init__.py | 94 |
2 files changed, 129 insertions, 3 deletions
diff --git a/gitlab/tests/objects/test_projects.py b/gitlab/tests/objects/test_projects.py index 1e8b8b6..14ab966 100644 --- a/gitlab/tests/objects/test_projects.py +++ b/gitlab/tests/objects/test_projects.py @@ -9,6 +9,11 @@ from gitlab.v4.objects import Project project_content = {"name": "name", "id": 1} +import_content = { + "id": 1, + "name": "project", + "import_status": "scheduled", +} @pytest.fixture @@ -37,6 +42,19 @@ def resp_list_projects(): yield rsps +@pytest.fixture +def resp_import_bitbucket_server(): + with responses.RequestsMock() as rsps: + rsps.add( + method=responses.POST, + url="http://localhost/api/v4/import/bitbucket_server", + json=import_content, + content_type="application/json", + status=201, + ) + yield rsps + + def test_get_project(gl, resp_get_project): data = gl.projects.get(1) assert isinstance(data, Project) @@ -50,6 +68,21 @@ def test_list_projects(gl, resp_list_projects): assert projects[0].name == "name" +def test_import_bitbucket_server(gl, resp_import_bitbucket_server): + res = gl.projects.import_bitbucket_server( + bitbucket_server_project="project", + bitbucket_server_repo="repo", + bitbucket_server_url="url", + bitbucket_server_username="username", + personal_access_token="token", + new_name="new_name", + target_namespace="namespace", + ) + assert res["id"] == 1 + assert res["name"] == "project" + assert res["import_status"] == "scheduled" + + @pytest.mark.skip(reason="missing test") def test_list_user_projects(gl): pass @@ -223,3 +256,8 @@ def test_project_pull_mirror(gl): @pytest.mark.skip(reason="missing test") def test_project_snapshot(gl): pass + + +@pytest.mark.skip(reason="missing test") +def test_import_github(gl): + pass diff --git a/gitlab/v4/objects/__init__.py b/gitlab/v4/objects/__init__.py index 6184440..a69563c 100644 --- a/gitlab/v4/objects/__init__.py +++ b/gitlab/v4/objects/__init__.py @@ -5501,6 +5501,94 @@ class ProjectManager(CRUDMixin, RESTManager): "/projects/import", post_data=data, files=files, **kwargs ) + def import_bitbucket_server( + self, + bitbucket_server_url, + bitbucket_server_username, + personal_access_token, + bitbucket_server_project, + bitbucket_server_repo, + new_name=None, + target_namespace=None, + **kwargs + ): + """Import a project from BitBucket Server to Gitlab (schedule the import) + + This method will return when an import operation has been safely queued, + or an error has occurred. After triggering an import, check the + `import_status` of the newly created project to detect when the import + operation has completed. + + NOTE: this request may take longer than most other API requests. + So this method will specify a 60 second default timeout if none is specified. + A timeout can be specified via kwargs to override this functionality. + + Args: + bitbucket_server_url (str): Bitbucket Server URL + bitbucket_server_username (str): Bitbucket Server Username + personal_access_token (str): Bitbucket Server personal access + token/password + bitbucket_server_project (str): Bitbucket Project Key + bitbucket_server_repo (str): Bitbucket Repository Name + new_name (str): New repository name (Optional) + target_namespace (str): Namespace to import repository into. + Supports subgroups like /namespace/subgroup (Optional) + **kwargs: Extra options to send to the server (e.g. sudo) + + Raises: + GitlabAuthenticationError: If authentication is not correct + GitlabListError: If the server failed to perform the request + + Returns: + dict: A representation of the import status. + + Example: + ``` + gl = gitlab.Gitlab_from_config() + print("Triggering import") + result = gl.projects.import_bitbucket_server( + bitbucket_server_url="https://some.server.url", + bitbucket_server_username="some_bitbucket_user", + personal_access_token="my_password_or_access_token", + bitbucket_server_project="my_project", + bitbucket_server_repo="my_repo", + new_name="gl_project_name", + target_namespace="gl_project_path" + ) + project = gl.projects.get(ret['id']) + print("Waiting for import to complete") + while project.import_status == u'started': + time.sleep(1.0) + project = gl.projects.get(project.id) + print("BitBucket import complete") + ``` + """ + data = { + "bitbucket_server_url": bitbucket_server_url, + "bitbucket_server_username": bitbucket_server_username, + "personal_access_token": personal_access_token, + "bitbucket_server_project": bitbucket_server_project, + "bitbucket_server_repo": bitbucket_server_repo, + } + if new_name: + data["new_name"] = new_name + if target_namespace: + data["target_namespace"] = target_namespace + if ( + "timeout" not in kwargs + or self.gitlab.timeout is None + or self.gitlab.timeout < 60.0 + ): + # Ensure that this HTTP request has a longer-than-usual default timeout + # The base gitlab object tends to have a default that is <10 seconds, + # and this is too short for this API command, typically. + # On the order of 24 seconds has been measured on a typical gitlab instance. + kwargs["timeout"] = 60.0 + result = self.gitlab.http_post( + "/import/bitbucket_server", post_data=data, **kwargs + ) + return result + def import_github( self, personal_access_token, repo_id, target_namespace, new_name=None, **kwargs ): @@ -5532,16 +5620,16 @@ class ProjectManager(CRUDMixin, RESTManager): Example: ``` gl = gitlab.Gitlab_from_config() - print "Triggering import" + print("Triggering import") result = gl.projects.import_github(ACCESS_TOKEN, 123456, "my-group/my-subgroup") project = gl.projects.get(ret['id']) - print "Waiting for import to complete" + print("Waiting for import to complete") while project.import_status == u'started': time.sleep(1.0) project = gl.projects.get(project.id) - print "Github import complete" + print("Github import complete") ``` """ data = { |