Import pull request comments
This commit is contained in:
parent
489d241c8d
commit
ea393e6f30
3 changed files with 115 additions and 1 deletions
|
@ -28,6 +28,13 @@ module Bitbucket
|
||||||
Collection.new(paginator)
|
Collection.new(paginator)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def pull_request_comments(repo, pull_request)
|
||||||
|
relative_path = "/repositories/#{repo}/pullrequests/#{pull_request}/comments"
|
||||||
|
paginator = Paginator.new(connection, relative_path, :pull_request_comment)
|
||||||
|
|
||||||
|
Collection.new(paginator)
|
||||||
|
end
|
||||||
|
|
||||||
def repo(name)
|
def repo(name)
|
||||||
parsed_response = connection.get("/repositories/#{name}")
|
parsed_response = connection.get("/repositories/#{name}")
|
||||||
Representation::Repo.new(parsed_response)
|
Representation::Repo.new(parsed_response)
|
||||||
|
|
39
lib/bitbucket/representation/pull_request_comment.rb
Normal file
39
lib/bitbucket/representation/pull_request_comment.rb
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
module Bitbucket
|
||||||
|
module Representation
|
||||||
|
class PullRequestComment < Comment
|
||||||
|
def iid
|
||||||
|
raw['id']
|
||||||
|
end
|
||||||
|
|
||||||
|
def file_path
|
||||||
|
inline.fetch('path', nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def old_pos
|
||||||
|
inline.fetch('from', nil) || 1
|
||||||
|
end
|
||||||
|
|
||||||
|
def new_pos
|
||||||
|
inline.fetch('to', nil) || 1
|
||||||
|
end
|
||||||
|
|
||||||
|
def parent_id
|
||||||
|
raw.fetch('parent', {}).fetch('id', nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def inline?
|
||||||
|
raw.has_key?('inline')
|
||||||
|
end
|
||||||
|
|
||||||
|
def has_parent?
|
||||||
|
raw.has_key?('parent')
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def inline
|
||||||
|
raw.fetch('inline', {})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -82,7 +82,7 @@ module Gitlab
|
||||||
description = @formatter.author_line(pull_request.author)
|
description = @formatter.author_line(pull_request.author)
|
||||||
description += pull_request.description
|
description += pull_request.description
|
||||||
|
|
||||||
project.merge_requests.create(
|
merge_request = project.merge_requests.create(
|
||||||
iid: pull_request.iid,
|
iid: pull_request.iid,
|
||||||
title: pull_request.title,
|
title: pull_request.title,
|
||||||
description: description,
|
description: description,
|
||||||
|
@ -98,11 +98,79 @@ module Gitlab
|
||||||
created_at: pull_request.created_at,
|
created_at: pull_request.created_at,
|
||||||
updated_at: pull_request.updated_at
|
updated_at: pull_request.updated_at
|
||||||
)
|
)
|
||||||
|
|
||||||
|
import_pull_request_comments(pull_request, merge_request) if merge_request.persisted?
|
||||||
rescue ActiveRecord::RecordInvalid
|
rescue ActiveRecord::RecordInvalid
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def import_pull_request_comments(pull_request, merge_request)
|
||||||
|
comments = client.pull_request_comments(repo, pull_request.iid)
|
||||||
|
|
||||||
|
inline_comments, pr_comments = comments.partition(&:inline?)
|
||||||
|
|
||||||
|
import_inline_comments(inline_comments, pull_request, merge_request)
|
||||||
|
import_standalone_pr_comments(pr_comments, merge_request)
|
||||||
|
end
|
||||||
|
|
||||||
|
def import_inline_comments(inline_comments, pull_request, merge_request)
|
||||||
|
line_code_map = {}
|
||||||
|
|
||||||
|
children, parents = inline_comments.partition(&:has_parent?)
|
||||||
|
|
||||||
|
# The Bitbucket API returns threaded replies as parent-child
|
||||||
|
# relationships. We assume that the child can appear in any order in
|
||||||
|
# the JSON.
|
||||||
|
parents.each do |comment|
|
||||||
|
line_code_map[comment.iid] = generate_line_code(comment)
|
||||||
|
end
|
||||||
|
|
||||||
|
children.each do |comment|
|
||||||
|
line_code_map[comment.iid] = line_code_map.fetch(comment.parent_id, nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
inline_comments.each do |comment|
|
||||||
|
begin
|
||||||
|
attributes = pull_request_comment_attributes(comment)
|
||||||
|
attributes.merge!(
|
||||||
|
commit_id: pull_request.source_branch_sha,
|
||||||
|
line_code: line_code_map.fetch(comment.iid),
|
||||||
|
type: 'LegacyDiffNote')
|
||||||
|
|
||||||
|
note = merge_request.notes.create!(attributes)
|
||||||
|
rescue ActiveRecord::RecordInvalid => e
|
||||||
|
Rails.log.error("Bitbucket importer ERROR: Invalid pull request comment #{e.message}")
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def import_standalone_pr_comments(pr_comments, merge_request)
|
||||||
|
pr_comments.each do |comment|
|
||||||
|
begin
|
||||||
|
merge_request.notes.create!(pull_request_comment_attributes(comment))
|
||||||
|
rescue ActiveRecord::RecordInvalid => e
|
||||||
|
Rails.log.error("Bitbucket importer ERROR: Invalid standalone pull request comment #{e.message}")
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_line_code(pr_comment)
|
||||||
|
Gitlab::Diff::LineCode.generate(pr_comment.file_path, pr_comment.new_pos, pr_comment.old_pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
def pull_request_comment_attributes(comment)
|
||||||
|
{
|
||||||
|
project: project,
|
||||||
|
note: comment.note,
|
||||||
|
author_id: gitlab_user_id(project, comment.author),
|
||||||
|
created_at: comment.created_at,
|
||||||
|
updated_at: comment.updated_at
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue