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']
|
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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue