diff options
Diffstat (limited to 'lib/gitlab/github_import/importer/pull_request_review_importer.rb')
-rw-r--r-- | lib/gitlab/github_import/importer/pull_request_review_importer.rb | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/lib/gitlab/github_import/importer/pull_request_review_importer.rb b/lib/gitlab/github_import/importer/pull_request_review_importer.rb new file mode 100644 index 00000000000..14ee69ba089 --- /dev/null +++ b/lib/gitlab/github_import/importer/pull_request_review_importer.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +module Gitlab + module GithubImport + module Importer + class PullRequestReviewImporter + def initialize(review, project, client) + @review = review + @project = project + @client = client + @merge_request = project.merge_requests.find_by_id(review.merge_request_id) + end + + def execute + user_finder = GithubImport::UserFinder.new(project, client) + gitlab_user_id = user_finder.user_id_for(review.author) + + if gitlab_user_id + add_review_note!(gitlab_user_id) + add_approval!(gitlab_user_id) + else + add_complementary_review_note!(project.creator_id) + end + end + + private + + attr_reader :review, :merge_request, :project, :client + + def add_review_note!(author_id) + return if review.note.empty? + + add_note!(author_id, review_note_content) + end + + def add_complementary_review_note!(author_id) + return if review.note.empty? && !review.approval? + + note = "*Created by %{login}*\n\n%{note}" % { + note: review_note_content, + login: review.author.login + } + + add_note!(author_id, note) + end + + def review_note_content + header = "**Review:** #{review.review_type.humanize}" + + if review.note.present? + "#{header}\n\n#{review.note}" + else + header + end + end + + def add_note!(author_id, note) + note = Note.new(note_attributes(author_id, note)) + + note.save! + end + + def note_attributes(author_id, note, extra = {}) + { + importing: true, + noteable_id: merge_request.id, + noteable_type: 'MergeRequest', + project_id: project.id, + author_id: author_id, + note: note, + system: false, + created_at: review.submitted_at, + updated_at: review.submitted_at + }.merge(extra) + end + + def add_approval!(user_id) + return unless review.review_type == 'APPROVED' + + add_approval_system_note!(user_id) + + merge_request.approvals.create!( + user_id: user_id, + created_at: review.submitted_at + ) + end + + def add_approval_system_note!(user_id) + attributes = note_attributes( + user_id, + 'approved this merge request', + system: true, + system_note_metadata: SystemNoteMetadata.new(action: 'approved') + ) + + Note.create!(attributes) + end + end + end + end +end |