diff options
author | Douwe Maan <douwe@gitlab.com> | 2019-02-25 11:24:13 +0000 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2019-02-25 11:24:13 +0000 |
commit | 8cb236908f03cba6f6a1ad5660ce8fbdfa32a50d (patch) | |
tree | 9b4b4215780394c2b4c4f339b154250be6ae3eeb | |
parent | e5c7027faffb75f1d2f7221fa11609741010d82f (diff) | |
parent | 99633a8fa387037697cb0faa04da40972dcc58cc (diff) | |
download | gitlab-ce-8cb236908f03cba6f6a1ad5660ce8fbdfa32a50d.tar.gz |
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
-rw-r--r-- | app/services/projects/fork_service.rb | 12 | ||||
-rw-r--r-- | changelogs/unreleased/40795-set-project-name-on-fork-api.yml | 5 | ||||
-rw-r--r-- | doc/api/projects.md | 2 | ||||
-rw-r--r-- | lib/api/projects.rb | 2 | ||||
-rw-r--r-- | spec/requests/api/projects_spec.rb | 48 |
5 files changed, 67 insertions, 2 deletions
diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 91091c4393d..fc234bafc57 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -38,8 +38,8 @@ module Projects new_params = { visibility_level: allowed_visibility_level, description: @project.description, - name: @project.name, - path: @project.path, + name: target_name, + path: target_path, shared_runners_enabled: @project.shared_runners_enabled, namespace_id: target_namespace.id, fork_network: fork_network, @@ -94,6 +94,14 @@ module Projects Projects::ForksCountService.new(@project).refresh_cache end + def target_path + @target_path ||= @params[:path] || @project.path + end + + def target_name + @target_name ||= @params[:name] || @project.name + end + def target_namespace @target_namespace ||= @params[:namespace] || current_user.namespace end diff --git a/changelogs/unreleased/40795-set-project-name-on-fork-api.yml b/changelogs/unreleased/40795-set-project-name-on-fork-api.yml new file mode 100644 index 00000000000..742184bbe1e --- /dev/null +++ b/changelogs/unreleased/40795-set-project-name-on-fork-api.yml @@ -0,0 +1,5 @@ +--- +title: Add ability to set path and name for project on fork using API +merge_request: 25363 +author: +type: added diff --git a/doc/api/projects.md b/doc/api/projects.md index 3c0c956ddc2..0a950352ecf 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -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) | | `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 diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 6a93ef9f3ad..bd5678f513f 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -258,6 +258,8 @@ module API end params do 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 post ':id/fork' do Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42284') diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index cfa7a1a31a3..494808e399f 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -1995,6 +1995,11 @@ describe API::Projects do let(:project) do create(:project, :repository, creator: user, namespace: user.namespace) end + + let(:project2) do + create(:project, :repository, creator: user, namespace: user.namespace) + end + let(:group) { create(:group) } let(:group2) do group = create(:group, name: 'group2_name') @@ -2010,6 +2015,7 @@ describe API::Projects do before do project.add_reporter(user2) + project2.add_reporter(user2) end context 'when authenticated' do @@ -2124,6 +2130,48 @@ describe API::Projects do expect(response).to have_gitlab_http_status(201) expect(json_response['namespace']['name']).to eq(group.name) 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 context 'when unauthenticated' do |