Commit 1b3d3066 authored by Igor Drozdov's avatar Igor Drozdov

Merge branch 'fj-fix-import-from-different-types-exports' into 'master'

Snippet repository import fail with older export files

See merge request gitlab-org/gitlab!33584
parents 599d3f31 dd916a52
---
title: Fix snippet repository import fail with older export files
merge_request: 33584
author:
type: fixed
...@@ -10,8 +10,6 @@ module Gitlab ...@@ -10,8 +10,6 @@ module Gitlab
end end
def restore def restore
return true unless Dir.exist?(snippets_repo_bundle_path)
@project.snippets.find_each.all? do |snippet| @project.snippets.find_each.all? do |snippet|
Gitlab::ImportExport::SnippetRepoRestorer.new(snippet: snippet, Gitlab::ImportExport::SnippetRepoRestorer.new(snippet: snippet,
user: @user, user: @user,
......
...@@ -8,42 +8,90 @@ describe Gitlab::ImportExport::SnippetsRepoRestorer do ...@@ -8,42 +8,90 @@ describe Gitlab::ImportExport::SnippetsRepoRestorer do
describe 'bundle a snippet Git repo' do describe 'bundle a snippet Git repo' do
let_it_be(:user) { create(:user) } let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, namespace: user.namespace) } let_it_be(:project) { create(:project, namespace: user.namespace) }
let_it_be(:snippet_with_repo) { create(:project_snippet, :repository, project: project, author: user) }
let_it_be(:snippet_without_repo) { create(:project_snippet, project: project, author: user) }
let!(:snippet1) { create(:project_snippet, project: project, author: user) }
let!(:snippet2) { create(:project_snippet, project: project, author: user) }
let(:shared) { project.import_export_shared } let(:shared) { project.import_export_shared }
let(:exporter) { Gitlab::ImportExport::SnippetsRepoSaver.new(current_user: user, project: project, shared: shared) } let(:exporter) { Gitlab::ImportExport::SnippetsRepoSaver.new(current_user: user, project: project, shared: shared) }
let(:bundle_dir) { ::Gitlab::ImportExport.snippets_repo_bundle_path(shared.export_path) } let(:bundle_dir) { ::Gitlab::ImportExport.snippets_repo_bundle_path(shared.export_path) }
let(:service) { instance_double(Gitlab::ImportExport::SnippetRepoRestorer) }
let(:restorer) do let(:restorer) do
described_class.new(user: user, described_class.new(user: user,
shared: shared, shared: shared,
project: project) project: project)
end end
let(:service) { instance_double(Gitlab::ImportExport::SnippetRepoRestorer) }
before do
exporter.save
end
after do after do
FileUtils.rm_rf(shared.export_path) FileUtils.rm_rf(shared.export_path)
end end
it 'calls SnippetRepoRestorer per each snippet with the bundle path' do shared_examples 'imports snippet repositories' do
allow(service).to receive(:restore).and_return(true) before do
snippet1.snippet_repository&.delete
snippet1.repository.remove
snippet2.snippet_repository&.delete
snippet2.repository.remove
end
specify do
expect(snippet1.repository_exists?).to be false
expect(snippet2.repository_exists?).to be false
expect(Gitlab::ImportExport::SnippetRepoRestorer).to receive(:new).with(hash_including(snippet: snippet_with_repo, path_to_bundle: bundle_path(snippet_with_repo))).and_return(service) expect(Gitlab::ImportExport::SnippetRepoRestorer).to receive(:new).with(hash_including(snippet: snippet1, path_to_bundle: bundle_path(snippet1))).and_call_original
expect(Gitlab::ImportExport::SnippetRepoRestorer).to receive(:new).with(hash_including(snippet: snippet_without_repo, path_to_bundle: bundle_path(snippet_without_repo))).and_return(service) expect(Gitlab::ImportExport::SnippetRepoRestorer).to receive(:new).with(hash_including(snippet: snippet2, path_to_bundle: bundle_path(snippet2))).and_call_original
expect(restorer.restore).to be_truthy
snippet1.repository.expire_exists_cache
snippet2.repository.expire_exists_cache
expect(snippet1.blobs).not_to be_empty
expect(snippet2.blobs).not_to be_empty
end
end
context 'when export has no snippet repository bundle' do
before do
expect(Dir.exist?(bundle_dir)).to be false
end
it_behaves_like 'imports snippet repositories'
end
context 'when export has snippet repository bundles and snippets without them' do
let!(:snippet1) { create(:project_snippet, :repository, project: project, author: user) }
let!(:snippet2) { create(:project_snippet, project: project, author: user) }
before do
exporter.save
expect(File.exist?(bundle_path(snippet1))).to be true
expect(File.exist?(bundle_path(snippet2))).to be false
end
it_behaves_like 'imports snippet repositories'
end
context 'when export has only snippet bundles' do
let!(:snippet1) { create(:project_snippet, :repository, project: project, author: user) }
let!(:snippet2) { create(:project_snippet, :repository, project: project, author: user) }
before do
exporter.save
expect(File.exist?(bundle_path(snippet1))).to be true
expect(File.exist?(bundle_path(snippet2))).to be true
end
expect(restorer.restore).to be_truthy it_behaves_like 'imports snippet repositories'
end end
context 'when one snippet cannot be saved' do context 'when one snippet cannot be saved' do
it 'returns false and do not process other snippets' do it 'returns false and do not process other snippets' do
allow(Gitlab::ImportExport::SnippetRepoRestorer).to receive(:new).with(hash_including(snippet: snippet_with_repo)).and_return(service) allow(Gitlab::ImportExport::SnippetRepoRestorer).to receive(:new).with(hash_including(snippet: snippet1)).and_return(service)
allow(service).to receive(:restore).and_return(false) allow(service).to receive(:restore).and_return(false)
expect(Gitlab::ImportExport::SnippetRepoRestorer).not_to receive(:new).with(hash_including(snippet: snippet_without_repo)) expect(Gitlab::ImportExport::SnippetRepoRestorer).not_to receive(:new).with(hash_including(snippet: snippet2))
expect(restorer.restore).to be_falsey expect(restorer.restore).to be_falsey
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