Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2019-10-04 15:06:14 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2019-10-04 15:06:14 +0300
commit0d46bf06388d485824bc2f1e736b92b2a8a397e4 (patch)
tree626a835841722463da4def7905b95e874eb77578 /lib/gitlab/import_export
parent1f1bdf54e1974f89f3a6ba734ec2c42552e90639 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/import_export')
-rw-r--r--lib/gitlab/import_export/importer.rb16
-rw-r--r--lib/gitlab/import_export/project_tree_restorer.rb51
2 files changed, 28 insertions, 39 deletions
diff --git a/lib/gitlab/import_export/importer.rb b/lib/gitlab/import_export/importer.rb
index f061a1916da..62cf6c86906 100644
--- a/lib/gitlab/import_export/importer.rb
+++ b/lib/gitlab/import_export/importer.rb
@@ -19,7 +19,7 @@ module Gitlab
def execute
if import_file && check_version! && restorers.all?(&:restore) && overwrite_project
- project_tree.restored_project
+ project
else
raise Projects::ImportService::Error.new(shared.errors.to_sentence)
end
@@ -55,32 +55,32 @@ module Gitlab
end
def avatar_restorer
- Gitlab::ImportExport::AvatarRestorer.new(project: project_tree.restored_project, shared: shared)
+ Gitlab::ImportExport::AvatarRestorer.new(project: project, shared: shared)
end
def repo_restorer
Gitlab::ImportExport::RepoRestorer.new(path_to_bundle: repo_path,
shared: shared,
- project: project_tree.restored_project)
+ project: project)
end
def wiki_restorer
Gitlab::ImportExport::WikiRestorer.new(path_to_bundle: wiki_repo_path,
shared: shared,
- project: ProjectWiki.new(project_tree.restored_project),
+ project: ProjectWiki.new(project),
wiki_enabled: project.wiki_enabled?)
end
def uploads_restorer
- Gitlab::ImportExport::UploadsRestorer.new(project: project_tree.restored_project, shared: shared)
+ Gitlab::ImportExport::UploadsRestorer.new(project: project, shared: shared)
end
def lfs_restorer
- Gitlab::ImportExport::LfsRestorer.new(project: project_tree.restored_project, shared: shared)
+ Gitlab::ImportExport::LfsRestorer.new(project: project, shared: shared)
end
def statistics_restorer
- Gitlab::ImportExport::StatisticsRestorer.new(project: project_tree.restored_project, shared: shared)
+ Gitlab::ImportExport::StatisticsRestorer.new(project: project, shared: shared)
end
def path_with_namespace
@@ -105,8 +105,6 @@ module Gitlab
end
def overwrite_project
- project = project_tree.restored_project
-
return unless can?(current_user, :admin_namespace, project.namespace)
if overwrite_project?
diff --git a/lib/gitlab/import_export/project_tree_restorer.rb b/lib/gitlab/import_export/project_tree_restorer.rb
index 017e536c3e7..edee4ba2486 100644
--- a/lib/gitlab/import_export/project_tree_restorer.rb
+++ b/lib/gitlab/import_export/project_tree_restorer.rb
@@ -6,19 +6,21 @@ module Gitlab
# Relations which cannot be saved at project level (and have a group assigned)
GROUP_MODELS = [GroupLabel, Milestone].freeze
+ attr_reader :user
+ attr_reader :shared
+ attr_reader :project
+
def initialize(user:, shared:, project:)
@path = File.join(shared.export_path, 'project.json')
@user = user
@shared = shared
@project = project
- @project_id = project.id
@saved = true
end
def restore
begin
- json = IO.read(@path)
- @tree_hash = ActiveSupport::JSON.decode(json)
+ @tree_hash = read_tree_hash
rescue => e
Rails.logger.error("Import/Export error: #{e.message}") # rubocop:disable Gitlab/RailsLogger
raise Gitlab::ImportExport::Error.new('Incorrect JSON format')
@@ -30,26 +32,31 @@ module Gitlab
ActiveRecord::Base.uncached do
ActiveRecord::Base.no_touching do
+ update_project_params
create_relations
end
end
+
+ # ensure that we have latest version of the restore
+ @project.reload # rubocop:disable Cop/ActiveRecordAssociationReload
+
+ true
rescue => e
@shared.error(e)
false
end
- def restored_project
- return @project unless @tree_hash
+ private
- @restored_project ||= restore_project
+ def read_tree_hash
+ json = IO.read(@path)
+ ActiveSupport::JSON.decode(json)
end
- private
-
def members_mapper
@members_mapper ||= Gitlab::ImportExport::MembersMapper.new(exported_members: @project_members,
user: @user,
- project: restored_project)
+ project: @project)
end
# A Hash of the imported merge request ID -> imported ID.
@@ -83,12 +90,11 @@ module Gitlab
remove_group_models(relation_hash) if relation_hash.is_a?(Array)
- @saved = false unless restored_project.append_or_update_attribute(relation_key, relation_hash)
+ @saved = false unless @project.append_or_update_attribute(relation_key, relation_hash)
save_id_mappings(relation_key, relation_hash_batch, relation_hash)
- # Restore the project again, extra query that skips holding the AR objects in memory
- @restored_project = Project.find(@project_id)
+ @project.reset
end
# Older, serialized CI pipeline exports may only have a
@@ -127,12 +133,10 @@ module Gitlab
reader.attributes_finder.find_relations_tree(:project)
end
- def restore_project
+ def update_project_params
Gitlab::Timeless.timeless(@project) do
@project.update(project_params)
end
-
- @project
end
def project_params
@@ -184,18 +188,9 @@ module Gitlab
return if tree_hash[relation_key].blank?
tree_array = [tree_hash[relation_key]].flatten
- null_iid_pipelines = []
# Avoid keeping a possible heavy object in memory once we are done with it
- while relation_item = (tree_array.shift || null_iid_pipelines.shift)
- if nil_iid_pipeline?(relation_key, relation_item) && tree_array.any?
- # Move pipelines with NULL IIDs to the end
- # so they don't clash with existing IIDs.
- null_iid_pipelines << relation_item
-
- next
- end
-
+ while relation_item = tree_array.shift
remove_feature_dependent_sub_relations(relation_item)
# The transaction at this level is less speedy than one single transaction
@@ -245,7 +240,7 @@ module Gitlab
members_mapper: members_mapper,
merge_requests_mapping: merge_requests_mapping,
user: @user,
- project: @restored_project,
+ project: @project,
excluded_keys: excluded_keys_for_relation(relation_key))
end.compact
@@ -259,10 +254,6 @@ module Gitlab
def excluded_keys_for_relation(relation)
reader.attributes_finder.find_excluded_keys(relation)
end
-
- def nil_iid_pipeline?(relation_key, relation_item)
- relation_key == 'ci_pipelines' && relation_item['iid'].nil?
- end
end
end
end