Commit 8cb23690 authored by Douwe Maan's avatar Douwe Maan

Merge branch '40795-set-project-name-on-fork-api' into 'master'

Add ability to set project path and name on fork using API

Closes #40795

See merge request gitlab-org/gitlab-ce!25363
parents e5c7027f 99633a8f
...@@ -38,8 +38,8 @@ module Projects ...@@ -38,8 +38,8 @@ module Projects
new_params = { new_params = {
visibility_level: allowed_visibility_level, visibility_level: allowed_visibility_level,
description: @project.description, description: @project.description,
name: @project.name, name: target_name,
path: @project.path, path: target_path,
shared_runners_enabled: @project.shared_runners_enabled, shared_runners_enabled: @project.shared_runners_enabled,
namespace_id: target_namespace.id, namespace_id: target_namespace.id,
fork_network: fork_network, fork_network: fork_network,
...@@ -94,6 +94,14 @@ module Projects ...@@ -94,6 +94,14 @@ module Projects
Projects::ForksCountService.new(@project).refresh_cache Projects::ForksCountService.new(@project).refresh_cache
end end
def target_path
@target_path ||= @params[:path] || @project.path
end
def target_name
@target_name ||= @params[:name] || @project.name
end
def target_namespace def target_namespace
@target_namespace ||= @params[:namespace] || current_user.namespace @target_namespace ||= @params[:namespace] || current_user.namespace
end end
......
---
title: Add ability to set path and name for project on fork using API
merge_request: 25363
author:
type: added
...@@ -771,6 +771,8 @@ POST /projects/:id/fork ...@@ -771,6 +771,8 @@ POST /projects/:id/fork
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
| `namespace` | integer/string | yes | The ID or path of the namespace that the project will be forked to | | `namespace` | integer/string | yes | The ID or path of the namespace that the project will be forked to |
| `path` | string | no | The path that will be assigned to the resultant project after forking |
| `name` | string | no | The name that will be assigned to the resultant project after forking |
## List Forks of a project ## List Forks of a project
......
...@@ -258,6 +258,8 @@ module API ...@@ -258,6 +258,8 @@ module API
end end
params do params do
optional :namespace, type: String, desc: 'The ID or name of the namespace that the project will be forked into' optional :namespace, type: String, desc: 'The ID or name of the namespace that the project will be forked into'
optional :path, type: String, desc: 'The path that will be assigned to the fork'
optional :name, type: String, desc: 'The name that will be assigned to the fork'
end end
post ':id/fork' do post ':id/fork' do
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42284') Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42284')
......
...@@ -1995,6 +1995,11 @@ describe API::Projects do ...@@ -1995,6 +1995,11 @@ describe API::Projects do
let(:project) do let(:project) do
create(:project, :repository, creator: user, namespace: user.namespace) create(:project, :repository, creator: user, namespace: user.namespace)
end end
let(:project2) do
create(:project, :repository, creator: user, namespace: user.namespace)
end
let(:group) { create(:group) } let(:group) { create(:group) }
let(:group2) do let(:group2) do
group = create(:group, name: 'group2_name') group = create(:group, name: 'group2_name')
...@@ -2010,6 +2015,7 @@ describe API::Projects do ...@@ -2010,6 +2015,7 @@ describe API::Projects do
before do before do
project.add_reporter(user2) project.add_reporter(user2)
project2.add_reporter(user2)
end end
context 'when authenticated' do context 'when authenticated' do
...@@ -2124,6 +2130,48 @@ describe API::Projects do ...@@ -2124,6 +2130,48 @@ describe API::Projects do
expect(response).to have_gitlab_http_status(201) expect(response).to have_gitlab_http_status(201)
expect(json_response['namespace']['name']).to eq(group.name) expect(json_response['namespace']['name']).to eq(group.name)
end end
it 'accepts a path for the target project' do
post api("/projects/#{project.id}/fork", user2), params: { path: 'foobar' }
expect(response).to have_gitlab_http_status(201)
expect(json_response['name']).to eq(project.name)
expect(json_response['path']).to eq('foobar')
expect(json_response['owner']['id']).to eq(user2.id)
expect(json_response['namespace']['id']).to eq(user2.namespace.id)
expect(json_response['forked_from_project']['id']).to eq(project.id)
expect(json_response['import_status']).to eq('scheduled')
expect(json_response).to include("import_error")
end
it 'fails to fork if path is already taken' do
post api("/projects/#{project.id}/fork", user2), params: { path: 'foobar' }
post api("/projects/#{project2.id}/fork", user2), params: { path: 'foobar' }
expect(response).to have_gitlab_http_status(409)
expect(json_response['message']['path']).to eq(['has already been taken'])
end
it 'accepts a name for the target project' do
post api("/projects/#{project.id}/fork", user2), params: { name: 'My Random Project' }
expect(response).to have_gitlab_http_status(201)
expect(json_response['name']).to eq('My Random Project')
expect(json_response['path']).to eq(project.path)
expect(json_response['owner']['id']).to eq(user2.id)
expect(json_response['namespace']['id']).to eq(user2.namespace.id)
expect(json_response['forked_from_project']['id']).to eq(project.id)
expect(json_response['import_status']).to eq('scheduled')
expect(json_response).to include("import_error")
end
it 'fails to fork if name is already taken' do
post api("/projects/#{project.id}/fork", user2), params: { name: 'My Random Project' }
post api("/projects/#{project2.id}/fork", user2), params: { name: 'My Random Project' }
expect(response).to have_gitlab_http_status(409)
expect(json_response['message']['name']).to eq(['has already been taken'])
end
end end
context 'when unauthenticated' do context 'when unauthenticated' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment