Skip to content
Snippets Groups Projects
Commit 0c085aaf authored by Stan Hu's avatar Stan Hu
Browse files

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
parent d41e66cb
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -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
Loading
Loading
@@ -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
---
title: Fix hashed storage with project transfers to another namespace
merge_request:
author:
type: fixed
Loading
Loading
@@ -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
Loading
Loading
@@ -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
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment