Fix hashed storage with project transfers to another namespace
With hashed storage enabled, we would fail to transfer a project to another namespace because the provided paths were wrong. Instead, we should not attempt to move paths at all. Closes gitlab-org/gitlab-ee#4056
This commit is contained in:
parent
d41e66cb63
commit
0c085aaf44
|
@ -60,15 +60,8 @@ module Projects
|
|||
# Notifications
|
||||
project.send_move_instructions(@old_path)
|
||||
|
||||
# Move main repository
|
||||
# TODO: check storage type and NOOP when not using Legacy
|
||||
unless move_repo_folder(@old_path, @new_path)
|
||||
raise TransferError.new('Cannot move project')
|
||||
end
|
||||
|
||||
# Move wiki repo also if present
|
||||
# TODO: check storage type and NOOP when not using Legacy
|
||||
move_repo_folder("#{@old_path}.wiki", "#{@new_path}.wiki")
|
||||
# Directories on disk
|
||||
move_project_folders(project)
|
||||
|
||||
# Move missing group labels to project
|
||||
Labels::TransferService.new(current_user, @old_group, project).execute
|
||||
|
@ -131,5 +124,20 @@ module Projects
|
|||
def execute_system_hooks
|
||||
SystemHooksService.new.execute_hooks_for(project, :transfer)
|
||||
end
|
||||
|
||||
def move_project_folders(project)
|
||||
return if project.hashed_storage?(:repository)
|
||||
|
||||
# Move main repository
|
||||
unless move_repo_folder(@old_path, @new_path)
|
||||
raise TransferError.new("Cannot move project")
|
||||
end
|
||||
|
||||
# Disk path is changed; we need to ensure we reload it
|
||||
project.reload_repository!
|
||||
|
||||
# Move wiki repo also if present
|
||||
move_repo_folder("#{@old_path}.wiki", "#{@new_path}.wiki")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix hashed storage with project transfers to another namespace
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
|
@ -42,6 +42,18 @@ describe Projects::TransferService do
|
|||
expect(service).to receive(:execute_system_hooks)
|
||||
end
|
||||
end
|
||||
|
||||
it 'disk path has moved' do
|
||||
old_path = project.repository.disk_path
|
||||
old_full_path = project.repository.full_path
|
||||
|
||||
transfer_project(project, user, group)
|
||||
|
||||
expect(project.repository.disk_path).not_to eq(old_path)
|
||||
expect(project.repository.full_path).not_to eq(old_full_path)
|
||||
expect(project.disk_path).not_to eq(old_path)
|
||||
expect(project.disk_path).to start_with(group.path)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when transfer fails' do
|
||||
|
@ -188,6 +200,26 @@ describe Projects::TransferService do
|
|||
end
|
||||
end
|
||||
|
||||
context 'when hashed storage in use' do
|
||||
let(:hashed_project) { create(:project, :repository, :hashed, namespace: user.namespace) }
|
||||
|
||||
before do
|
||||
group.add_owner(user)
|
||||
end
|
||||
|
||||
it 'does not move the directory' do
|
||||
old_path = hashed_project.repository.disk_path
|
||||
old_full_path = hashed_project.repository.full_path
|
||||
|
||||
transfer_project(hashed_project, user, group)
|
||||
project.reload
|
||||
|
||||
expect(hashed_project.repository.disk_path).to eq(old_path)
|
||||
expect(hashed_project.repository.full_path).to eq(old_full_path)
|
||||
expect(hashed_project.disk_path).to eq(old_path)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'refreshing project authorizations' do
|
||||
let(:group) { create(:group) }
|
||||
let(:owner) { project.namespace.owner }
|
||||
|
|
Loading…
Reference in New Issue