From df7e1ec8dbd2accbf98f324ba1159ced38adbd2a Mon Sep 17 00:00:00 2001
From: Greg Messner <greg@messners.com>
Date: Wed, 28 Nov 2018 14:19:03 -0800
Subject: [PATCH] Added support for transfer project (#276).

---
 example-test-gitlab4j.properties              |  3 ++
 .../java/org/gitlab4j/api/ProjectApi.java     | 16 +++++++++++
 .../java/org/gitlab4j/api/TestProjectApi.java | 28 +++++++++++++++++++
 3 files changed, 47 insertions(+)

diff --git a/example-test-gitlab4j.properties b/example-test-gitlab4j.properties
index 4c1586b6..b25c2f56 100644
--- a/example-test-gitlab4j.properties
+++ b/example-test-gitlab4j.properties
@@ -20,6 +20,9 @@ TEST_GROUP=
 TEST_GROUP_PROJECT=
 TEST_GROUP_MEMBER_USERNAME=
 
+# OPTIONAL: Used to test transfer project
+TEST_XFER_NAMESPACE=
+
 # OPTIONAL: To test oauth2Login, set these properties
 TEST_LOGIN_USERNAME=
 TEST_LOGIN_PASSWORD=
diff --git a/src/main/java/org/gitlab4j/api/ProjectApi.java b/src/main/java/org/gitlab4j/api/ProjectApi.java
index 3cfea245..41bedd2a 100644
--- a/src/main/java/org/gitlab4j/api/ProjectApi.java
+++ b/src/main/java/org/gitlab4j/api/ProjectApi.java
@@ -2165,4 +2165,20 @@ public class ProjectApi extends AbstractApi implements Constants {
         Response response = get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "languages");
         return (response.readEntity(new GenericType<Map<String, Float>>() {}));
     }
+
+    /**
+     * Transfer a project to a new namespace.  This was added in GitLab 11.1
+     *
+     * PUT /projects/:id/transfer.
+     *
+     * @param projectIdOrPath projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance, required
+     * @param namespace the namespace to transfer the project to
+     * @return the updated Project
+     * @throws GitLabApiException if any exception occurs
+     */
+    public Project transferProject(Object projectIdOrPath, String namespace) throws GitLabApiException {
+        GitLabApiForm formData = new GitLabApiForm().withParam("namespace", namespace, true);
+        Response response = put(Response.Status.OK, formData.asMap(), "projects", getProjectIdOrPath(projectIdOrPath), "transfer");
+        return (response.readEntity(Project.class));
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/org/gitlab4j/api/TestProjectApi.java b/src/test/java/org/gitlab4j/api/TestProjectApi.java
index 21e7502d..367134ad 100644
--- a/src/test/java/org/gitlab4j/api/TestProjectApi.java
+++ b/src/test/java/org/gitlab4j/api/TestProjectApi.java
@@ -71,6 +71,7 @@ public class TestProjectApi {
     private static final String TEST_PRIVATE_TOKEN;
     private static final String TEST_GROUP;
     private static final String TEST_GROUP_PROJECT;
+    private static final String TEST_XFER_NAMESPACE;
 
     static {
         TEST_NAMESPACE = TestUtils.getProperty("TEST_NAMESPACE");
@@ -79,11 +80,13 @@ public class TestProjectApi {
         TEST_PRIVATE_TOKEN = TestUtils.getProperty("TEST_PRIVATE_TOKEN");
         TEST_GROUP = TestUtils.getProperty("TEST_GROUP");
         TEST_GROUP_PROJECT = TestUtils.getProperty("TEST_GROUP_PROJECT");
+        TEST_XFER_NAMESPACE = TestUtils.getProperty("TEST_XFER_NAMESPACE");
     }
 
     private static final String TEST_PROJECT_NAME_1 = "test-gitlab4j-create-project";
     private static final String TEST_PROJECT_NAME_2 = "test-gitlab4j-create-project-2";
     private static final String TEST_PROJECT_NAME_UPDATE = "test-gitlab4j-create-project-update";
+    private static final String TEST_XFER_PROJECT_NAME = "test-gitlab4j-xfer-project";
     private static GitLabApi gitLabApi;
 
     public TestProjectApi() {
@@ -153,6 +156,14 @@ public class TestProjectApi {
                 } catch (GitLabApiException ignore) {
                 }
             }
+
+            if (TEST_XFER_NAMESPACE != null) {
+                try {
+                    Project project = gitLabApi.getProjectApi().getProject(TEST_XFER_NAMESPACE, TEST_XFER_PROJECT_NAME);
+                    gitLabApi.getProjectApi().deleteProject(project);
+                } catch (GitLabApiException ignore) {
+                }
+            }
         }
     }
 
@@ -556,4 +567,21 @@ public class TestProjectApi {
         assertNotNull(unstarredProject);
         assertEquals(0, (int)unstarredProject.getStarCount());
     }
+
+    @Test
+    public void testTransferProject() throws GitLabApiException {
+
+        assumeTrue(TEST_XFER_NAMESPACE != null && TEST_XFER_NAMESPACE.trim().length() > 0);
+
+        Project project = new Project()
+                .withName(TEST_XFER_PROJECT_NAME)
+                .withDescription("GitLab4J test project - transfer.")
+                .withVisibility(Visibility.PUBLIC);
+
+        Project newProject = gitLabApi.getProjectApi().createProject(project);
+        assertNotNull(newProject);
+
+        Project transferedProject = gitLabApi.getProjectApi().transferProject(newProject, TEST_XFER_NAMESPACE);
+        assertNotNull(transferedProject);
+    }
 }
-- 
GitLab