diff --git a/app/models/namespace.rb b/app/models/namespace.rb index d983b2f106b..efbfc607040 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -272,7 +272,7 @@ class Namespace < ActiveRecord::Base def write_projects_full_path_config all_projects.each do |project| project.expires_full_path_cache # we need to clear cache to validate renames correctly - project.write_repository_config(:fullpath, project.full_path) + project.write_repository_config end end end diff --git a/app/models/project.rb b/app/models/project.rb index 47ca62aa5bb..9c0bbf697e2 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1420,10 +1420,7 @@ class Project < ActiveRecord::Base end def after_rename_repo - # We'd need to keep track of project full path otherwise directory tree - # created with hashed storage enabled cannot be usefully imported using - # the import rake task. - write_repository_config(:fullpath, full_path) + write_repository_config path_before_change = previous_changes['path'].first @@ -1437,11 +1434,13 @@ class Project < ActiveRecord::Base Gitlab::PagesTransfer.new.rename_project(path_before_change, self.path, namespace.full_path) end - def write_repository_config(key, value, prefix: :gitlab) - key = [prefix, key].compact.join('.') - repo.config[key] = value + def write_repository_config(gl_full_path: full_path) + # We'd need to keep track of project full path otherwise directory tree + # created with hashed storage enabled cannot be usefully imported using + # the import rake task. + repo.config['gitlab.fullpath'] = gl_full_path rescue Gitlab::Git::Repository::NoRepository => e - Rails.logger.error("Error writing key #{key} to .git/config for project #{full_path} (#{id}): #{e.message}.") + Rails.logger.error("Error writing to .git/config for project #{full_path} (#{id}): #{e.message}.") nil end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 24ae50f8dc4..01838ec6b5d 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -88,11 +88,7 @@ module Projects log_info("#{@project.owner.name} created a new project \"#{@project.name_with_namespace}\"") unless @project.gitlab_project_import? - # We'd need to keep track of project full path otherwise directory tree - # created with hashed storage enabled cannot be usefully imported using - # the import rake task. - @project.write_repository_config(:fullpath, @project.full_path) - + @project.write_repository_config @project.create_wiki unless skip_wiki? create_services_from_active_templates(@project) diff --git a/app/services/projects/hashed_storage/migrate_repository_service.rb b/app/services/projects/hashed_storage/migrate_repository_service.rb index c076ce06278..b6763c9436f 100644 --- a/app/services/projects/hashed_storage/migrate_repository_service.rb +++ b/app/services/projects/hashed_storage/migrate_repository_service.rb @@ -30,6 +30,8 @@ module Projects unless result rollback_folder_move project.storage_version = nil + else + project.write_repository_config end project.repository_read_only = false @@ -39,13 +41,6 @@ module Projects yield end - # We'd need to keep track of project full path otherwise directory tree - # created with hashed storage enabled cannot be usefully imported using - # the import rake task. - if result - project.write_repository_config(:fullpath, project.full_path) - end - result end diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index e742df5f696..14cf9f82bdb 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -101,10 +101,7 @@ module Projects end def write_repository_config(full_path) - # We'd need to keep track of project full path otherwise directory tree - # created with hashed storage enabled cannot be usefully imported using - # the import rake task. - project.write_repository_config(:fullpath, full_path) + project.write_repository_config(:gl_fullpath, full_path) end def refresh_permissions diff --git a/lib/gitlab/bare_repository_import/importer.rb b/lib/gitlab/bare_repository_import/importer.rb index 1f0fdc6685e..709a901aa77 100644 --- a/lib/gitlab/bare_repository_import/importer.rb +++ b/lib/gitlab/bare_repository_import/importer.rb @@ -20,7 +20,7 @@ module Gitlab next end - log "Processing #{repo_path} -> #{bare_repo.project_full_path}".color(:yellow) + log "Processing #{repo_path}".color(:yellow) new(user, bare_repo).create_project_if_needed end @@ -62,10 +62,7 @@ module Gitlab if project.persisted? && mv_repo(project) log " * Created #{project.name} (#{project_full_path})".color(:green) - # We'd need to keep track of project full path otherwise directory tree - # created with hashed storage enabled cannot be usefully imported using - # the import rake task. - project.write_repository_config(:fullpath, project.full_path) + project.write_repository_config ProjectCacheWorker.perform_async(project.id) else diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 62029f385a2..1d4b68bdf8d 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -2630,9 +2630,9 @@ describe Project do it 'updates project full path in .git/config' do allow(project_storage).to receive(:rename_repo).and_return(true) - expect(project).to receive(:write_repository_config).with(:fullpath, project.full_path) - project.rename_repo + + expect(project.repo.config['gitlab.fullpath']).to eq(project.full_path) end end @@ -2678,12 +2678,10 @@ describe Project do context 'hashed storage' do let(:project) { create(:project, :repository, skip_disk_validation: true) } let(:gitlab_shell) { Gitlab::Shell.new } - let(:hash) { '6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b' } + let(:hash) { Digest::SHA2.hexdigest(project.id.to_s) } before do stub_application_setting(hashed_storage_enabled: true) - allow(Digest::SHA2).to receive(:hexdigest) { hash } - allow(project).to receive(:gitlab_shell).and_return(gitlab_shell) end describe '#legacy_storage?' do @@ -2706,13 +2704,13 @@ describe Project do describe '#base_dir' do it 'returns base_dir based on hash of project id' do - expect(project.base_dir).to eq('@hashed/6b/86') + expect(project.base_dir).to eq("@hashed/#{hash[0..1]}/#{hash[2..3]}") end end describe '#disk_path' do it 'returns disk_path based on hash of project id' do - hashed_path = '@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b' + hashed_path = "@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}" expect(project.disk_path).to eq(hashed_path) end @@ -2720,7 +2718,9 @@ describe Project do describe '#ensure_storage_path_exists' do it 'delegates to gitlab_shell to ensure namespace is created' do - expect(gitlab_shell).to receive(:add_namespace).with(project.repository_storage_path, '@hashed/6b/86') + allow(project).to receive(:gitlab_shell).and_return(gitlab_shell) + + expect(gitlab_shell).to receive(:add_namespace).with(project.repository_storage_path, "@hashed/#{hash[0..1]}/#{hash[2..3]}") project.ensure_storage_path_exists end @@ -2780,7 +2780,7 @@ describe Project do end context 'when not rolled out' do - let(:project) { create(:project, :repository, storage_version: 1) } + let(:project) { create(:project, :repository, storage_version: 1, skip_disk_validation: true) } it 'moves pages folder to new location' do expect_any_instance_of(Gitlab::UploadsTransfer).to receive(:rename_project) @@ -2791,9 +2791,9 @@ describe Project do end it 'updates project full path in .git/config' do - expect(project).to receive(:write_repository_config).with(:fullpath, project.full_path) - project.rename_repo + + expect(project.repo.config['gitlab.fullpath']).to eq(project.full_path) end end