Handle threaded comments and prepare for inline comments
This commit is contained in:
parent
5728ffbf12
commit
014abc9c07
4 changed files with 120 additions and 47 deletions
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue