Commit 0c085aaf authored by Stan Hu's avatar Stan Hu

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
......@@ -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
---
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 }
......
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