Handle threaded comments and prepare for inline comments

This commit is contained in:
Stan Hu 2018-06-28 00:27:04 -07:00
parent 5728ffbf12
commit 014abc9c07
4 changed files with 120 additions and 47 deletions

View file

@ -13,31 +13,27 @@ module BitbucketServer
comment? && raw['commentAnchor'] comment? && raw['commentAnchor']
end end
def id def comment
raw['id'] return unless comment?
end
@comment ||=
def note if inline_comment?
comment['text'] PullRequestComment.new(raw_comment)
end else
Comment.new(raw_comment)
def author_username end
author['name']
end
def author_email
author['emailAddress']
end end
# XXX Move this into MergeEvent
def merge_event? def merge_event?
action == 'MERGED' action == 'MERGED'
end end
def commiter_user def committer_user
commit.fetch('committer', {})['displayName'] commit.fetch('committer', {})['displayName']
end end
def commiter_email def committer_email
commit.fetch('committer', {})['emailAddress'] commit.fetch('committer', {})['emailAddress']
end end
@ -61,12 +57,12 @@ module BitbucketServer
private private
def comment def raw_comment
raw.fetch('comment', {}) raw.fetch('comment', {})
end end
def author def author
comment.fetch('author', {}) raw_comment.fetch('author', {})
end end
# Anchor hash: # Anchor hash:

View file

@ -1,26 +1,79 @@
module Bitbucket module BitbucketServer
module Representation module Representation
# A general comment with the structure:
# "comment": {
# "author": {
# "active": true,
# "displayName": "root",
# "emailAddress": "stanhu+bitbucket@gitlab.com",
# "id": 1,
# "links": {
# "self": [
# {
# "href": "http://localhost:7990/users/root"
# }
# ]
# },
# "name": "root",
# "slug": "root",
# "type": "NORMAL"
# }
# }
# }
class Comment < Representation::Base class Comment < Representation::Base
def author def id
user['username'] raw['id']
end
def author_username
author['username']
end
def author_email
author['displayName']
end end
def note def note
raw.fetch('content', {}).fetch('raw', nil) raw['text']
end end
def created_at def created_at
raw['created_on'] Time.at(created_date / 1000) if created_date.is_a?(Integer)
end end
def updated_at def updated_at
raw['updated_on'] || raw['created_on'] Time.at(updated_date / 1000) if created_date.is_a?(Integer)
end
def comments
workset = [raw['comments']].compact
all_comments = []
until workset.empty?
comments = workset.pop
comments.each do |comment|
new_comments = comment.delete('comments')
workset << new_comments if new_comments
all_comments << Comment.new(comment)
end
end
all_comments
end end
private private
def user def author
raw.fetch('user', {}) raw.fetch('author', {})
end
def created_date
raw['createdDate']
end
def updated_date
raw['updatedDate']
end end
end end
end end

View file

@ -1,38 +1,59 @@
module Bitbucket module BitbucketServer
module Representation module Representation
# An inline comment with the following structure that identifies
# the part of the diff:
#
# "commentAnchor": {
# "diffType": "EFFECTIVE",
# "fileType": "TO",
# "fromHash": "c5f4288162e2e6218180779c7f6ac1735bb56eab",
# "line": 1,
# "lineType": "ADDED",
# "orphaned": false,
# "path": "CHANGELOG.md",
# "toHash": "a4c2164330f2549f67c13f36a93884cf66e976be"
# }
class PullRequestComment < Comment class PullRequestComment < Comment
def iid def file_type
raw['id'] comment_anchor['fileType']
end end
def file_path def from_sha
inline.fetch('path') comment_anchor['fromHash']
end end
def old_pos def to_sha
inline.fetch('from') comment_anchor['toHash']
end
def to?
file_type == 'TO'
end
def from?
file_type == 'FROM'
end end
def new_pos def new_pos
inline.fetch('to') return unless to?
comment_anchor['line']
end end
def parent_id def old_pos
raw.fetch('parent', {}).fetch('id', nil) return unless from?
comment_anchor['line']
end end
def inline? def file_path
raw.key?('inline') comment_anchor.fetch('path')
end
def has_parent?
raw.key?('parent')
end end
private private
def inline def comment_anchor
raw.fetch('inline', {}) raw.fetch('commentAnchor', {})
end end
end end
end end

View file

@ -105,11 +105,11 @@ module Gitlab
inline_comments, pr_comments = comments.partition(&:inline_comment?) inline_comments, pr_comments = comments.partition(&:inline_comment?)
# import_inline_comments(inline_comments, pull_request, merge_request) # import_inline_comments(inline_comments, pull_request, merge_request)
import_standalone_pr_comments(pr_comments, merge_request) import_standalone_pr_comments(pr_comments.map(&:comment), merge_request)
end end
def import_merge_event(merge_request, merge_event) def import_merge_event(merge_request, merge_event)
committer = merge_event.commiter_email committer = merge_event.committer_email
return unless committer return unless committer
@ -169,6 +169,10 @@ module Gitlab
pr_comments.each do |comment| pr_comments.each do |comment|
begin begin
merge_request.notes.create!(pull_request_comment_attributes(comment)) merge_request.notes.create!(pull_request_comment_attributes(comment))
comment.comments.each do |replies|
merge_request.notes.create!(pull_request_comment_attributes(replies))
end
rescue StandardError => e rescue StandardError => e
errors << { type: :pull_request, iid: comment.id, errors: e.message } errors << { type: :pull_request, iid: comment.id, errors: e.message }
end end
@ -180,7 +184,6 @@ module Gitlab
end end
def pull_request_comment_attributes(comment) def pull_request_comment_attributes(comment)
byebug
{ {
project: project, project: project,
note: comment.note, note: comment.note,