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:
authorKushal Pandya <kushalspandya@gmail.com>2017-04-06 12:46:50 +0300
committerKushal Pandya <kushalspandya@gmail.com>2017-04-06 12:46:50 +0300
commit18506d4b8b8bc780b3b1e4c61339af38b5c49bb2 (patch)
tree6aab0c83abe14064433c326996ccbe8097495454 /lib/gitlab/import_export
parentcd5b36d04e79ed8fcd649127e0d47e09ec325242 (diff)
parent49bdd8d63b577f079cdc47f7dd10ba83c677771a (diff)
Merge branch 'master' into '18471-restrict-tag-pushes-protected-tags'
# Conflicts: # app/assets/javascripts/dispatcher.js # app/assets/stylesheets/pages/projects.scss
Diffstat (limited to 'lib/gitlab/import_export')
-rw-r--r--lib/gitlab/import_export/hash_util.rb25
-rw-r--r--lib/gitlab/import_export/import_export.yml2
-rw-r--r--lib/gitlab/import_export/importer.rb2
-rw-r--r--lib/gitlab/import_export/merge_request_parser.rb41
-rw-r--r--lib/gitlab/import_export/project_tree_restorer.rb2
-rw-r--r--lib/gitlab/import_export/relation_factory.rb17
6 files changed, 82 insertions, 7 deletions
diff --git a/lib/gitlab/import_export/hash_util.rb b/lib/gitlab/import_export/hash_util.rb
new file mode 100644
index 00000000000..d4adeeb3797
--- /dev/null
+++ b/lib/gitlab/import_export/hash_util.rb
@@ -0,0 +1,25 @@
+module Gitlab
+ module ImportExport
+ class HashUtil
+ def self.deep_symbolize_array!(array)
+ return if array.blank?
+
+ array.map! do |hash|
+ hash.deep_symbolize_keys!
+
+ yield(hash) if block_given?
+
+ hash
+ end
+ end
+
+ def self.deep_symbolize_array_with_date!(array)
+ self.deep_symbolize_array!(array) do |hash|
+ hash.select { |k, _v| k.to_s.end_with?('_date') }.each do |key, value|
+ hash[key] = Time.zone.parse(value)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml
index 25e03ec64d3..745f9a1cfbd 100644
--- a/lib/gitlab/import_export/import_export.yml
+++ b/lib/gitlab/import_export/import_export.yml
@@ -91,3 +91,5 @@ methods:
- :type
merge_request_diff:
- :utf8_st_diffs
+ merge_requests:
+ - :diff_head_sha
diff --git a/lib/gitlab/import_export/importer.rb b/lib/gitlab/import_export/importer.rb
index 063ce74ecad..fbdd74788bc 100644
--- a/lib/gitlab/import_export/importer.rb
+++ b/lib/gitlab/import_export/importer.rb
@@ -9,7 +9,7 @@ module Gitlab
end
def execute
- if import_file && check_version! && [project_tree, avatar_restorer, repo_restorer, wiki_restorer, uploads_restorer].all?(&:restore)
+ if import_file && check_version! && [repo_restorer, wiki_restorer, project_tree, avatar_restorer, uploads_restorer].all?(&:restore)
project_tree.restored_project
else
raise Projects::ImportService::Error.new(@shared.errors.join(', '))
diff --git a/lib/gitlab/import_export/merge_request_parser.rb b/lib/gitlab/import_export/merge_request_parser.rb
new file mode 100644
index 00000000000..c20adc20bfd
--- /dev/null
+++ b/lib/gitlab/import_export/merge_request_parser.rb
@@ -0,0 +1,41 @@
+module Gitlab
+ module ImportExport
+ class MergeRequestParser
+ FORKED_PROJECT_ID = -1
+
+ def initialize(project, diff_head_sha, merge_request, relation_hash)
+ @project = project
+ @diff_head_sha = diff_head_sha
+ @merge_request = merge_request
+ @relation_hash = relation_hash
+ end
+
+ def parse!
+ if fork_merge_request? && @diff_head_sha
+ @merge_request.source_project_id = @relation_hash['project_id']
+
+ fetch_ref unless branch_exists?(@merge_request.source_branch)
+ create_target_branch unless branch_exists?(@merge_request.target_branch)
+ end
+
+ @merge_request
+ end
+
+ def create_target_branch
+ @project.repository.create_branch(@merge_request.target_branch, @merge_request.target_branch_sha)
+ end
+
+ def fetch_ref
+ @project.repository.fetch_ref(@project.repository.path, @diff_head_sha, @merge_request.source_branch)
+ end
+
+ def branch_exists?(branch_name)
+ @project.repository.branch_exists?(branch_name)
+ end
+
+ def fork_merge_request?
+ @relation_hash['source_project_id'] == FORKED_PROJECT_ID
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/import_export/project_tree_restorer.rb b/lib/gitlab/import_export/project_tree_restorer.rb
index cda6ddf0443..df21ff22216 100644
--- a/lib/gitlab/import_export/project_tree_restorer.rb
+++ b/lib/gitlab/import_export/project_tree_restorer.rb
@@ -119,7 +119,7 @@ module Gitlab
relation_hash: parsed_relation_hash(relation_hash),
members_mapper: members_mapper,
user: @user,
- project_id: restored_project.id)
+ project: restored_project)
end.compact
relation_hash_list.is_a?(Array) ? relation_array : relation_array.first
diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb
index 430de9a1bf8..0545ca10862 100644
--- a/lib/gitlab/import_export/relation_factory.rb
+++ b/lib/gitlab/import_export/relation_factory.rb
@@ -30,11 +30,12 @@ module Gitlab
new(*args).create
end
- def initialize(relation_sym:, relation_hash:, members_mapper:, user:, project_id:)
+ def initialize(relation_sym:, relation_hash:, members_mapper:, user:, project:)
@relation_name = OVERRIDES[relation_sym] || relation_sym
- @relation_hash = relation_hash.except('noteable_id').merge('project_id' => project_id)
+ @relation_hash = relation_hash.except('noteable_id').merge('project_id' => project.id)
@members_mapper = members_mapper
@user = user
+ @project = project
@imported_object_retries = 0
end
@@ -67,7 +68,7 @@ module Gitlab
remove_encrypted_attributes!
@relation_hash['data'].deep_symbolize_keys! if @relation_name == :events && @relation_hash['data']
- set_st_diffs if @relation_name == :merge_request_diff
+ set_st_diff_commits if @relation_name == :merge_request_diff
end
def update_user_references
@@ -106,6 +107,8 @@ module Gitlab
imported_object do |object|
object.commit_id = nil
end
+ elsif @relation_name == :merge_requests
+ MergeRequestParser.new(@project, @relation_hash.delete('diff_head_sha'), imported_object, @relation_hash).parse!
else
imported_object
end
@@ -116,7 +119,7 @@ module Gitlab
# If source and target are the same, populate them with the new project ID.
if @relation_hash['source_project_id']
- @relation_hash['source_project_id'] = same_source_and_target? ? project_id : -1
+ @relation_hash['source_project_id'] = same_source_and_target? ? project_id : MergeRequestParser::FORKED_PROJECT_ID
end
# project_id may not be part of the export, but we always need to populate it if required.
@@ -167,6 +170,7 @@ module Gitlab
def imported_object
yield(existing_or_new_object) if block_given?
existing_or_new_object.importing = true if existing_or_new_object.respond_to?(:importing)
+
existing_or_new_object
rescue ActiveRecord::RecordNotUnique
# as the operation is not atomic, retry in the unlikely scenario an INSERT is
@@ -189,8 +193,11 @@ module Gitlab
relation_class: relation_class)
end
- def set_st_diffs
+ def set_st_diff_commits
@relation_hash['st_diffs'] = @relation_hash.delete('utf8_st_diffs')
+
+ HashUtil.deep_symbolize_array!(@relation_hash['st_diffs'])
+ HashUtil.deep_symbolize_array_with_date!(@relation_hash['st_commits'])
end
def existing_or_new_object