debian-mirror-gitlab/lib/gitlab/import_export/project/tree_restorer.rb

120 lines
3.4 KiB
Ruby
Raw Normal View History

2020-04-08 14:13:33 +05:30
# frozen_string_literal: true
module Gitlab
module ImportExport
module Project
class TreeRestorer
2020-04-22 19:07:51 +05:30
include Gitlab::Utils::StrongMemoize
2020-04-08 14:13:33 +05:30
attr_reader :user
attr_reader :shared
attr_reader :project
def initialize(user:, shared:, project:)
@user = user
@shared = shared
@project = project
end
def restore
2020-04-22 19:07:51 +05:30
unless relation_reader
raise Gitlab::ImportExport::Error, 'invalid import format'
end
@project_attributes = relation_reader.consume_attributes(importable_path)
@project_members = relation_reader.consume_relation(importable_path, 'project_members')
.map(&:first)
2020-04-08 14:13:33 +05:30
2020-04-22 19:07:51 +05:30
# ensure users are mapped before tree restoration
# so that even if there is no content to associate
# users with, they are still added to the project
members_mapper.map
2020-04-08 14:13:33 +05:30
if relation_tree_restorer.restore
import_failure_service.with_retry(action: 'set_latest_merge_request_diff_ids!') do
@project.merge_requests.set_latest_merge_request_diff_ids!
end
true
else
false
end
2021-06-08 01:23:25 +05:30
rescue StandardError => e
2020-04-08 14:13:33 +05:30
@shared.error(e)
false
end
private
2020-04-22 19:07:51 +05:30
def relation_reader
strong_memoize(:relation_reader) do
[ndjson_relation_reader, legacy_relation_reader]
.compact.find(&:exist?)
end
end
def ndjson_relation_reader
2020-05-24 23:13:21 +05:30
return unless Feature.enabled?(:project_import_ndjson, project.namespace, default_enabled: true)
2020-04-22 19:07:51 +05:30
2021-09-04 01:27:46 +05:30
ImportExport::Json::NdjsonReader.new(
2020-04-22 19:07:51 +05:30
File.join(shared.export_path, 'tree')
)
end
def legacy_relation_reader
2021-09-04 01:27:46 +05:30
ImportExport::Json::LegacyReader::File.new(
2020-04-22 19:07:51 +05:30
File.join(shared.export_path, 'project.json'),
relation_names: reader.project_relation_names,
allowed_path: importable_path
)
end
2020-04-08 14:13:33 +05:30
def relation_tree_restorer
2021-01-03 14:25:43 +05:30
@relation_tree_restorer ||= relation_tree_restorer_class.new(
2020-04-08 14:13:33 +05:30
user: @user,
shared: @shared,
2020-04-22 19:07:51 +05:30
relation_reader: relation_reader,
2020-04-08 14:13:33 +05:30
object_builder: object_builder,
members_mapper: members_mapper,
relation_factory: relation_factory,
2020-04-22 19:07:51 +05:30
reader: reader,
importable: @project,
importable_attributes: @project_attributes,
importable_path: importable_path
2020-04-08 14:13:33 +05:30
)
end
2021-01-03 14:25:43 +05:30
def relation_tree_restorer_class
2021-01-29 00:20:46 +05:30
RelationTreeRestorer
2021-01-03 14:25:43 +05:30
end
2020-04-08 14:13:33 +05:30
def members_mapper
@members_mapper ||= Gitlab::ImportExport::MembersMapper.new(exported_members: @project_members,
user: @user,
importable: @project)
end
def object_builder
Project::ObjectBuilder
end
def relation_factory
Project::RelationFactory
end
def reader
@reader ||= Gitlab::ImportExport::Reader.new(shared: @shared)
end
def import_failure_service
@import_failure_service ||= ImportFailureService.new(@project)
end
2020-04-22 19:07:51 +05:30
def importable_path
"project"
end
2020-04-08 14:13:33 +05:30
end
end
end
end