Commit 1f311a9c authored by Michael Kozono's avatar Michael Kozono

Fix moving local files during namespace transfer

parent ea01d475
...@@ -27,8 +27,15 @@ module Storage ...@@ -27,8 +27,15 @@ module Storage
end end
end end
Gitlab::UploadsTransfer.new.rename_namespace(full_path_was, full_path) if parent_changed?
Gitlab::PagesTransfer.new.rename_namespace(full_path_was, full_path) former_parent_full_path = parent_id_was.nil? ? nil : Namespace.find(parent_id_was).full_path
parent_full_path = parent&.full_path
Gitlab::UploadsTransfer.new.move_namespace(path, former_parent_full_path, parent_full_path)
Gitlab::PagesTransfer.new.move_namespace(path, former_parent_full_path, parent_full_path)
else
Gitlab::UploadsTransfer.new.rename_namespace(full_path_was, full_path)
Gitlab::PagesTransfer.new.rename_namespace(full_path_was, full_path)
end
remove_exports! remove_exports!
......
---
title: Fix missing uploads after group transfer
merge_request: 17658
author:
type: fixed
module Gitlab module Gitlab
# This class is used to move local, unhashed files owned by projects to their new location
class ProjectTransfer class ProjectTransfer
def move_project(project_path, namespace_path_was, namespace_path) # nil parent_path (or parent_path_was) represents a root namespace
new_namespace_folder = File.join(root_dir, namespace_path) def move_namespace(path, parent_path_was, parent_path)
FileUtils.mkdir_p(new_namespace_folder) unless Dir.exist?(new_namespace_folder) parent_path_was ||= ''
from = File.join(root_dir, namespace_path_was, project_path) parent_path ||= ''
to = File.join(root_dir, namespace_path, project_path) new_parent_folder = File.join(root_dir, parent_path)
FileUtils.mkdir_p(new_parent_folder)
from = File.join(root_dir, parent_path_was, path)
to = File.join(root_dir, parent_path, path)
move(from, to, "") move(from, to, "")
end end
alias_method :move_project, :move_namespace
def rename_project(path_was, path, namespace_path) def rename_project(path_was, path, namespace_path)
base_dir = File.join(root_dir, namespace_path) base_dir = File.join(root_dir, namespace_path)
move(path_was, path, base_dir) move(path_was, path, base_dir)
......
...@@ -29,6 +29,41 @@ describe Gitlab::ProjectTransfer do ...@@ -29,6 +29,41 @@ describe Gitlab::ProjectTransfer do
end end
end end
describe '#move_namespace' do
context 'when moving namespace from root into another namespace' do
it "moves namespace projects' upload" do
child_namespace = 'test_child_namespace'
FileUtils.mkdir_p(File.join(@root_dir, child_namespace, @project_path))
@project_transfer.move_namespace(child_namespace, nil, @namespace_path)
expected_path = File.join(@root_dir, @namespace_path, child_namespace, @project_path)
expect(Dir.exist?(expected_path)).to be_truthy
end
end
context 'when moving namespace from one parent to another' do
it "moves namespace projects' upload" do
child_namespace = 'test_child_namespace'
FileUtils.mkdir_p(File.join(@root_dir, @namespace_path_was, child_namespace, @project_path))
@project_transfer.move_namespace(child_namespace, @namespace_path_was, @namespace_path)
expected_path = File.join(@root_dir, @namespace_path, child_namespace, @project_path)
expect(Dir.exist?(expected_path)).to be_truthy
end
end
context 'when moving namespace from having a parent to root' do
it "moves namespace projects' upload" do
child_namespace = 'test_child_namespace'
FileUtils.mkdir_p(File.join(@root_dir, @namespace_path_was, child_namespace, @project_path))
@project_transfer.move_namespace(child_namespace, @namespace_path_was, nil)
expected_path = File.join(@root_dir, child_namespace, @project_path)
expect(Dir.exist?(expected_path)).to be_truthy
end
end
end
describe '#rename_project' do describe '#rename_project' do
it "renames project" do it "renames project" do
FileUtils.mkdir_p(File.join(@root_dir, @namespace_path, @project_path_was)) FileUtils.mkdir_p(File.join(@root_dir, @namespace_path, @project_path_was))
......
...@@ -206,41 +206,65 @@ describe Namespace do ...@@ -206,41 +206,65 @@ describe Namespace do
context 'with subgroups' do context 'with subgroups' do
let(:parent) { create(:group, name: 'parent', path: 'parent') } let(:parent) { create(:group, name: 'parent', path: 'parent') }
let(:new_parent) { create(:group, name: 'new_parent', path: 'new_parent') }
let(:child) { create(:group, name: 'child', path: 'child', parent: parent) } let(:child) { create(:group, name: 'child', path: 'child', parent: parent) }
let!(:project) { create(:project_empty_repo, :legacy_storage, path: 'the-project', namespace: child, skip_disk_validation: true) } let!(:project) { create(:project_empty_repo, :legacy_storage, path: 'the-project', namespace: child, skip_disk_validation: true) }
let(:uploads_dir) { FileUploader.root } let(:uploads_dir) { FileUploader.root }
let(:pages_dir) { File.join(TestEnv.pages_path) } let(:pages_dir) { File.join(TestEnv.pages_path) }
def expect_project_directories_at(namespace_path)
expected_repository_path = File.join(TestEnv.repos_path, namespace_path, 'the-project.git')
expected_upload_path = File.join(uploads_dir, namespace_path, 'the-project')
expected_pages_path = File.join(pages_dir, namespace_path, 'the-project')
expect(File.directory?(expected_repository_path)).to be(true)
expect(File.directory?(expected_upload_path)).to be(true)
expect(File.directory?(expected_pages_path)).to be(true)
end
before do before do
FileUtils.mkdir_p(File.join(TestEnv.repos_path, "#{project.full_path}.git"))
FileUtils.mkdir_p(File.join(uploads_dir, project.full_path)) FileUtils.mkdir_p(File.join(uploads_dir, project.full_path))
FileUtils.mkdir_p(File.join(pages_dir, project.full_path)) FileUtils.mkdir_p(File.join(pages_dir, project.full_path))
end end
context 'renaming child' do context 'renaming child' do
it 'correctly moves the repository, uploads and pages' do it 'correctly moves the repository, uploads and pages' do
expected_repository_path = File.join(TestEnv.repos_path, 'parent', 'renamed', 'the-project.git') child.update!(path: 'renamed')
expected_upload_path = File.join(uploads_dir, 'parent', 'renamed', 'the-project')
expected_pages_path = File.join(pages_dir, 'parent', 'renamed', 'the-project')
child.update_attributes!(path: 'renamed') expect_project_directories_at('parent/renamed')
expect(File.directory?(expected_repository_path)).to be(true)
expect(File.directory?(expected_upload_path)).to be(true)
expect(File.directory?(expected_pages_path)).to be(true)
end end
end end
context 'renaming parent' do context 'renaming parent' do
it 'correctly moves the repository, uploads and pages' do it 'correctly moves the repository, uploads and pages' do
expected_repository_path = File.join(TestEnv.repos_path, 'renamed', 'child', 'the-project.git') parent.update!(path: 'renamed')
expected_upload_path = File.join(uploads_dir, 'renamed', 'child', 'the-project')
expected_pages_path = File.join(pages_dir, 'renamed', 'child', 'the-project') expect_project_directories_at('renamed/child')
end
end
context 'moving from one parent to another' do
it 'correctly moves the repository, uploads and pages' do
child.update!(parent: new_parent)
parent.update_attributes!(path: 'renamed') expect_project_directories_at('new_parent/child')
end
end
context 'moving from having a parent to root' do
it 'correctly moves the repository, uploads and pages' do
child.update!(parent: nil)
expect_project_directories_at('child')
end
end
context 'moving from root to having a parent' do
it 'correctly moves the repository, uploads and pages' do
parent.update!(parent: new_parent)
expect(File.directory?(expected_repository_path)).to be(true) expect_project_directories_at('new_parent/parent/child')
expect(File.directory?(expected_upload_path)).to be(true)
expect(File.directory?(expected_pages_path)).to be(true)
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