summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/github_import/comment.rb59
-rw-r--r--lib/gitlab/github_import/importer.rb73
-rw-r--r--lib/gitlab/github_import/pull_request.rb103
3 files changed, 174 insertions, 61 deletions
diff --git a/lib/gitlab/github_import/comment.rb b/lib/gitlab/github_import/comment.rb
new file mode 100644
index 00000000000..55de78f889d
--- /dev/null
+++ b/lib/gitlab/github_import/comment.rb
@@ -0,0 +1,59 @@
+module Gitlab
+ module GithubImport
+ class Comment
+ attr_reader :project, :raw_data
+
+ def initialize(project, raw_data)
+ @project = project
+ @raw_data = raw_data
+ @formatter = Gitlab::ImportFormatter.new
+ end
+
+ def attributes
+ {
+ project: project,
+ note: note,
+ commit_id: raw_data.commit_id,
+ line_code: line_code,
+ author_id: author_id,
+ created_at: raw_data.created_at,
+ updated_at: raw_data.updated_at
+ }
+ end
+
+ private
+
+ def author
+ raw_data.user.login
+ end
+
+ def author_id
+ gl_user_id(raw_data.user.id) || project.creator_id
+ end
+
+ def body
+ raw_data.body || ""
+ end
+
+ def line_code
+ if on_diff?
+ Gitlab::Diff::LineCode.generate(raw_data.path, raw_data.position, 0)
+ end
+ end
+
+ def on_diff?
+ raw_data.path && raw_data.position
+ end
+
+ def note
+ @formatter.author_line(author) + body
+ end
+
+ def gl_user_id(github_id)
+ User.joins(:identities).
+ find_by("identities.extern_uid = ? AND identities.provider = 'github'", github_id.to_s).
+ try(:id)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/importer.rb b/lib/gitlab/github_import/importer.rb
index 2c64f5cebc7..7c495655012 100644
--- a/lib/gitlab/github_import/importer.rb
+++ b/lib/gitlab/github_import/importer.rb
@@ -51,80 +51,31 @@ module Gitlab
def import_pull_requests
client.pull_requests(project.import_source, state: :all,
sort: :created,
- direction: :asc).each do |pull_request|
- source_branch = find_branch(pull_request.head.ref)
- target_branch = find_branch(pull_request.base.ref)
+ direction: :asc).each do |raw_data|
+ pull_request = PullRequest.new(project, raw_data)
- if source_branch && target_branch
- merge_request = MergeRequest.create!(
- title: pull_request.title,
- description: format_body(pull_request.user.login, pull_request.body),
- source_project: project,
- source_branch: source_branch.name,
- target_project: project,
- target_branch: target_branch.name,
- state: merge_request_state(pull_request),
- author_id: gl_author_id(project, pull_request.user.id),
- assignee_id: gl_user_id(pull_request.assignee.try(:id)),
- created_at: pull_request.created_at,
- updated_at: pull_request.updated_at
- )
-
- import_comments_on_pull_request(merge_request, pull_request)
- import_comments_on_pull_request_diff(merge_request, pull_request)
+ if pull_request.valid?
+ merge_request = MergeRequest.create!(pull_request.attributes)
+ import_comments_on_pull_request(merge_request, raw_data)
+ import_comments_on_pull_request_diff(merge_request, raw_data)
end
end
end
def import_comments_on_pull_request(merge_request, pull_request)
- client.issue_comments(project.import_source, pull_request.number).each do |c|
- merge_request.notes.create!(
- project: project,
- note: format_body(c.user.login, c.body),
- author_id: gl_author_id(project, c.user.id),
- created_at: c.created_at,
- updated_at: c.updated_at
- )
+ client.issue_comments(project.import_source, pull_request.number).each do |raw_data|
+ comment = Comment.new(project, raw_data)
+ merge_request.notes.create!(comment.attributes)
end
end
def import_comments_on_pull_request_diff(merge_request, pull_request)
- client.pull_request_comments(project.import_source, pull_request.number).each do |c|
- merge_request.notes.create!(
- project: project,
- note: format_body(c.user.login, c.body),
- commit_id: c.commit_id,
- line_code: generate_line_code(c.path, c.position),
- author_id: gl_author_id(project, c.user.id),
- created_at: c.created_at,
- updated_at: c.updated_at
- )
+ client.pull_request_comments(project.import_source, pull_request.number).each do |raw_data|
+ comment = Comment.new(project, raw_data)
+ merge_request.notes.create!(comment.attributes)
end
end
- def find_branch(name)
- project.repository.find_branch(name)
- end
-
- def format_body(author, body)
- @formatter.author_line(author) + (body || "")
- end
-
- def merge_request_state(pull_request)
- case true
- when pull_request.state == 'closed' && pull_request.merged_at.present?
- 'merged'
- when pull_request.state == 'closed'
- 'closed'
- else
- 'opened'
- end
- end
-
- def generate_line_code(file_path, position)
- Gitlab::Diff::LineCode.generate(file_path, position, 0)
- end
-
def gl_author_id(project, github_id)
gl_user_id(github_id) || project.creator_id
end
diff --git a/lib/gitlab/github_import/pull_request.rb b/lib/gitlab/github_import/pull_request.rb
new file mode 100644
index 00000000000..61e846472f2
--- /dev/null
+++ b/lib/gitlab/github_import/pull_request.rb
@@ -0,0 +1,103 @@
+module Gitlab
+ module GithubImport
+ class PullRequest
+ attr_reader :project, :raw_data
+
+ def initialize(project, raw_data)
+ @project = project
+ @raw_data = raw_data
+ @formatter = Gitlab::ImportFormatter.new
+ end
+
+ def attributes
+ {
+ title: raw_data.title,
+ description: description,
+ source_project: source_project,
+ source_branch: source_branch.name,
+ target_project: target_project,
+ target_branch: target_branch.name,
+ state: state,
+ author_id: author_id,
+ assignee_id: assignee_id,
+ created_at: raw_data.created_at,
+ updated_at: updated_at
+ }
+ end
+
+ def valid?
+ source_branch.present? && target_branch.present?
+ end
+
+ private
+
+ def assigned?
+ raw_data.assignee.present?
+ end
+
+ def assignee_id
+ if assigned?
+ gl_user_id(raw_data.assignee.id)
+ end
+ end
+
+ def author
+ raw_data.user.login
+ end
+
+ def author_id
+ gl_user_id(raw_data.user.id) || project.creator_id
+ end
+
+ def body
+ raw_data.body || ""
+ end
+
+ def description
+ @formatter.author_line(author) + body
+ end
+
+ def source_project
+ project
+ end
+
+ def source_branch
+ source_project.repository.find_branch(raw_data.head.ref)
+ end
+
+ def target_project
+ project
+ end
+
+ def target_branch
+ target_project.repository.find_branch(raw_data.base.ref)
+ end
+
+ def state
+ @state ||= case true
+ when raw_data.state == 'closed' && raw_data.merged_at.present?
+ 'merged'
+ when raw_data.state == 'closed'
+ 'closed'
+ else
+ 'opened'
+ end
+ end
+
+ def updated_at
+ case state
+ when 'merged' then raw_data.merged_at
+ when 'closed' then raw_data.closed_at
+ else
+ raw_data.updated_at
+ end
+ end
+
+ def gl_user_id(github_id)
+ User.joins(:identities).
+ find_by("identities.extern_uid = ? AND identities.provider = 'github'", github_id.to_s).
+ try(:id)
+ end
+ end
+ end
+end