Commit 271ab515 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'dz-fix-group-move' into 'master'

Fix subgroup repository disappearance if group was moved

Closes #30261

See merge request !10414
parents ebdfda69 0617876d
...@@ -150,7 +150,7 @@ class Namespace < ActiveRecord::Base ...@@ -150,7 +150,7 @@ class Namespace < ActiveRecord::Base
end end
def any_project_has_container_registry_tags? def any_project_has_container_registry_tags?
projects.any?(&:has_container_registry_tags?) all_projects.any?(&:has_container_registry_tags?)
end end
def send_update_instructions def send_update_instructions
...@@ -214,6 +214,12 @@ class Namespace < ActiveRecord::Base ...@@ -214,6 +214,12 @@ class Namespace < ActiveRecord::Base
@old_repository_storage_paths ||= repository_storage_paths @old_repository_storage_paths ||= repository_storage_paths
end end
# Includes projects from this namespace and projects from all subgroups
# that belongs to this namespace
def all_projects
Project.inside_path(full_path)
end
private private
def repository_storage_paths def repository_storage_paths
...@@ -221,7 +227,7 @@ class Namespace < ActiveRecord::Base ...@@ -221,7 +227,7 @@ class Namespace < ActiveRecord::Base
# pending delete. Unscoping also get rids of the default order, which causes # pending delete. Unscoping also get rids of the default order, which causes
# problems with SELECT DISTINCT. # problems with SELECT DISTINCT.
Project.unscoped do Project.unscoped do
projects.select('distinct(repository_storage)').to_a.map(&:repository_storage_path) all_projects.select('distinct(repository_storage)').to_a.map(&:repository_storage_path)
end end
end end
......
---
title: Fix subgroup repository disappearance if group was moved
merge_request: 10414
author:
...@@ -162,22 +162,23 @@ describe Namespace, models: true do ...@@ -162,22 +162,23 @@ describe Namespace, models: true do
it { expect { @namespace.move_dir }.to raise_error('Namespace cannot be moved, because at least one project has tags in container registry') } it { expect { @namespace.move_dir }.to raise_error('Namespace cannot be moved, because at least one project has tags in container registry') }
end end
context 'renaming a sub-group' do context 'with subgroups' do
let(:parent) { create(:group, name: 'parent', path: 'parent') } let(:parent) { create(:group, name: 'parent', path: '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, path: 'the-project', namespace: child) } let!(:project) { create(:project_empty_repo, path: 'the-project', namespace: child) }
let(:uploads_dir) { File.join(CarrierWave.root, 'uploads', 'parent') } let(:uploads_dir) { File.join(CarrierWave.root, 'uploads') }
let(:pages_dir) { File.join(TestEnv.pages_path, 'parent') } let(:pages_dir) { TestEnv.pages_path }
before do before do
FileUtils.mkdir_p(File.join(uploads_dir, 'child', 'the-project')) FileUtils.mkdir_p(File.join(uploads_dir, 'parent', 'child', 'the-project'))
FileUtils.mkdir_p(File.join(pages_dir, 'child', 'the-project')) FileUtils.mkdir_p(File.join(pages_dir, 'parent', 'child', 'the-project'))
end end
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') expected_repository_path = File.join(TestEnv.repos_path, 'parent', 'renamed', 'the-project.git')
expected_upload_path = File.join(uploads_dir, 'renamed', 'the-project') expected_upload_path = File.join(uploads_dir, 'parent', 'renamed', 'the-project')
expected_pages_path = File.join(pages_dir, 'renamed', 'the-project') expected_pages_path = File.join(pages_dir, 'parent', 'renamed', 'the-project')
child.update_attributes!(path: 'renamed') child.update_attributes!(path: 'renamed')
...@@ -186,6 +187,21 @@ describe Namespace, models: true do ...@@ -186,6 +187,21 @@ describe Namespace, models: true do
expect(File.directory?(expected_pages_path)).to be(true) expect(File.directory?(expected_pages_path)).to be(true)
end end
end end
context 'renaming parent' do
it 'correctly moves the repository, uploads and pages' do
expected_repository_path = File.join(TestEnv.repos_path, 'renamed', 'child', 'the-project.git')
expected_upload_path = File.join(uploads_dir, 'renamed', 'child', 'the-project')
expected_pages_path = File.join(pages_dir, 'renamed', 'child', 'the-project')
parent.update_attributes!(path: '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 end
describe '#rm_dir', 'callback', repository: true do describe '#rm_dir', 'callback', repository: true do
...@@ -295,4 +311,13 @@ describe Namespace, models: true do ...@@ -295,4 +311,13 @@ describe Namespace, models: true do
to eq([namespace.owner_id]) to eq([namespace.owner_id])
end end
end end
describe '#all_projects' do
let(:group) { create(:group) }
let(:child) { create(:group, parent: group) }
let!(:project1) { create(:project_empty_repo, namespace: group) }
let!(:project2) { create(:project_empty_repo, namespace: child) }
it { expect(group.all_projects.to_a).to eq([project2, project1]) }
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