summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNejc Habjan <hab.nejc@gmail.com>2021-02-05 01:06:43 +0100
committerGitHub <noreply@github.com>2021-02-05 01:06:43 +0100
commitb48563f1ad96e3c70b36f6e55b2fe7ed8d324919 (patch)
treeabb57c07341f358d0b33306555146fc09f2087ec
parent3935baf1fc5120728949e65397ffb5776bdf1bc7 (diff)
parentff3013a2afeba12811cb3d860de4d0ea06f90545 (diff)
downloadgitlab-b48563f1ad96e3c70b36f6e55b2fe7ed8d324919.tar.gz
Merge pull request #1283 from fajpunk/import_bitbucket
feat: import from bitbucket server
-rw-r--r--gitlab/tests/objects/test_projects.py38
-rw-r--r--gitlab/v4/objects/__init__.py94
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 = {