Commit bdcd23b2 authored by James Lopez's avatar James Lopez Committed by Sean McGivern

Create subgroups if they don't exist while importing projects

parent 65ea732c
class Import::BaseController < ApplicationController class Import::BaseController < ApplicationController
private private
def find_or_create_namespace(name, owner) def find_or_create_namespace(names, owner)
return current_user.namespace if name == owner return current_user.namespace if names == owner
return current_user.namespace unless current_user.can_create_group? return current_user.namespace unless current_user.can_create_group?
begin names = params[:target_namespace].presence || names
name = params[:target_namespace].presence || name full_path_namespace = Namespace.find_by_full_path(names)
namespace = Group.create!(name: name, path: name, owner: current_user)
namespace.add_owner(current_user) return full_path_namespace if full_path_namespace
namespace
rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid names.split('/').inject(nil) do |parent, name|
Namespace.find_by_full_path(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 end
end end
---
title: Create subgroups if they don't exist while importing projects
merge_request:
author:
...@@ -200,5 +200,72 @@ describe Import::BitbucketController do ...@@ -200,5 +200,72 @@ describe Import::BitbucketController do
end end
end 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
end end
...@@ -174,6 +174,72 @@ describe Import::GitlabController do ...@@ -174,6 +174,72 @@ describe Import::GitlabController do
end end
end 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 end
end end
...@@ -180,7 +180,7 @@ shared_examples 'a GitHub-ish import controller: POST create' do ...@@ -180,7 +180,7 @@ shared_examples 'a GitHub-ish import controller: POST create' do
it "takes the new namespace" do it "takes the new namespace" do
expect(Gitlab::GithubImport::ProjectCreator). expect(Gitlab::GithubImport::ProjectCreator).
to receive(:new).with(provider_repo, provider_repo.name, an_instance_of(Group), user, access_params, type: provider). 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 post :create, target_namespace: provider_repo.name, format: :js
end end
...@@ -201,7 +201,7 @@ shared_examples 'a GitHub-ish import controller: POST create' do ...@@ -201,7 +201,7 @@ shared_examples 'a GitHub-ish import controller: POST create' do
it "takes the current user's namespace" do it "takes the current user's namespace" do
expect(Gitlab::GithubImport::ProjectCreator). expect(Gitlab::GithubImport::ProjectCreator).
to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider). 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 post :create, format: :js
end end
...@@ -229,7 +229,7 @@ shared_examples 'a GitHub-ish import controller: POST create' do ...@@ -229,7 +229,7 @@ shared_examples 'a GitHub-ish import controller: POST create' do
end end
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(:parent_namespace) { create(:namespace, name: 'foo', owner: user) }
let(:nested_namespace) { create(:namespace, name: 'bar', parent: parent_namespace, owner: user) } let(:nested_namespace) { create(:namespace, name: 'bar', parent: parent_namespace, owner: user) }
let(:test_name) { 'test_name' } let(:test_name) { 'test_name' }
...@@ -242,5 +242,58 @@ shared_examples 'a GitHub-ish import controller: POST create' do ...@@ -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 } post :create, { target_namespace: nested_namespace.full_path, new_name: test_name, format: :js }
end end
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
end end
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