diff --git a/gitlab/tests/objects/test_projects.py b/gitlab/tests/objects/test_projects.py index 1e8b8b604..14ab96651 100644 --- a/gitlab/tests/objects/test_projects.py +++ b/gitlab/tests/objects/test_projects.py @@ -9,6 +9,11 @@ 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 6184440d1..a69563c8d 100644 --- a/gitlab/v4/objects/__init__.py +++ b/gitlab/v4/objects/__init__.py @@ -5501,6 +5501,94 @@ def import_project( "/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 @@ def import_github( 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 = {