From 014abc9c07c1389e64ccf336559b488835730a45 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Thu, 28 Jun 2018 00:27:04 -0700 Subject: [PATCH] Handle threaded comments and prepare for inline comments --- .../representation/activity.rb | 32 ++++----- .../representation/comment.rb | 69 ++++++++++++++++--- .../representation/pull_request_comment.rb | 57 ++++++++++----- .../bitbucket_server_import/importer.rb | 9 ++- 4 files changed, 120 insertions(+), 47 deletions(-) diff --git a/lib/bitbucket_server/representation/activity.rb b/lib/bitbucket_server/representation/activity.rb index 207bc848b28..aa168aca8af 100644 --- a/lib/bitbucket_server/representation/activity.rb +++ b/lib/bitbucket_server/representation/activity.rb @@ -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: diff --git a/lib/bitbucket_server/representation/comment.rb b/lib/bitbucket_server/representation/comment.rb index 4937aa9728f..bd6f9f08e3c 100644 --- a/lib/bitbucket_server/representation/comment.rb +++ b/lib/bitbucket_server/representation/comment.rb @@ -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 diff --git a/lib/bitbucket_server/representation/pull_request_comment.rb b/lib/bitbucket_server/representation/pull_request_comment.rb index c52acbc3ddc..a04c120b0b0 100644 --- a/lib/bitbucket_server/representation/pull_request_comment.rb +++ b/lib/bitbucket_server/representation/pull_request_comment.rb @@ -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 diff --git a/lib/gitlab/bitbucket_server_import/importer.rb b/lib/gitlab/bitbucket_server_import/importer.rb index 43a52a61ee5..f8871ade6e7 100644 --- a/lib/gitlab/bitbucket_server_import/importer.rb +++ b/lib/gitlab/bitbucket_server_import/importer.rb @@ -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,