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

View file

@ -1,26 +1,79 @@
module Bitbucket
module BitbucketServer
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
def author
user['username']
def id
raw['id']
end
def author_username
author['username']
end
def author_email
author['displayName']
end
def note
raw.fetch('content', {}).fetch('raw', nil)
raw['text']
end
def created_at
raw['created_on']
Time.at(created_date / 1000) if created_date.is_a?(Integer)
end
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
private
def user
raw.fetch('user', {})
def author
raw.fetch('author', {})
end
def created_date
raw['createdDate']
end
def updated_date
raw['updatedDate']
end
end
end

View file

@ -1,38 +1,59 @@
module Bitbucket
module BitbucketServer
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
def iid
raw['id']
def file_type
comment_anchor['fileType']
end
def file_path
inline.fetch('path')
def from_sha
comment_anchor['fromHash']
end
def old_pos
inline.fetch('from')
def to_sha
comment_anchor['toHash']
end
def to?
file_type == 'TO'
end
def from?
file_type == 'FROM'
end
def new_pos
inline.fetch('to')
return unless to?
comment_anchor['line']
end
def parent_id
raw.fetch('parent', {}).fetch('id', nil)
def old_pos
return unless from?
comment_anchor['line']
end
def inline?
raw.key?('inline')
end
def has_parent?
raw.key?('parent')
def file_path
comment_anchor.fetch('path')
end
private
def inline
raw.fetch('inline', {})
def comment_anchor
raw.fetch('commentAnchor', {})
end
end
end

View file

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