Create subgroups if they don't exist while importing projects
This commit is contained in:
parent
65ea732cfe
commit
bdcd23b297
5 changed files with 212 additions and 12 deletions
|
@ -1,17 +1,27 @@
|
|||
class Import::BaseController < ApplicationController
|
||||
private
|
||||
|
||||
def find_or_create_namespace(name, owner)
|
||||
return current_user.namespace if name == owner
|
||||
def find_or_create_namespace(names, owner)
|
||||
return current_user.namespace if names == owner
|
||||
return current_user.namespace unless current_user.can_create_group?
|
||||
|
||||
begin
|
||||
name = params[:target_namespace].presence || name
|
||||
namespace = Group.create!(name: name, path: name, owner: current_user)
|
||||
namespace.add_owner(current_user)
|
||||
namespace
|
||||
rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid
|
||||
Namespace.find_by_full_path(name)
|
||||
names = params[:target_namespace].presence || names
|
||||
full_path_namespace = Namespace.find_by_full_path(names)
|
||||
|
||||
return full_path_namespace if full_path_namespace
|
||||
|
||||
names.split('/').inject(nil) do |parent, name|
|
||||
begin
|
||||
namespace = Group.create!(name: name,
|
||||
path: name,
|
||||
owner: current_user,
|
||||
parent: parent)
|
||||
namespace.add_owner(current_user)
|
||||
|
||||
namespace
|
||||
rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid
|
||||
Namespace.where(parent: parent).find_by_path_or_name(name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
4
changelogs/unreleased/fix-import-namespace.yml
Normal file
4
changelogs/unreleased/fix-import-namespace.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Create subgroups if they don't exist while importing projects
|
||||
merge_request:
|
||||
author:
|
|
@ -200,5 +200,72 @@ describe Import::BitbucketController do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'user has chosen an existing nested namespace and name for the project' do
|
||||
let(:parent_namespace) { create(:namespace, name: 'foo', owner: user) }
|
||||
let(:nested_namespace) { create(:namespace, name: 'bar', parent: parent_namespace, owner: user) }
|
||||
let(:test_name) { 'test_name' }
|
||||
|
||||
it 'takes the selected namespace and name' do
|
||||
expect(Gitlab::BitbucketImport::ProjectCreator).
|
||||
to receive(:new).with(bitbucket_repo, test_name, nested_namespace, user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: nested_namespace.full_path, new_name: test_name, format: :js }
|
||||
end
|
||||
end
|
||||
|
||||
context 'user has chosen a non-existent nested namespaces and name for the project' do
|
||||
let(:test_name) { 'test_name' }
|
||||
|
||||
it 'takes the selected namespace and name' do
|
||||
expect(Gitlab::BitbucketImport::ProjectCreator).
|
||||
to receive(:new).with(bitbucket_repo, test_name, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: 'foo/bar', new_name: test_name, format: :js }
|
||||
end
|
||||
|
||||
it 'creates the namespaces' do
|
||||
allow(Gitlab::BitbucketImport::ProjectCreator).
|
||||
to receive(:new).with(bitbucket_repo, test_name, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
expect { post :create, { target_namespace: 'foo/bar', new_name: test_name, format: :js } }
|
||||
.to change { Namespace.count }.by(2)
|
||||
end
|
||||
|
||||
it 'new namespace has the right parent' do
|
||||
allow(Gitlab::BitbucketImport::ProjectCreator).
|
||||
to receive(:new).with(bitbucket_repo, test_name, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: 'foo/bar', new_name: test_name, format: :js }
|
||||
|
||||
expect(Namespace.find_by_path_or_name('bar').parent.path).to eq('foo')
|
||||
end
|
||||
end
|
||||
|
||||
context 'user has chosen existent and non-existent nested namespaces and name for the project' do
|
||||
let(:test_name) { 'test_name' }
|
||||
let!(:parent_namespace) { create(:namespace, name: 'foo', owner: user) }
|
||||
|
||||
it 'takes the selected namespace and name' do
|
||||
expect(Gitlab::BitbucketImport::ProjectCreator).
|
||||
to receive(:new).with(bitbucket_repo, test_name, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: 'foo/foobar/bar', new_name: test_name, format: :js }
|
||||
end
|
||||
|
||||
it 'creates the namespaces' do
|
||||
allow(Gitlab::BitbucketImport::ProjectCreator).
|
||||
to receive(:new).with(bitbucket_repo, test_name, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
expect { post :create, { target_namespace: 'foo/foobar/bar', new_name: test_name, format: :js } }
|
||||
.to change { Namespace.count }.by(2)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -174,6 +174,72 @@ describe Import::GitlabController do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'user has chosen an existing nested namespace for the project' do
|
||||
let(:parent_namespace) { create(:namespace, name: 'foo', owner: user) }
|
||||
let(:nested_namespace) { create(:namespace, name: 'bar', parent: parent_namespace, owner: user) }
|
||||
|
||||
it 'takes the selected namespace and name' do
|
||||
expect(Gitlab::GitlabImport::ProjectCreator).
|
||||
to receive(:new).with(gitlab_repo, nested_namespace, user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: nested_namespace.full_path, format: :js }
|
||||
end
|
||||
end
|
||||
|
||||
context 'user has chosen a non-existent nested namespaces for the project' do
|
||||
let(:test_name) { 'test_name' }
|
||||
|
||||
it 'takes the selected namespace and name' do
|
||||
expect(Gitlab::GitlabImport::ProjectCreator).
|
||||
to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: 'foo/bar', format: :js }
|
||||
end
|
||||
|
||||
it 'creates the namespaces' do
|
||||
allow(Gitlab::GitlabImport::ProjectCreator).
|
||||
to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
expect { post :create, { target_namespace: 'foo/bar', format: :js } }
|
||||
.to change { Namespace.count }.by(2)
|
||||
end
|
||||
|
||||
it 'new namespace has the right parent' do
|
||||
allow(Gitlab::GitlabImport::ProjectCreator).
|
||||
to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: 'foo/bar', format: :js }
|
||||
|
||||
expect(Namespace.find_by_path_or_name('bar').parent.path).to eq('foo')
|
||||
end
|
||||
end
|
||||
|
||||
context 'user has chosen existent and non-existent nested namespaces and name for the project' do
|
||||
let(:test_name) { 'test_name' }
|
||||
let!(:parent_namespace) { create(:namespace, name: 'foo', owner: user) }
|
||||
|
||||
it 'takes the selected namespace and name' do
|
||||
expect(Gitlab::GitlabImport::ProjectCreator).
|
||||
to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: 'foo/foobar/bar', format: :js }
|
||||
end
|
||||
|
||||
it 'creates the namespaces' do
|
||||
allow(Gitlab::GitlabImport::ProjectCreator).
|
||||
to receive(:new).with(gitlab_repo, kind_of(Namespace), user, access_params).
|
||||
and_return(double(execute: true))
|
||||
|
||||
expect { post :create, { target_namespace: 'foo/foobar/bar', format: :js } }
|
||||
.to change { Namespace.count }.by(2)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -180,7 +180,7 @@ shared_examples 'a GitHub-ish import controller: POST create' do
|
|||
it "takes the new namespace" do
|
||||
expect(Gitlab::GithubImport::ProjectCreator).
|
||||
to receive(:new).with(provider_repo, provider_repo.name, an_instance_of(Group), user, access_params, type: provider).
|
||||
and_return(double(execute: true))
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, target_namespace: provider_repo.name, format: :js
|
||||
end
|
||||
|
@ -201,7 +201,7 @@ shared_examples 'a GitHub-ish import controller: POST create' do
|
|||
it "takes the current user's namespace" do
|
||||
expect(Gitlab::GithubImport::ProjectCreator).
|
||||
to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider).
|
||||
and_return(double(execute: true))
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, format: :js
|
||||
end
|
||||
|
@ -229,7 +229,7 @@ shared_examples 'a GitHub-ish import controller: POST create' do
|
|||
end
|
||||
end
|
||||
|
||||
context 'user has chosen a nested namespace and name for the project' do
|
||||
context 'user has chosen an existing nested namespace and name for the project' do
|
||||
let(:parent_namespace) { create(:namespace, name: 'foo', owner: user) }
|
||||
let(:nested_namespace) { create(:namespace, name: 'bar', parent: parent_namespace, owner: user) }
|
||||
let(:test_name) { 'test_name' }
|
||||
|
@ -242,5 +242,58 @@ shared_examples 'a GitHub-ish import controller: POST create' do
|
|||
post :create, { target_namespace: nested_namespace.full_path, new_name: test_name, format: :js }
|
||||
end
|
||||
end
|
||||
|
||||
context 'user has chosen a non-existent nested namespaces and name for the project' do
|
||||
let(:test_name) { 'test_name' }
|
||||
|
||||
it 'takes the selected namespace and name' do
|
||||
expect(Gitlab::GithubImport::ProjectCreator).
|
||||
to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: 'foo/bar', new_name: test_name, format: :js }
|
||||
end
|
||||
|
||||
it 'creates the namespaces' do
|
||||
allow(Gitlab::GithubImport::ProjectCreator).
|
||||
to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider).
|
||||
and_return(double(execute: true))
|
||||
|
||||
expect { post :create, { target_namespace: 'foo/bar', new_name: test_name, format: :js } }
|
||||
.to change { Namespace.count }.by(2)
|
||||
end
|
||||
|
||||
it 'new namespace has the right parent' do
|
||||
allow(Gitlab::GithubImport::ProjectCreator).
|
||||
to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: 'foo/bar', new_name: test_name, format: :js }
|
||||
|
||||
expect(Namespace.find_by_path_or_name('bar').parent.path).to eq('foo')
|
||||
end
|
||||
end
|
||||
|
||||
context 'user has chosen existent and non-existent nested namespaces and name for the project' do
|
||||
let(:test_name) { 'test_name' }
|
||||
let!(:parent_namespace) { create(:namespace, name: 'foo', owner: user) }
|
||||
|
||||
it 'takes the selected namespace and name' do
|
||||
expect(Gitlab::GithubImport::ProjectCreator).
|
||||
to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider).
|
||||
and_return(double(execute: true))
|
||||
|
||||
post :create, { target_namespace: 'foo/foobar/bar', new_name: test_name, format: :js }
|
||||
end
|
||||
|
||||
it 'creates the namespaces' do
|
||||
allow(Gitlab::GithubImport::ProjectCreator).
|
||||
to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider).
|
||||
and_return(double(execute: true))
|
||||
|
||||
expect { post :create, { target_namespace: 'foo/foobar/bar', new_name: test_name, format: :js } }
|
||||
.to change { Namespace.count }.by(2)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue