Merge branch '40744-hashed-storage-specs' into 'master'
Use hashed storage in the specs Closes #40744 See merge request gitlab-org/gitlab-ce!15681
This commit is contained in:
commit
5edd94ae75
|
@ -13,7 +13,7 @@ module API
|
||||||
# key_id - ssh key id for Git over SSH
|
# key_id - ssh key id for Git over SSH
|
||||||
# user_id - user id for Git over HTTP
|
# user_id - user id for Git over HTTP
|
||||||
# protocol - Git access protocol being used, e.g. HTTP or SSH
|
# protocol - Git access protocol being used, e.g. HTTP or SSH
|
||||||
# project - project path with namespace
|
# project - project full_path (not path on disk)
|
||||||
# action - git action (git-upload-pack or git-receive-pack)
|
# action - git action (git-upload-pack or git-receive-pack)
|
||||||
# changes - changes as "oldrev newrev ref", see Gitlab::ChangesList
|
# changes - changes as "oldrev newrev ref", see Gitlab::ChangesList
|
||||||
post "/allowed" do
|
post "/allowed" do
|
||||||
|
|
|
@ -69,9 +69,8 @@ describe ProfilesController, :request_store do
|
||||||
|
|
||||||
describe 'PUT update_username' do
|
describe 'PUT update_username' do
|
||||||
let(:namespace) { user.namespace }
|
let(:namespace) { user.namespace }
|
||||||
let(:project) { create(:project_empty_repo, namespace: namespace) }
|
|
||||||
let(:gitlab_shell) { Gitlab::Shell.new }
|
let(:gitlab_shell) { Gitlab::Shell.new }
|
||||||
let(:new_username) { 'renamedtosomethingelse' }
|
let(:new_username) { generate(:username) }
|
||||||
|
|
||||||
it 'allows username change' do
|
it 'allows username change' do
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
|
@ -85,16 +84,39 @@ describe ProfilesController, :request_store do
|
||||||
expect(user.username).to eq(new_username)
|
expect(user.username).to eq(new_username)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'moves dependent projects to new namespace' do
|
context 'with legacy storage' do
|
||||||
sign_in(user)
|
it 'moves dependent projects to new namespace' do
|
||||||
|
project = create(:project_empty_repo, :legacy_storage, namespace: namespace)
|
||||||
|
|
||||||
put :update_username,
|
sign_in(user)
|
||||||
user: { username: new_username }
|
|
||||||
|
|
||||||
user.reload
|
put :update_username,
|
||||||
|
user: { username: new_username }
|
||||||
|
|
||||||
expect(response.status).to eq(302)
|
user.reload
|
||||||
expect(gitlab_shell.exists?(project.repository_storage_path, "#{new_username}/#{project.path}.git")).to be_truthy
|
|
||||||
|
expect(response.status).to eq(302)
|
||||||
|
expect(gitlab_shell.exists?(project.repository_storage_path, "#{new_username}/#{project.path}.git")).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with hashed storage' do
|
||||||
|
it 'keeps repository location unchanged on disk' do
|
||||||
|
project = create(:project_empty_repo, namespace: namespace)
|
||||||
|
|
||||||
|
before_disk_path = project.disk_path
|
||||||
|
|
||||||
|
sign_in(user)
|
||||||
|
|
||||||
|
put :update_username,
|
||||||
|
user: { username: new_username }
|
||||||
|
|
||||||
|
user.reload
|
||||||
|
|
||||||
|
expect(response.status).to eq(302)
|
||||||
|
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_truthy
|
||||||
|
expect(before_disk_path).to eq(project.disk_path)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -288,62 +288,82 @@ describe ProjectsController do
|
||||||
render_views
|
render_views
|
||||||
|
|
||||||
let(:admin) { create(:admin) }
|
let(:admin) { create(:admin) }
|
||||||
let(:project) { create(:project, :repository) }
|
|
||||||
|
|
||||||
before do
|
before do
|
||||||
sign_in(admin)
|
sign_in(admin)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when only renaming a project path' do
|
shared_examples_for 'updating a project' do
|
||||||
it "sets the repository to the right path after a rename" do
|
context 'when only renaming a project path' do
|
||||||
expect { update_project path: 'renamed_path' }
|
it "sets the repository to the right path after a rename" do
|
||||||
.to change { project.reload.path }
|
original_repository_path = project.repository.path
|
||||||
|
|
||||||
|
expect { update_project path: 'renamed_path' }
|
||||||
|
.to change { project.reload.path }
|
||||||
|
expect(project.path).to include 'renamed_path'
|
||||||
|
|
||||||
|
if project.hashed_storage?(:repository)
|
||||||
|
expect(assigns(:repository).path).to eq(original_repository_path)
|
||||||
|
else
|
||||||
|
expect(assigns(:repository).path).to include(project.path)
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(302)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when project has container repositories with tags' do
|
||||||
|
before do
|
||||||
|
stub_container_registry_config(enabled: true)
|
||||||
|
stub_container_registry_tags(repository: /image/, tags: %w[rc1])
|
||||||
|
create(:container_repository, project: project, name: :image)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'does not allow to rename the project' do
|
||||||
|
expect { update_project path: 'renamed_path' }
|
||||||
|
.not_to change { project.reload.path }
|
||||||
|
|
||||||
|
expect(controller).to set_flash[:alert].to(/container registry tags/)
|
||||||
|
expect(response).to have_gitlab_http_status(200)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'updates Fast Forward Merge attributes' do
|
||||||
|
controller.instance_variable_set(:@project, project)
|
||||||
|
|
||||||
|
params = {
|
||||||
|
merge_method: :ff
|
||||||
|
}
|
||||||
|
|
||||||
|
put :update,
|
||||||
|
namespace_id: project.namespace,
|
||||||
|
id: project.id,
|
||||||
|
project: params
|
||||||
|
|
||||||
expect(project.path).to include 'renamed_path'
|
|
||||||
expect(assigns(:repository).path).to include project.path
|
|
||||||
expect(response).to have_gitlab_http_status(302)
|
expect(response).to have_gitlab_http_status(302)
|
||||||
|
params.each do |param, value|
|
||||||
|
expect(project.public_send(param)).to eq(value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_project(**parameters)
|
||||||
|
put :update,
|
||||||
|
namespace_id: project.namespace.path,
|
||||||
|
id: project.path,
|
||||||
|
project: parameters
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when project has container repositories with tags' do
|
context 'hashed storage' do
|
||||||
before do
|
let(:project) { create(:project, :repository) }
|
||||||
stub_container_registry_config(enabled: true)
|
|
||||||
stub_container_registry_tags(repository: /image/, tags: %w[rc1])
|
|
||||||
create(:container_repository, project: project, name: :image)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'does not allow to rename the project' do
|
it_behaves_like 'updating a project'
|
||||||
expect { update_project path: 'renamed_path' }
|
|
||||||
.not_to change { project.reload.path }
|
|
||||||
|
|
||||||
expect(controller).to set_flash[:alert].to(/container registry tags/)
|
|
||||||
expect(response).to have_gitlab_http_status(200)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'updates Fast Forward Merge attributes' do
|
context 'legacy storage' do
|
||||||
controller.instance_variable_set(:@project, project)
|
let(:project) { create(:project, :repository, :legacy_storage) }
|
||||||
|
|
||||||
params = {
|
it_behaves_like 'updating a project'
|
||||||
merge_method: :ff
|
|
||||||
}
|
|
||||||
|
|
||||||
put :update,
|
|
||||||
namespace_id: project.namespace,
|
|
||||||
id: project.id,
|
|
||||||
project: params
|
|
||||||
|
|
||||||
expect(response).to have_gitlab_http_status(302)
|
|
||||||
params.each do |param, value|
|
|
||||||
expect(project.public_send(param)).to eq(value)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_project(**parameters)
|
|
||||||
put :update,
|
|
||||||
namespace_id: project.namespace.path,
|
|
||||||
id: project.path,
|
|
||||||
project: parameters
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -81,8 +81,10 @@ FactoryBot.define do
|
||||||
archived true
|
archived true
|
||||||
end
|
end
|
||||||
|
|
||||||
trait :hashed do
|
storage_version Project::LATEST_STORAGE_VERSION
|
||||||
storage_version Project::LATEST_STORAGE_VERSION
|
|
||||||
|
trait :legacy_storage do
|
||||||
|
storage_version nil
|
||||||
end
|
end
|
||||||
|
|
||||||
trait :access_requestable do
|
trait :access_requestable do
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
feature 'Import/Export - Namespace export file cleanup', :js do
|
describe 'Import/Export - Namespace export file cleanup', :js do
|
||||||
let(:export_path) { Dir.mktmpdir('namespace_export_file_spec') }
|
let(:export_path) { Dir.mktmpdir('namespace_export_file_spec') }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
@ -42,13 +42,13 @@ feature 'Import/Export - Namespace export file cleanup', :js do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'legacy storage' do
|
describe 'legacy storage' do
|
||||||
let(:project) { create(:project) }
|
let(:project) { create(:project, :legacy_storage) }
|
||||||
|
|
||||||
it_behaves_like 'handling project exports on namespace change'
|
it_behaves_like 'handling project exports on namespace change'
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'hashed storage' do
|
describe 'hashed storage' do
|
||||||
let(:project) { create(:project, :hashed) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
it_behaves_like 'handling project exports on namespace change'
|
it_behaves_like 'handling project exports on namespace change'
|
||||||
end
|
end
|
||||||
|
|
|
@ -33,10 +33,22 @@ describe Backup::Repository do
|
||||||
allow(Gitlab::Popen).to receive(:popen).and_return(['error', 1])
|
allow(Gitlab::Popen).to receive(:popen).and_return(['error', 1])
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'shows the appropriate error' do
|
context 'hashed storage' do
|
||||||
described_class.new.restore
|
it 'shows the appropriate error' do
|
||||||
|
described_class.new.restore
|
||||||
|
|
||||||
expect(progress).to have_received(:puts).with("Ignoring error on #{project.full_path} - error")
|
expect(progress).to have_received(:puts).with("Ignoring error on #{project.full_path} (#{project.disk_path}) - error")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'legacy storage' do
|
||||||
|
let!(:project) { create(:project, :legacy_storage) }
|
||||||
|
|
||||||
|
it 'shows the appropriate error' do
|
||||||
|
described_class.new.restore
|
||||||
|
|
||||||
|
expect(progress).to have_received(:puts).with("Ignoring error on #{project.full_path} - error")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,8 +23,8 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq do
|
||||||
let!(:appearance) { create_or_update_appearance(logo: uploaded_file, header_logo: uploaded_file) }
|
let!(:appearance) { create_or_update_appearance(logo: uploaded_file, header_logo: uploaded_file) }
|
||||||
let!(:user1) { create(:user, :with_avatar) }
|
let!(:user1) { create(:user, :with_avatar) }
|
||||||
let!(:user2) { create(:user, :with_avatar) }
|
let!(:user2) { create(:user, :with_avatar) }
|
||||||
let!(:project1) { create(:project, :with_avatar) }
|
let!(:project1) { create(:project, :legacy_storage, :with_avatar) }
|
||||||
let!(:project2) { create(:project, :with_avatar) }
|
let!(:project2) { create(:project, :legacy_storage, :with_avatar) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
UploadService.new(project1, uploaded_file, FileUploader).execute # Markdown upload
|
UploadService.new(project1, uploaded_file, FileUploader).execute # Markdown upload
|
||||||
|
@ -48,7 +48,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq do
|
||||||
|
|
||||||
it 'adds untracked files to the uploads table' do
|
it 'adds untracked files to the uploads table' do
|
||||||
expect do
|
expect do
|
||||||
subject.perform(1, untracked_files_for_uploads.last.id)
|
subject.perform(1, untracked_files_for_uploads.reorder(:id).last.id)
|
||||||
end.to change { uploads.count }.from(4).to(8)
|
end.to change { uploads.count }.from(4).to(8)
|
||||||
|
|
||||||
expect(user2.uploads.count).to eq(1)
|
expect(user2.uploads.count).to eq(1)
|
||||||
|
@ -213,13 +213,13 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads, :sidekiq do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'for a project avatar file path' do
|
context 'for a project avatar file path' do
|
||||||
let(:model) { create(:project, :with_avatar) }
|
let(:model) { create(:project, :legacy_storage, :with_avatar) }
|
||||||
|
|
||||||
it_behaves_like 'non_markdown_file'
|
it_behaves_like 'non_markdown_file'
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
||||||
let(:model) { create(:project) }
|
let(:model) { create(:project, :legacy_storage) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
# Upload the file
|
# Upload the file
|
||||||
|
@ -304,7 +304,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do
|
||||||
|
|
||||||
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
||||||
it 'returns the file path relative to the project directory in uploads' do
|
it 'returns the file path relative to the project directory in uploads' do
|
||||||
project = create(:project)
|
project = create(:project, :legacy_storage)
|
||||||
random_hex = SecureRandom.hex
|
random_hex = SecureRandom.hex
|
||||||
|
|
||||||
assert_upload_path("/#{project.full_path}/#{random_hex}/Some file.jpg", "#{random_hex}/Some file.jpg")
|
assert_upload_path("/#{project.full_path}/#{random_hex}/Some file.jpg", "#{random_hex}/Some file.jpg")
|
||||||
|
@ -357,7 +357,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do
|
||||||
|
|
||||||
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
||||||
it 'returns FileUploader as a string' do
|
it 'returns FileUploader as a string' do
|
||||||
project = create(:project)
|
project = create(:project, :legacy_storage)
|
||||||
|
|
||||||
assert_uploader("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", 'FileUploader')
|
assert_uploader("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", 'FileUploader')
|
||||||
end
|
end
|
||||||
|
@ -409,7 +409,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do
|
||||||
|
|
||||||
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
||||||
it 'returns Project as a string' do
|
it 'returns Project as a string' do
|
||||||
project = create(:project)
|
project = create(:project, :legacy_storage)
|
||||||
|
|
||||||
assert_model_type("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", 'Project')
|
assert_model_type("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", 'Project')
|
||||||
end
|
end
|
||||||
|
@ -461,7 +461,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do
|
||||||
|
|
||||||
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
||||||
it 'returns the ID as a string' do
|
it 'returns the ID as a string' do
|
||||||
project = create(:project)
|
project = create(:project, :legacy_storage)
|
||||||
|
|
||||||
assert_model_id("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", project.id)
|
assert_model_id("/#{project.full_path}/#{SecureRandom.hex}/Some file.jpg", project.id)
|
||||||
end
|
end
|
||||||
|
@ -483,7 +483,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'for a project avatar file path' do
|
context 'for a project avatar file path' do
|
||||||
let(:project) { create(:project, avatar: uploaded_file) }
|
let(:project) { create(:project, :legacy_storage, avatar: uploaded_file) }
|
||||||
let(:untracked_file) { described_class.create!(path: project.uploads.first.path) }
|
let(:untracked_file) { described_class.create!(path: project.uploads.first.path) }
|
||||||
|
|
||||||
it 'returns the file size' do
|
it 'returns the file size' do
|
||||||
|
@ -496,7 +496,7 @@ describe Gitlab::BackgroundMigration::PopulateUntrackedUploads::UntrackedFile do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
context 'for a project Markdown attachment (notes, issues, MR descriptions) file path' do
|
||||||
let(:project) { create(:project) }
|
let(:project) { create(:project, :legacy_storage) }
|
||||||
let(:untracked_file) { create_untracked_file("/#{project.full_path}/#{project.uploads.first.path}") }
|
let(:untracked_file) { create_untracked_file("/#{project.full_path}/#{project.uploads.first.path}") }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -77,7 +77,7 @@ describe Gitlab::BackgroundMigration::PrepareUntrackedUploads, :sidekiq do
|
||||||
context 'when files were uploaded before and after hashed storage was enabled' do
|
context 'when files were uploaded before and after hashed storage was enabled' do
|
||||||
let!(:appearance) { create_or_update_appearance(logo: uploaded_file, header_logo: uploaded_file) }
|
let!(:appearance) { create_or_update_appearance(logo: uploaded_file, header_logo: uploaded_file) }
|
||||||
let!(:user) { create(:user, :with_avatar) }
|
let!(:user) { create(:user, :with_avatar) }
|
||||||
let!(:project1) { create(:project, :with_avatar) }
|
let!(:project1) { create(:project, :with_avatar, :legacy_storage) }
|
||||||
let(:project2) { create(:project) } # instantiate after enabling hashed_storage
|
let(:project2) { create(:project) } # instantiate after enabling hashed_storage
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
@ -149,7 +149,7 @@ describe Gitlab::BackgroundMigration::PrepareUntrackedUploads, :sidekiq do
|
||||||
context 'when files were uploaded before and after hashed storage was enabled' do
|
context 'when files were uploaded before and after hashed storage was enabled' do
|
||||||
let!(:appearance) { create_or_update_appearance(logo: uploaded_file, header_logo: uploaded_file) }
|
let!(:appearance) { create_or_update_appearance(logo: uploaded_file, header_logo: uploaded_file) }
|
||||||
let!(:user) { create(:user, :with_avatar) }
|
let!(:user) { create(:user, :with_avatar) }
|
||||||
let!(:project1) { create(:project, :with_avatar) }
|
let!(:project1) { create(:project, :with_avatar, :legacy_storage) }
|
||||||
let(:project2) { create(:project) } # instantiate after enabling hashed_storage
|
let(:project2) { create(:project) } # instantiate after enabling hashed_storage
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -8,11 +8,15 @@ describe Gitlab::BareRepositoryImport::Importer, repository: true do
|
||||||
subject(:importer) { described_class.new(admin, bare_repository) }
|
subject(:importer) { described_class.new(admin, bare_repository) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
@rainbow = Rainbow.enabled
|
||||||
|
Rainbow.enabled = false
|
||||||
|
|
||||||
allow(described_class).to receive(:log)
|
allow(described_class).to receive(:log)
|
||||||
end
|
end
|
||||||
|
|
||||||
after do
|
after do
|
||||||
FileUtils.rm_rf(base_dir)
|
FileUtils.rm_rf(base_dir)
|
||||||
|
Rainbow.enabled = @rainbow
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples 'importing a repository' do
|
shared_examples 'importing a repository' do
|
||||||
|
@ -148,7 +152,7 @@ describe Gitlab::BareRepositoryImport::Importer, repository: true do
|
||||||
# This is a quick way to get a valid repository instead of copying an
|
# This is a quick way to get a valid repository instead of copying an
|
||||||
# existing one. Since it's not persisted, the importer will try to
|
# existing one. Since it's not persisted, the importer will try to
|
||||||
# create the project.
|
# create the project.
|
||||||
project = build(:project, :repository)
|
project = build(:project, :legacy_storage, :repository)
|
||||||
original_commit_count = project.repository.commit_count
|
original_commit_count = project.repository.commit_count
|
||||||
|
|
||||||
bare_repo = Gitlab::BareRepositoryImport::Repository.new(project.repository_storage_path, project.repository.path)
|
bare_repo = Gitlab::BareRepositoryImport::Repository.new(project.repository_storage_path, project.repository.path)
|
||||||
|
|
|
@ -94,7 +94,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameNamespaces, :
|
||||||
describe '#move_repositories' do
|
describe '#move_repositories' do
|
||||||
let(:namespace) { create(:group, name: 'hello-group') }
|
let(:namespace) { create(:group, name: 'hello-group') }
|
||||||
it 'moves a project for a namespace' do
|
it 'moves a project for a namespace' do
|
||||||
create(:project, :repository, namespace: namespace, path: 'hello-project')
|
create(:project, :repository, :legacy_storage, namespace: namespace, path: 'hello-project')
|
||||||
expected_path = File.join(TestEnv.repos_path, 'bye-group', 'hello-project.git')
|
expected_path = File.join(TestEnv.repos_path, 'bye-group', 'hello-project.git')
|
||||||
|
|
||||||
subject.move_repositories(namespace, 'hello-group', 'bye-group')
|
subject.move_repositories(namespace, 'hello-group', 'bye-group')
|
||||||
|
@ -104,7 +104,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameNamespaces, :
|
||||||
|
|
||||||
it 'moves a namespace in a subdirectory correctly' do
|
it 'moves a namespace in a subdirectory correctly' do
|
||||||
child_namespace = create(:group, name: 'sub-group', parent: namespace)
|
child_namespace = create(:group, name: 'sub-group', parent: namespace)
|
||||||
create(:project, :repository, namespace: child_namespace, path: 'hello-project')
|
create(:project, :repository, :legacy_storage, namespace: child_namespace, path: 'hello-project')
|
||||||
|
|
||||||
expected_path = File.join(TestEnv.repos_path, 'hello-group', 'renamed-sub-group', 'hello-project.git')
|
expected_path = File.join(TestEnv.repos_path, 'hello-group', 'renamed-sub-group', 'hello-project.git')
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameNamespaces, :
|
||||||
|
|
||||||
it 'moves a parent namespace with subdirectories' do
|
it 'moves a parent namespace with subdirectories' do
|
||||||
child_namespace = create(:group, name: 'sub-group', parent: namespace)
|
child_namespace = create(:group, name: 'sub-group', parent: namespace)
|
||||||
create(:project, :repository, namespace: child_namespace, path: 'hello-project')
|
create(:project, :repository, :legacy_storage, namespace: child_namespace, path: 'hello-project')
|
||||||
expected_path = File.join(TestEnv.repos_path, 'renamed-group', 'sub-group', 'hello-project.git')
|
expected_path = File.join(TestEnv.repos_path, 'renamed-group', 'sub-group', 'hello-project.git')
|
||||||
|
|
||||||
subject.move_repositories(child_namespace, 'hello-group', 'renamed-group')
|
subject.move_repositories(child_namespace, 'hello-group', 'renamed-group')
|
||||||
|
@ -166,7 +166,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameNamespaces, :
|
||||||
|
|
||||||
describe '#rename_namespace_dependencies' do
|
describe '#rename_namespace_dependencies' do
|
||||||
it "moves the the repository for a project in the namespace" do
|
it "moves the the repository for a project in the namespace" do
|
||||||
create(:project, :repository, namespace: namespace, path: "the-path-project")
|
create(:project, :repository, :legacy_storage, namespace: namespace, path: "the-path-project")
|
||||||
expected_repo = File.join(TestEnv.repos_path, "the-path0", "the-path-project.git")
|
expected_repo = File.join(TestEnv.repos_path, "the-path0", "the-path-project.git")
|
||||||
|
|
||||||
subject.rename_namespace_dependencies(namespace, 'the-path', 'the-path0')
|
subject.rename_namespace_dependencies(namespace, 'the-path', 'the-path0')
|
||||||
|
@ -187,7 +187,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameNamespaces, :
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'invalidates the markdown cache of related projects' do
|
it 'invalidates the markdown cache of related projects' do
|
||||||
project = create(:project, namespace: namespace, path: "the-path-project")
|
project = create(:project, :legacy_storage, namespace: namespace, path: "the-path-project")
|
||||||
|
|
||||||
expect(subject).to receive(:remove_cached_html_for_projects).with([project.id])
|
expect(subject).to receive(:remove_cached_html_for_projects).with([project.id])
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameNamespaces, :
|
||||||
|
|
||||||
describe '#revert_renames', :redis do
|
describe '#revert_renames', :redis do
|
||||||
it 'renames the routes back to the previous values' do
|
it 'renames the routes back to the previous values' do
|
||||||
project = create(:project, :repository, path: 'a-project', namespace: namespace)
|
project = create(:project, :legacy_storage, :repository, path: 'a-project', namespace: namespace)
|
||||||
subject.rename_namespace(namespace)
|
subject.rename_namespace(namespace)
|
||||||
|
|
||||||
expect(subject).to receive(:perform_rename)
|
expect(subject).to receive(:perform_rename)
|
||||||
|
@ -261,7 +261,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameNamespaces, :
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'moves the repositories back to their original place' do
|
it 'moves the repositories back to their original place' do
|
||||||
project = create(:project, :repository, path: 'a-project', namespace: namespace)
|
project = create(:project, :repository, :legacy_storage, path: 'a-project', namespace: namespace)
|
||||||
project.create_repository
|
project.create_repository
|
||||||
subject.rename_namespace(namespace)
|
subject.rename_namespace(namespace)
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameProjects, :de
|
||||||
let(:subject) { described_class.new(['the-path'], migration) }
|
let(:subject) { described_class.new(['the-path'], migration) }
|
||||||
let(:project) do
|
let(:project) do
|
||||||
create(:project,
|
create(:project,
|
||||||
|
:legacy_storage,
|
||||||
path: 'the-path',
|
path: 'the-path',
|
||||||
namespace: create(:namespace, path: 'known-parent' ))
|
namespace: create(:namespace, path: 'known-parent' ))
|
||||||
end
|
end
|
||||||
|
@ -17,7 +18,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameProjects, :de
|
||||||
describe '#projects_for_paths' do
|
describe '#projects_for_paths' do
|
||||||
it 'searches using nested paths' do
|
it 'searches using nested paths' do
|
||||||
namespace = create(:namespace, path: 'hello')
|
namespace = create(:namespace, path: 'hello')
|
||||||
project = create(:project, path: 'THE-path', namespace: namespace)
|
project = create(:project, :legacy_storage, path: 'THE-path', namespace: namespace)
|
||||||
|
|
||||||
result_ids = described_class.new(['Hello/the-path'], migration)
|
result_ids = described_class.new(['Hello/the-path'], migration)
|
||||||
.projects_for_paths.map(&:id)
|
.projects_for_paths.map(&:id)
|
||||||
|
@ -26,8 +27,8 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameProjects, :de
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'includes the correct projects' do
|
it 'includes the correct projects' do
|
||||||
project = create(:project, path: 'THE-path')
|
project = create(:project, :legacy_storage, path: 'THE-path')
|
||||||
_other_project = create(:project)
|
_other_project = create(:project, :legacy_storage)
|
||||||
|
|
||||||
result_ids = subject.projects_for_paths.map(&:id)
|
result_ids = subject.projects_for_paths.map(&:id)
|
||||||
|
|
||||||
|
@ -36,7 +37,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameProjects, :de
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#rename_projects' do
|
describe '#rename_projects' do
|
||||||
let!(:projects) { create_list(:project, 2, path: 'the-path') }
|
let!(:projects) { create_list(:project, 2, :legacy_storage, path: 'the-path') }
|
||||||
|
|
||||||
it 'renames each project' do
|
it 'renames each project' do
|
||||||
expect(subject).to receive(:rename_project).twice
|
expect(subject).to receive(:rename_project).twice
|
||||||
|
@ -120,7 +121,7 @@ describe Gitlab::Database::RenameReservedPathsMigration::V1::RenameProjects, :de
|
||||||
|
|
||||||
describe '#move_repository' do
|
describe '#move_repository' do
|
||||||
let(:known_parent) { create(:namespace, path: 'known-parent') }
|
let(:known_parent) { create(:namespace, path: 'known-parent') }
|
||||||
let(:project) { create(:project, :repository, path: 'the-path', namespace: known_parent) }
|
let(:project) { create(:project, :repository, :legacy_storage, path: 'the-path', namespace: known_parent) }
|
||||||
|
|
||||||
it 'moves the repository for a project' do
|
it 'moves the repository for a project' do
|
||||||
expected_path = File.join(TestEnv.repos_path, 'known-parent', 'new-repo.git')
|
expected_path = File.join(TestEnv.repos_path, 'known-parent', 'new-repo.git')
|
||||||
|
|
|
@ -2,7 +2,7 @@ require "spec_helper"
|
||||||
|
|
||||||
describe Gitlab::Email::AttachmentUploader do
|
describe Gitlab::Email::AttachmentUploader do
|
||||||
describe "#execute" do
|
describe "#execute" do
|
||||||
let(:project) { build(:project) }
|
let(:project) { create(:project) }
|
||||||
let(:message_raw) { fixture_file("emails/attachment.eml") }
|
let(:message_raw) { fixture_file("emails/attachment.eml") }
|
||||||
let(:message) { Mail::Message.new(message_raw) }
|
let(:message) { Mail::Message.new(message_raw) }
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,8 @@ describe Gitlab::Gfm::UploadsRewriter do
|
||||||
it 'copies files' do
|
it 'copies files' do
|
||||||
expect(new_files).to all(exist)
|
expect(new_files).to all(exist)
|
||||||
expect(old_paths).not_to match_array new_paths
|
expect(old_paths).not_to match_array new_paths
|
||||||
expect(old_paths).to all(include(old_project.full_path))
|
expect(old_paths).to all(include(old_project.disk_path))
|
||||||
expect(new_paths).to all(include(new_project.full_path))
|
expect(new_paths).to all(include(new_project.disk_path))
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not remove old files' do
|
it 'does not remove old files' do
|
||||||
|
|
|
@ -16,7 +16,7 @@ describe Gitlab::ImportExport::UploadsRestorer do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'legacy storage' do
|
describe 'legacy storage' do
|
||||||
let(:project) { create(:project) }
|
let(:project) { create(:project, :legacy_storage) }
|
||||||
|
|
||||||
subject(:restorer) { described_class.new(project: project, shared: shared) }
|
subject(:restorer) { described_class.new(project: project, shared: shared) }
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ describe Gitlab::ImportExport::UploadsRestorer do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'hashed storage' do
|
describe 'hashed storage' do
|
||||||
let(:project) { create(:project, :hashed) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
subject(:restorer) { described_class.new(project: project, shared: shared) }
|
subject(:restorer) { described_class.new(project: project, shared: shared) }
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ describe Gitlab::ImportExport::UploadsSaver do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'legacy storage' do
|
describe 'legacy storage' do
|
||||||
let(:project) { create(:project) }
|
let(:project) { create(:project, :legacy_storage) }
|
||||||
|
|
||||||
subject(:saver) { described_class.new(shared: shared, project: project) }
|
subject(:saver) { described_class.new(shared: shared, project: project) }
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ describe Gitlab::ImportExport::UploadsSaver do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'hashed storage' do
|
describe 'hashed storage' do
|
||||||
let(:project) { create(:project, :hashed) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
subject(:saver) { described_class.new(shared: shared, project: project) }
|
subject(:saver) { described_class.new(shared: shared, project: project) }
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,11 @@ describe ::Gitlab::RepoPath do
|
||||||
|
|
||||||
context 'a repository storage path' do
|
context 'a repository storage path' do
|
||||||
it 'parses a full repository path' do
|
it 'parses a full repository path' do
|
||||||
expect(described_class.parse(project.repository.path)).to eq([project, false, nil])
|
expect(described_class.parse(project.repository.full_path)).to eq([project, false, nil])
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'parses a full wiki path' do
|
it 'parses a full wiki path' do
|
||||||
expect(described_class.parse(project.wiki.repository.path)).to eq([project, true, nil])
|
expect(described_class.parse(project.wiki.repository.full_path)).to eq([project, true, nil])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -443,7 +443,7 @@ describe Gitlab::Shell do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#remove_repository' do
|
describe '#remove_repository' do
|
||||||
let!(:project) { create(:project, :repository) }
|
let!(:project) { create(:project, :repository, :legacy_storage) }
|
||||||
let(:disk_path) { "#{project.disk_path}.git" }
|
let(:disk_path) { "#{project.disk_path}.git" }
|
||||||
|
|
||||||
it 'returns true when the command succeeds' do
|
it 'returns true when the command succeeds' do
|
||||||
|
|
|
@ -324,7 +324,7 @@ describe Gitlab::Workhorse do
|
||||||
it 'includes a Repository param' do
|
it 'includes a Repository param' do
|
||||||
repo_param = {
|
repo_param = {
|
||||||
storage_name: 'default',
|
storage_name: 'default',
|
||||||
relative_path: project.full_path + '.git',
|
relative_path: project.disk_path + '.git',
|
||||||
gl_repository: "project-#{project.id}"
|
gl_repository: "project-#{project.id}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ require 'spec_helper'
|
||||||
require Rails.root.join('db', 'migrate', '20161124141322_migrate_process_commit_worker_jobs.rb')
|
require Rails.root.join('db', 'migrate', '20161124141322_migrate_process_commit_worker_jobs.rb')
|
||||||
|
|
||||||
describe MigrateProcessCommitWorkerJobs do
|
describe MigrateProcessCommitWorkerJobs do
|
||||||
let(:project) { create(:project, :repository) }
|
let(:project) { create(:project, :legacy_storage, :repository) }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:commit) { project.commit.raw.rugged_commit }
|
let(:commit) { project.commit.raw.rugged_commit }
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ require Rails.root.join('db', 'migrate', '20170503140202_turn_nested_groups_into
|
||||||
describe TurnNestedGroupsIntoRegularGroupsForMysql do
|
describe TurnNestedGroupsIntoRegularGroupsForMysql do
|
||||||
let!(:parent_group) { create(:group) }
|
let!(:parent_group) { create(:group) }
|
||||||
let!(:child_group) { create(:group, parent: parent_group) }
|
let!(:child_group) { create(:group, parent: parent_group) }
|
||||||
let!(:project) { create(:project, :empty_repo, namespace: child_group) }
|
let!(:project) { create(:project, :legacy_storage, :empty_repo, namespace: child_group) }
|
||||||
let!(:member) { create(:user) }
|
let!(:member) { create(:user) }
|
||||||
let(:migration) { described_class.new }
|
let(:migration) { described_class.new }
|
||||||
|
|
||||||
|
|
|
@ -168,84 +168,105 @@ describe Namespace do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#move_dir', :request_store do
|
describe '#move_dir', :request_store do
|
||||||
let(:namespace) { create(:namespace) }
|
shared_examples "namespace restrictions" do
|
||||||
let!(:project) { create(:project_empty_repo, namespace: namespace) }
|
context "when any project has container images" do
|
||||||
|
let(:container_repository) { create(:container_repository) }
|
||||||
|
|
||||||
it "raises error when directory exists" do
|
before do
|
||||||
expect { namespace.move_dir }.to raise_error("namespace directory cannot be moved")
|
stub_container_registry_config(enabled: true)
|
||||||
end
|
stub_container_registry_tags(repository: :any, tags: ['tag'])
|
||||||
|
|
||||||
it "moves dir if path changed" do
|
create(:project, namespace: namespace, container_repositories: [container_repository])
|
||||||
namespace.update_attributes(path: namespace.full_path + '_new')
|
|
||||||
|
|
||||||
expect(gitlab_shell.exists?(project.repository_storage_path, "#{namespace.path}/#{project.path}.git")).to be_truthy
|
allow(namespace).to receive(:path_was).and_return(namespace.path)
|
||||||
end
|
allow(namespace).to receive(:path).and_return('new_path')
|
||||||
|
end
|
||||||
|
|
||||||
context "when any project has container images" do
|
it 'raises an error about not movable project' do
|
||||||
let(:container_repository) { create(:container_repository) }
|
expect { namespace.move_dir }.to raise_error(/Namespace cannot be moved/)
|
||||||
|
|
||||||
before do
|
|
||||||
stub_container_registry_config(enabled: true)
|
|
||||||
stub_container_registry_tags(repository: :any, tags: ['tag'])
|
|
||||||
|
|
||||||
create(:project, namespace: namespace, container_repositories: [container_repository])
|
|
||||||
|
|
||||||
allow(namespace).to receive(:path_was).and_return(namespace.path)
|
|
||||||
allow(namespace).to receive(:path).and_return('new_path')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'raises an error about not movable project' do
|
|
||||||
expect { namespace.move_dir }.to raise_error(/Namespace cannot be moved/)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'with subgroups' do
|
|
||||||
let(:parent) { create(:group, name: 'parent', path: 'parent') }
|
|
||||||
let(:child) { create(:group, name: 'child', path: 'child', parent: parent) }
|
|
||||||
let!(:project) { create(:project_empty_repo, path: 'the-project', namespace: child, skip_disk_validation: true) }
|
|
||||||
let(:uploads_dir) { FileUploader.root }
|
|
||||||
let(:pages_dir) { File.join(TestEnv.pages_path) }
|
|
||||||
|
|
||||||
before do
|
|
||||||
FileUtils.mkdir_p(File.join(uploads_dir, 'parent', 'child', 'the-project'))
|
|
||||||
FileUtils.mkdir_p(File.join(pages_dir, 'parent', 'child', 'the-project'))
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'renaming child' do
|
|
||||||
it 'correctly moves the repository, uploads and pages' do
|
|
||||||
expected_repository_path = File.join(TestEnv.repos_path, 'parent', 'renamed', 'the-project.git')
|
|
||||||
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(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
|
||||||
|
|
||||||
context 'renaming parent' do
|
context 'legacy storage' do
|
||||||
it 'correctly moves the repository, uploads and pages' do
|
let(:namespace) { create(:namespace) }
|
||||||
expected_repository_path = File.join(TestEnv.repos_path, 'renamed', 'child', 'the-project.git')
|
let!(:project) { create(:project_empty_repo, :legacy_storage, namespace: namespace) }
|
||||||
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')
|
it_behaves_like 'namespace restrictions'
|
||||||
|
|
||||||
expect(File.directory?(expected_repository_path)).to be(true)
|
it "raises error when directory exists" do
|
||||||
expect(File.directory?(expected_upload_path)).to be(true)
|
expect { namespace.move_dir }.to raise_error("namespace directory cannot be moved")
|
||||||
expect(File.directory?(expected_pages_path)).to be(true)
|
end
|
||||||
|
|
||||||
|
it "moves dir if path changed" do
|
||||||
|
namespace.update_attributes(path: namespace.full_path + '_new')
|
||||||
|
|
||||||
|
expect(gitlab_shell.exists?(project.repository_storage_path, "#{namespace.path}/#{project.path}.git")).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with subgroups' do
|
||||||
|
let(:parent) { create(:group, name: 'parent', path: '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(:uploads_dir) { FileUploader.root }
|
||||||
|
let(:pages_dir) { File.join(TestEnv.pages_path) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
FileUtils.mkdir_p(File.join(uploads_dir, project.full_path))
|
||||||
|
FileUtils.mkdir_p(File.join(pages_dir, project.full_path))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'renaming child' do
|
||||||
|
it 'correctly moves the repository, uploads and pages' do
|
||||||
|
expected_repository_path = File.join(TestEnv.repos_path, 'parent', 'renamed', 'the-project.git')
|
||||||
|
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(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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
context 'hashed storage' do
|
||||||
|
let(:namespace) { create(:namespace) }
|
||||||
|
let!(:project) { create(:project_empty_repo, namespace: namespace) }
|
||||||
|
|
||||||
|
it_behaves_like 'namespace restrictions'
|
||||||
|
|
||||||
|
it "repository directory remains unchanged if path changed" do
|
||||||
|
before_disk_path = project.disk_path
|
||||||
|
namespace.update_attributes(path: namespace.full_path + '_new')
|
||||||
|
|
||||||
|
expect(before_disk_path).to eq(project.disk_path)
|
||||||
|
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_truthy
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'updates project full path in .git/config for each project inside namespace' do
|
it 'updates project full path in .git/config for each project inside namespace' do
|
||||||
parent = create(:group, name: 'mygroup', path: 'mygroup')
|
parent = create(:group, name: 'mygroup', path: 'mygroup')
|
||||||
subgroup = create(:group, name: 'mysubgroup', path: 'mysubgroup', parent: parent)
|
subgroup = create(:group, name: 'mysubgroup', path: 'mysubgroup', parent: parent)
|
||||||
project_in_parent_group = create(:project, :repository, namespace: parent, name: 'foo1')
|
project_in_parent_group = create(:project, :legacy_storage, :repository, namespace: parent, name: 'foo1')
|
||||||
hashed_project_in_subgroup = create(:project, :repository, :hashed, namespace: subgroup, name: 'foo2')
|
hashed_project_in_subgroup = create(:project, :repository, namespace: subgroup, name: 'foo2')
|
||||||
legacy_project_in_subgroup = create(:project, :repository, namespace: subgroup, name: 'foo3')
|
legacy_project_in_subgroup = create(:project, :legacy_storage, :repository, namespace: subgroup, name: 'foo3')
|
||||||
|
|
||||||
parent.update(path: 'mygroup_new')
|
parent.update(path: 'mygroup_new')
|
||||||
|
|
||||||
|
@ -260,38 +281,18 @@ describe Namespace do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#rm_dir', 'callback' do
|
describe '#rm_dir', 'callback' do
|
||||||
let!(:project) { create(:project_empty_repo, namespace: namespace) }
|
|
||||||
let(:repository_storage_path) { Gitlab.config.repositories.storages.default['path'] }
|
let(:repository_storage_path) { Gitlab.config.repositories.storages.default['path'] }
|
||||||
let(:path_in_dir) { File.join(repository_storage_path, namespace.full_path) }
|
let(:path_in_dir) { File.join(repository_storage_path, namespace.full_path) }
|
||||||
let(:deleted_path) { namespace.full_path.gsub(namespace.path, "#{namespace.full_path}+#{namespace.id}+deleted") }
|
let(:deleted_path) { namespace.full_path.gsub(namespace.path, "#{namespace.full_path}+#{namespace.id}+deleted") }
|
||||||
let(:deleted_path_in_dir) { File.join(repository_storage_path, deleted_path) }
|
let(:deleted_path_in_dir) { File.join(repository_storage_path, deleted_path) }
|
||||||
|
|
||||||
it 'renames its dirs when deleted' do
|
context 'legacy storage' do
|
||||||
allow(GitlabShellWorker).to receive(:perform_in)
|
let!(:project) { create(:project_empty_repo, :legacy_storage, namespace: namespace) }
|
||||||
|
|
||||||
namespace.destroy
|
|
||||||
|
|
||||||
expect(File.exist?(deleted_path_in_dir)).to be(true)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'schedules the namespace for deletion' do
|
|
||||||
expect(GitlabShellWorker).to receive(:perform_in).with(5.minutes, :rm_namespace, repository_storage_path, deleted_path)
|
|
||||||
|
|
||||||
namespace.destroy
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'in sub-groups' do
|
|
||||||
let(:parent) { create(:group, path: 'parent') }
|
|
||||||
let(:child) { create(:group, parent: parent, path: 'child') }
|
|
||||||
let!(:project) { create(:project_empty_repo, namespace: child) }
|
|
||||||
let(:path_in_dir) { File.join(repository_storage_path, 'parent', 'child') }
|
|
||||||
let(:deleted_path) { File.join('parent', "child+#{child.id}+deleted") }
|
|
||||||
let(:deleted_path_in_dir) { File.join(repository_storage_path, deleted_path) }
|
|
||||||
|
|
||||||
it 'renames its dirs when deleted' do
|
it 'renames its dirs when deleted' do
|
||||||
allow(GitlabShellWorker).to receive(:perform_in)
|
allow(GitlabShellWorker).to receive(:perform_in)
|
||||||
|
|
||||||
child.destroy
|
namespace.destroy
|
||||||
|
|
||||||
expect(File.exist?(deleted_path_in_dir)).to be(true)
|
expect(File.exist?(deleted_path_in_dir)).to be(true)
|
||||||
end
|
end
|
||||||
|
@ -299,14 +300,57 @@ describe Namespace do
|
||||||
it 'schedules the namespace for deletion' do
|
it 'schedules the namespace for deletion' do
|
||||||
expect(GitlabShellWorker).to receive(:perform_in).with(5.minutes, :rm_namespace, repository_storage_path, deleted_path)
|
expect(GitlabShellWorker).to receive(:perform_in).with(5.minutes, :rm_namespace, repository_storage_path, deleted_path)
|
||||||
|
|
||||||
child.destroy
|
namespace.destroy
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'in sub-groups' do
|
||||||
|
let(:parent) { create(:group, path: 'parent') }
|
||||||
|
let(:child) { create(:group, parent: parent, path: 'child') }
|
||||||
|
let!(:project) { create(:project_empty_repo, :legacy_storage, namespace: child) }
|
||||||
|
let(:path_in_dir) { File.join(repository_storage_path, 'parent', 'child') }
|
||||||
|
let(:deleted_path) { File.join('parent', "child+#{child.id}+deleted") }
|
||||||
|
let(:deleted_path_in_dir) { File.join(repository_storage_path, deleted_path) }
|
||||||
|
|
||||||
|
it 'renames its dirs when deleted' do
|
||||||
|
allow(GitlabShellWorker).to receive(:perform_in)
|
||||||
|
|
||||||
|
child.destroy
|
||||||
|
|
||||||
|
expect(File.exist?(deleted_path_in_dir)).to be(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'schedules the namespace for deletion' do
|
||||||
|
expect(GitlabShellWorker).to receive(:perform_in).with(5.minutes, :rm_namespace, repository_storage_path, deleted_path)
|
||||||
|
|
||||||
|
child.destroy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'removes the exports folder' do
|
||||||
|
expect(namespace).to receive(:remove_exports!)
|
||||||
|
|
||||||
|
namespace.destroy
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'removes the exports folder' do
|
context 'hashed storage' do
|
||||||
expect(namespace).to receive(:remove_exports!)
|
let!(:project) { create(:project_empty_repo, namespace: namespace) }
|
||||||
|
|
||||||
namespace.destroy
|
it 'has no repositories base directories to remove' do
|
||||||
|
allow(GitlabShellWorker).to receive(:perform_in)
|
||||||
|
|
||||||
|
expect(File.exist?(path_in_dir)).to be(false)
|
||||||
|
|
||||||
|
namespace.destroy
|
||||||
|
|
||||||
|
expect(File.exist?(deleted_path_in_dir)).to be(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'removes the exports folder' do
|
||||||
|
expect(namespace).to receive(:remove_exports!)
|
||||||
|
|
||||||
|
namespace.destroy
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -567,8 +611,8 @@ describe Namespace do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#remove_exports' do
|
describe '#remove_exports' do
|
||||||
let(:legacy_project) { create(:project, :with_export, namespace: namespace) }
|
let(:legacy_project) { create(:project, :with_export, :legacy_storage, namespace: namespace) }
|
||||||
let(:hashed_project) { create(:project, :with_export, :hashed, namespace: namespace) }
|
let(:hashed_project) { create(:project, :with_export, namespace: namespace) }
|
||||||
let(:export_path) { Dir.mktmpdir('namespace_remove_exports_spec') }
|
let(:export_path) { Dir.mktmpdir('namespace_remove_exports_spec') }
|
||||||
let(:legacy_export) { legacy_project.export_project_path }
|
let(:legacy_export) { legacy_project.export_project_path }
|
||||||
let(:hashed_export) { hashed_project.export_project_path }
|
let(:hashed_export) { hashed_project.export_project_path }
|
||||||
|
|
|
@ -2504,6 +2504,7 @@ describe Project do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#remove_exports' do
|
describe '#remove_exports' do
|
||||||
|
let(:legacy_project) { create(:project, :legacy_storage, :with_export) }
|
||||||
let(:project) { create(:project, :with_export) }
|
let(:project) { create(:project, :with_export) }
|
||||||
|
|
||||||
it 'removes the exports directory for the project' do
|
it 'removes the exports directory for the project' do
|
||||||
|
@ -2516,17 +2517,31 @@ describe Project do
|
||||||
expect(File.exist?(project.export_path)).to be_falsy
|
expect(File.exist?(project.export_path)).to be_falsy
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'is a no-op when there is no namespace' do
|
it 'is a no-op on legacy projects when there is no namespace' do
|
||||||
export_path = project.export_path
|
export_path = legacy_project.export_path
|
||||||
project.update_column(:namespace_id, nil)
|
|
||||||
|
legacy_project.update_column(:namespace_id, nil)
|
||||||
|
|
||||||
expect(FileUtils).not_to receive(:rm_rf).with(export_path)
|
expect(FileUtils).not_to receive(:rm_rf).with(export_path)
|
||||||
|
|
||||||
project.remove_exports
|
legacy_project.remove_exports
|
||||||
|
|
||||||
expect(File.exist?(export_path)).to be_truthy
|
expect(File.exist?(export_path)).to be_truthy
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'runs on hashed storage projects when there is no namespace' do
|
||||||
|
export_path = project.export_path
|
||||||
|
|
||||||
|
project.update_column(:namespace_id, nil)
|
||||||
|
|
||||||
|
allow(FileUtils).to receive(:rm_rf).and_call_original
|
||||||
|
expect(FileUtils).to receive(:rm_rf).with(export_path).and_call_original
|
||||||
|
|
||||||
|
project.remove_exports
|
||||||
|
|
||||||
|
expect(File.exist?(export_path)).to be_falsy
|
||||||
|
end
|
||||||
|
|
||||||
it 'is run when the project is destroyed' do
|
it 'is run when the project is destroyed' do
|
||||||
expect(project).to receive(:remove_exports).and_call_original
|
expect(project).to receive(:remove_exports).and_call_original
|
||||||
|
|
||||||
|
@ -2545,7 +2560,7 @@ describe Project do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'legacy storage' do
|
context 'legacy storage' do
|
||||||
let(:project) { create(:project, :repository) }
|
let(:project) { create(:project, :repository, :legacy_storage) }
|
||||||
let(:gitlab_shell) { Gitlab::Shell.new }
|
let(:gitlab_shell) { Gitlab::Shell.new }
|
||||||
let(:project_storage) { project.send(:storage) }
|
let(:project_storage) { project.send(:storage) }
|
||||||
|
|
||||||
|
@ -2719,6 +2734,8 @@ describe Project do
|
||||||
let(:project) { create(:project, :repository, skip_disk_validation: true) }
|
let(:project) { create(:project, :repository, skip_disk_validation: true) }
|
||||||
let(:gitlab_shell) { Gitlab::Shell.new }
|
let(:gitlab_shell) { Gitlab::Shell.new }
|
||||||
let(:hash) { Digest::SHA2.hexdigest(project.id.to_s) }
|
let(:hash) { Digest::SHA2.hexdigest(project.id.to_s) }
|
||||||
|
let(:hashed_prefix) { File.join('@hashed', hash[0..1], hash[2..3]) }
|
||||||
|
let(:hashed_path) { File.join(hashed_prefix, hash) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
stub_application_setting(hashed_storage_enabled: true)
|
stub_application_setting(hashed_storage_enabled: true)
|
||||||
|
@ -2744,14 +2761,12 @@ describe Project do
|
||||||
|
|
||||||
describe '#base_dir' do
|
describe '#base_dir' do
|
||||||
it 'returns base_dir based on hash of project id' do
|
it 'returns base_dir based on hash of project id' do
|
||||||
expect(project.base_dir).to eq("@hashed/#{hash[0..1]}/#{hash[2..3]}")
|
expect(project.base_dir).to eq(hashed_prefix)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#disk_path' do
|
describe '#disk_path' do
|
||||||
it 'returns disk_path based on hash of project id' do
|
it 'returns disk_path based on hash of project id' do
|
||||||
hashed_path = "@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}"
|
|
||||||
|
|
||||||
expect(project.disk_path).to eq(hashed_path)
|
expect(project.disk_path).to eq(hashed_path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -2760,7 +2775,7 @@ describe Project do
|
||||||
it 'delegates to gitlab_shell to ensure namespace is created' do
|
it 'delegates to gitlab_shell to ensure namespace is created' do
|
||||||
allow(project).to receive(:gitlab_shell).and_return(gitlab_shell)
|
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]}")
|
expect(gitlab_shell).to receive(:add_namespace).with(project.repository_storage_path, hashed_prefix)
|
||||||
|
|
||||||
project.ensure_storage_path_exists
|
project.ensure_storage_path_exists
|
||||||
end
|
end
|
||||||
|
|
|
@ -366,20 +366,9 @@ describe API::Internal do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'project as /namespace/project' do
|
|
||||||
it do
|
|
||||||
push(key, project_with_repo_path('/' + project.full_path))
|
|
||||||
|
|
||||||
expect(response).to have_gitlab_http_status(200)
|
|
||||||
expect(json_response["status"]).to be_truthy
|
|
||||||
expect(json_response["repository_path"]).to eq(project.repository.path_to_repo)
|
|
||||||
expect(json_response["gl_repository"]).to eq("project-#{project.id}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'project as namespace/project' do
|
context 'project as namespace/project' do
|
||||||
it do
|
it do
|
||||||
push(key, project_with_repo_path(project.full_path))
|
push(key, project)
|
||||||
|
|
||||||
expect(response).to have_gitlab_http_status(200)
|
expect(response).to have_gitlab_http_status(200)
|
||||||
expect(json_response["status"]).to be_truthy
|
expect(json_response["status"]).to be_truthy
|
||||||
|
@ -496,8 +485,10 @@ describe API::Internal do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'project does not exist' do
|
context 'project does not exist' do
|
||||||
it do
|
it 'returns a 200 response with status: false' do
|
||||||
pull(key, project_with_repo_path('gitlab/notexist'))
|
project.destroy
|
||||||
|
|
||||||
|
pull(key, project)
|
||||||
|
|
||||||
expect(response).to have_gitlab_http_status(200)
|
expect(response).to have_gitlab_http_status(200)
|
||||||
expect(json_response["status"]).to be_falsey
|
expect(json_response["status"]).to be_falsey
|
||||||
|
@ -569,6 +560,7 @@ describe API::Internal do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'the project path was changed' do
|
context 'the project path was changed' do
|
||||||
|
let(:project) { create(:project, :repository, :legacy_storage) }
|
||||||
let!(:old_path_to_repo) { project.repository.path_to_repo }
|
let!(:old_path_to_repo) { project.repository.path_to_repo }
|
||||||
let!(:repository) { project.repository }
|
let!(:repository) { project.repository }
|
||||||
|
|
||||||
|
@ -858,9 +850,14 @@ describe API::Internal do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def project_with_repo_path(path)
|
def gl_repository_for(project_or_wiki)
|
||||||
double().tap do |fake_project|
|
case project_or_wiki
|
||||||
allow(fake_project).to receive_message_chain('repository.path_to_repo' => path)
|
when ProjectWiki
|
||||||
|
project_or_wiki.project.gl_repository(is_wiki: true)
|
||||||
|
when Project
|
||||||
|
project_or_wiki.gl_repository(is_wiki: false)
|
||||||
|
else
|
||||||
|
nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -868,18 +865,8 @@ describe API::Internal do
|
||||||
post(
|
post(
|
||||||
api("/internal/allowed"),
|
api("/internal/allowed"),
|
||||||
key_id: key.id,
|
key_id: key.id,
|
||||||
project: project.repository.path_to_repo,
|
project: project.full_path,
|
||||||
action: 'git-upload-pack',
|
gl_repository: gl_repository_for(project),
|
||||||
secret_token: secret_token,
|
|
||||||
protocol: protocol
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def pull_with_path(key, path_to_repo, protocol = 'ssh')
|
|
||||||
post(
|
|
||||||
api("/internal/allowed"),
|
|
||||||
key_id: key.id,
|
|
||||||
project: path_to_repo,
|
|
||||||
action: 'git-upload-pack',
|
action: 'git-upload-pack',
|
||||||
secret_token: secret_token,
|
secret_token: secret_token,
|
||||||
protocol: protocol
|
protocol: protocol
|
||||||
|
@ -891,20 +878,8 @@ describe API::Internal do
|
||||||
api("/internal/allowed"),
|
api("/internal/allowed"),
|
||||||
changes: 'd14d6c0abdd253381df51a723d58691b2ee1ab08 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/master',
|
changes: 'd14d6c0abdd253381df51a723d58691b2ee1ab08 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/master',
|
||||||
key_id: key.id,
|
key_id: key.id,
|
||||||
project: project.repository.path_to_repo,
|
project: project.full_path,
|
||||||
action: 'git-receive-pack',
|
gl_repository: gl_repository_for(project),
|
||||||
secret_token: secret_token,
|
|
||||||
protocol: protocol,
|
|
||||||
env: env
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def push_with_path(key, path_to_repo, protocol = 'ssh', env: nil)
|
|
||||||
post(
|
|
||||||
api("/internal/allowed"),
|
|
||||||
changes: 'd14d6c0abdd253381df51a723d58691b2ee1ab08 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/master',
|
|
||||||
key_id: key.id,
|
|
||||||
project: path_to_repo,
|
|
||||||
action: 'git-receive-pack',
|
action: 'git-receive-pack',
|
||||||
secret_token: secret_token,
|
secret_token: secret_token,
|
||||||
protocol: protocol,
|
protocol: protocol,
|
||||||
|
@ -917,7 +892,8 @@ describe API::Internal do
|
||||||
api("/internal/allowed"),
|
api("/internal/allowed"),
|
||||||
ref: 'master',
|
ref: 'master',
|
||||||
key_id: key.id,
|
key_id: key.id,
|
||||||
project: project.repository.path_to_repo,
|
project: project.full_path,
|
||||||
|
gl_repository: gl_repository_for(project),
|
||||||
action: 'git-upload-archive',
|
action: 'git-upload-archive',
|
||||||
secret_token: secret_token,
|
secret_token: secret_token,
|
||||||
protocol: 'ssh'
|
protocol: 'ssh'
|
||||||
|
@ -929,7 +905,7 @@ describe API::Internal do
|
||||||
api("/internal/lfs_authenticate"),
|
api("/internal/lfs_authenticate"),
|
||||||
key_id: key_id,
|
key_id: key_id,
|
||||||
secret_token: secret_token,
|
secret_token: secret_token,
|
||||||
project: project.repository.path_to_repo
|
project: project.full_path
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -460,7 +460,7 @@ describe API::Projects do
|
||||||
expect(response).to have_gitlab_http_status(201)
|
expect(response).to have_gitlab_http_status(201)
|
||||||
|
|
||||||
project.each_pair do |k, v|
|
project.each_pair do |k, v|
|
||||||
next if %i[has_external_issue_tracker issues_enabled merge_requests_enabled wiki_enabled].include?(k)
|
next if %i[has_external_issue_tracker issues_enabled merge_requests_enabled wiki_enabled storage_version].include?(k)
|
||||||
|
|
||||||
expect(json_response[k.to_s]).to eq(v)
|
expect(json_response[k.to_s]).to eq(v)
|
||||||
end
|
end
|
||||||
|
@ -622,12 +622,8 @@ describe API::Projects do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'POST /projects/user/:id' do
|
describe 'POST /projects/user/:id' do
|
||||||
before do
|
|
||||||
expect(project).to be_persisted
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'creates new project without path but with name and return 201' do
|
it 'creates new project without path but with name and return 201' do
|
||||||
expect { post api("/projects/user/#{user.id}", admin), name: 'Foo Project' }.to change {Project.count}.by(1)
|
expect { post api("/projects/user/#{user.id}", admin), name: 'Foo Project' }.to change { Project.count }.by(1)
|
||||||
expect(response).to have_gitlab_http_status(201)
|
expect(response).to have_gitlab_http_status(201)
|
||||||
|
|
||||||
project = Project.last
|
project = Project.last
|
||||||
|
@ -666,8 +662,9 @@ describe API::Projects do
|
||||||
post api("/projects/user/#{user.id}", admin), project
|
post api("/projects/user/#{user.id}", admin), project
|
||||||
|
|
||||||
expect(response).to have_gitlab_http_status(201)
|
expect(response).to have_gitlab_http_status(201)
|
||||||
|
|
||||||
project.each_pair do |k, v|
|
project.each_pair do |k, v|
|
||||||
next if %i[has_external_issue_tracker path].include?(k)
|
next if %i[has_external_issue_tracker path storage_version].include?(k)
|
||||||
|
|
||||||
expect(json_response[k.to_s]).to eq(v)
|
expect(json_response[k.to_s]).to eq(v)
|
||||||
end
|
end
|
||||||
|
|
|
@ -401,7 +401,7 @@ describe API::V3::Projects do
|
||||||
post v3_api('/projects', user), project
|
post v3_api('/projects', user), project
|
||||||
|
|
||||||
project.each_pair do |k, v|
|
project.each_pair do |k, v|
|
||||||
next if %i[has_external_issue_tracker issues_enabled merge_requests_enabled wiki_enabled].include?(k)
|
next if %i[storage_version has_external_issue_tracker issues_enabled merge_requests_enabled wiki_enabled].include?(k)
|
||||||
|
|
||||||
expect(json_response[k.to_s]).to eq(v)
|
expect(json_response[k.to_s]).to eq(v)
|
||||||
end
|
end
|
||||||
|
@ -545,7 +545,7 @@ describe API::V3::Projects do
|
||||||
|
|
||||||
expect(response).to have_gitlab_http_status(201)
|
expect(response).to have_gitlab_http_status(201)
|
||||||
project.each_pair do |k, v|
|
project.each_pair do |k, v|
|
||||||
next if %i[has_external_issue_tracker path].include?(k)
|
next if %i[storage_version has_external_issue_tracker path].include?(k)
|
||||||
|
|
||||||
expect(json_response[k.to_s]).to eq(v)
|
expect(json_response[k.to_s]).to eq(v)
|
||||||
end
|
end
|
||||||
|
|
|
@ -163,7 +163,7 @@ describe 'Git HTTP requests' do
|
||||||
download(path) do |response|
|
download(path) do |response|
|
||||||
json_body = ActiveSupport::JSON.decode(response.body)
|
json_body = ActiveSupport::JSON.decode(response.body)
|
||||||
|
|
||||||
expect(json_body['RepoPath']).to include(wiki.repository.full_path)
|
expect(json_body['RepoPath']).to include(wiki.repository.disk_path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,7 @@ describe Groups::DestroyService do
|
||||||
let!(:user) { create(:user) }
|
let!(:user) { create(:user) }
|
||||||
let!(:group) { create(:group) }
|
let!(:group) { create(:group) }
|
||||||
let!(:nested_group) { create(:group, parent: group) }
|
let!(:nested_group) { create(:group, parent: group) }
|
||||||
let!(:project) { create(:project, namespace: group) }
|
let!(:project) { create(:project, :legacy_storage, namespace: group) }
|
||||||
let!(:notification_setting) { create(:notification_setting, source: group)}
|
let!(:notification_setting) { create(:notification_setting, source: group)}
|
||||||
let(:gitlab_shell) { Gitlab::Shell.new }
|
let(:gitlab_shell) { Gitlab::Shell.new }
|
||||||
let(:remove_path) { group.path + "+#{group.id}+deleted" }
|
let(:remove_path) { group.path + "+#{group.id}+deleted" }
|
||||||
|
@ -141,7 +141,7 @@ describe Groups::DestroyService do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'legacy storage' do
|
context 'legacy storage' do
|
||||||
let!(:project) { create(:project, :empty_repo, namespace: group) }
|
let!(:project) { create(:project, :legacy_storage, :empty_repo, namespace: group) }
|
||||||
|
|
||||||
it 'removes repository' do
|
it 'removes repository' do
|
||||||
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_falsey
|
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_falsey
|
||||||
|
@ -149,7 +149,7 @@ describe Groups::DestroyService do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'hashed storage' do
|
context 'hashed storage' do
|
||||||
let!(:project) { create(:project, :hashed, :empty_repo, namespace: group) }
|
let!(:project) { create(:project, :empty_repo, namespace: group) }
|
||||||
|
|
||||||
it 'removes repository' do
|
it 'removes repository' do
|
||||||
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_falsey
|
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_falsey
|
||||||
|
|
|
@ -2,7 +2,7 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe Projects::HashedStorage::MigrateAttachmentsService do
|
describe Projects::HashedStorage::MigrateAttachmentsService do
|
||||||
subject(:service) { described_class.new(project) }
|
subject(:service) { described_class.new(project) }
|
||||||
let(:project) { create(:project) }
|
let(:project) { create(:project, :legacy_storage) }
|
||||||
let(:legacy_storage) { Storage::LegacyProject.new(project) }
|
let(:legacy_storage) { Storage::LegacyProject.new(project) }
|
||||||
let(:hashed_storage) { Storage::HashedProject.new(project) }
|
let(:hashed_storage) { Storage::HashedProject.new(project) }
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe Projects::HashedStorage::MigrateRepositoryService do
|
describe Projects::HashedStorage::MigrateRepositoryService do
|
||||||
let(:gitlab_shell) { Gitlab::Shell.new }
|
let(:gitlab_shell) { Gitlab::Shell.new }
|
||||||
let(:project) { create(:project, :repository, :wiki_repo) }
|
let(:project) { create(:project, :legacy_storage, :repository, :wiki_repo) }
|
||||||
let(:service) { described_class.new(project) }
|
let(:service) { described_class.new(project) }
|
||||||
let(:legacy_storage) { Storage::LegacyProject.new(project) }
|
let(:legacy_storage) { Storage::LegacyProject.new(project) }
|
||||||
let(:hashed_storage) { Storage::HashedProject.new(project) }
|
let(:hashed_storage) { Storage::HashedProject.new(project) }
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Projects::HashedStorageMigrationService do
|
describe Projects::HashedStorageMigrationService do
|
||||||
let(:project) { create(:project, :empty_repo, :wiki_repo) }
|
let(:project) { create(:project, :empty_repo, :wiki_repo, :legacy_storage) }
|
||||||
subject(:service) { described_class.new(project) }
|
subject(:service) { described_class.new(project) }
|
||||||
|
|
||||||
describe '#execute' do
|
describe '#execute' do
|
||||||
|
|
|
@ -4,7 +4,7 @@ describe Projects::TransferService do
|
||||||
let(:gitlab_shell) { Gitlab::Shell.new }
|
let(:gitlab_shell) { Gitlab::Shell.new }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:group) { create(:group) }
|
let(:group) { create(:group) }
|
||||||
let(:project) { create(:project, :repository, namespace: user.namespace) }
|
let(:project) { create(:project, :repository, :legacy_storage, namespace: user.namespace) }
|
||||||
|
|
||||||
context 'namespace -> namespace' do
|
context 'namespace -> namespace' do
|
||||||
before do
|
before do
|
||||||
|
@ -214,7 +214,7 @@ describe Projects::TransferService do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when hashed storage in use' do
|
context 'when hashed storage in use' do
|
||||||
let(:hashed_project) { create(:project, :repository, :hashed, namespace: user.namespace) }
|
let(:hashed_project) { create(:project, :repository, namespace: user.namespace) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
group.add_owner(user)
|
group.add_owner(user)
|
||||||
|
|
|
@ -150,6 +150,8 @@ describe Projects::UpdateService do
|
||||||
let(:repository_storage_path) { Gitlab.config.repositories.storages[repository_storage]['path'] }
|
let(:repository_storage_path) { Gitlab.config.repositories.storages[repository_storage]['path'] }
|
||||||
|
|
||||||
context 'with legacy storage' do
|
context 'with legacy storage' do
|
||||||
|
let(:project) { create(:project, :legacy_storage, :repository, creator: user, namespace: user.namespace) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
gitlab_shell.add_repository(repository_storage, "#{user.namespace.full_path}/existing")
|
gitlab_shell.add_repository(repository_storage, "#{user.namespace.full_path}/existing")
|
||||||
end
|
end
|
||||||
|
|
|
@ -173,7 +173,7 @@ describe Users::DestroyService do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'legacy storage' do
|
context 'legacy storage' do
|
||||||
let!(:project) { create(:project, :empty_repo, namespace: user.namespace) }
|
let!(:project) { create(:project, :empty_repo, :legacy_storage, namespace: user.namespace) }
|
||||||
|
|
||||||
it 'removes repository' do
|
it 'removes repository' do
|
||||||
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_falsey
|
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_falsey
|
||||||
|
@ -181,7 +181,7 @@ describe Users::DestroyService do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'hashed storage' do
|
context 'hashed storage' do
|
||||||
let!(:project) { create(:project, :empty_repo, :hashed, namespace: user.namespace) }
|
let!(:project) { create(:project, :empty_repo, namespace: user.namespace) }
|
||||||
|
|
||||||
it 'removes repository' do
|
it 'removes repository' do
|
||||||
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_falsey
|
expect(gitlab_shell.exists?(project.repository_storage_path, "#{project.disk_path}.git")).to be_falsey
|
||||||
|
|
|
@ -2,7 +2,7 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe FileUploader do
|
describe FileUploader do
|
||||||
let(:group) { create(:group, name: 'awesome') }
|
let(:group) { create(:group, name: 'awesome') }
|
||||||
let(:project) { create(:project, namespace: group, name: 'project') }
|
let(:project) { create(:project, :legacy_storage, namespace: group, name: 'project') }
|
||||||
let(:uploader) { described_class.new(project) }
|
let(:uploader) { described_class.new(project) }
|
||||||
let(:upload) { double(model: project, path: 'secret/foo.jpg') }
|
let(:upload) { double(model: project, path: 'secret/foo.jpg') }
|
||||||
|
|
||||||
|
@ -16,12 +16,12 @@ describe FileUploader do
|
||||||
|
|
||||||
shared_examples 'uses hashed storage' do
|
shared_examples 'uses hashed storage' do
|
||||||
context 'when rolled out attachments' do
|
context 'when rolled out attachments' do
|
||||||
|
let(:project) { build_stubbed(:project, namespace: group, name: 'project') }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
allow(project).to receive(:disk_path).and_return('ca/fe/fe/ed')
|
allow(project).to receive(:disk_path).and_return('ca/fe/fe/ed')
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:project) { build_stubbed(:project, :hashed, namespace: group, name: 'project') }
|
|
||||||
|
|
||||||
it_behaves_like 'builds correct paths',
|
it_behaves_like 'builds correct paths',
|
||||||
store_dir: %r{ca/fe/fe/ed/\h+},
|
store_dir: %r{ca/fe/fe/ed/\h+},
|
||||||
absolute_path: %r{#{described_class.root}/ca/fe/fe/ed/secret/foo.jpg}
|
absolute_path: %r{#{described_class.root}/ca/fe/fe/ed/secret/foo.jpg}
|
||||||
|
|
|
@ -68,7 +68,7 @@ describe RepositoryForkWorker do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "handles bad fork" do
|
it "handles bad fork" do
|
||||||
error_message = "Unable to fork project #{fork_project.id} for repository #{project.full_path} -> #{fork_project.full_path}"
|
error_message = "Unable to fork project #{fork_project.id} for repository #{project.disk_path} -> #{fork_project.disk_path}"
|
||||||
|
|
||||||
expect_fork_repository.and_return(false)
|
expect_fork_repository.and_return(false)
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe StorageMigratorWorker do
|
describe StorageMigratorWorker do
|
||||||
subject(:worker) { described_class.new }
|
subject(:worker) { described_class.new }
|
||||||
let(:projects) { create_list(:project, 2) }
|
let(:projects) { create_list(:project, 2, :legacy_storage) }
|
||||||
|
|
||||||
describe '#perform' do
|
describe '#perform' do
|
||||||
let(:ids) { projects.map(&:id) }
|
let(:ids) { projects.map(&:id) }
|
||||||
|
|
Loading…
Reference in New Issue