diff options
-rw-r--r-- | changelogs/unreleased/georgekoltsov-63408-user-mapping.yml | 5 | ||||
-rw-r--r-- | doc/user/project/import/bitbucket.md | 12 | ||||
-rw-r--r-- | lib/bitbucket/representation/comment.rb | 2 | ||||
-rw-r--r-- | lib/bitbucket/representation/issue.rb | 2 | ||||
-rw-r--r-- | lib/bitbucket/representation/pull_request.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/bitbucket_import/importer.rb | 8 | ||||
-rw-r--r-- | spec/lib/bitbucket/representation/comment_spec.rb | 2 | ||||
-rw-r--r-- | spec/lib/bitbucket/representation/issue_spec.rb | 2 | ||||
-rw-r--r-- | spec/lib/bitbucket/representation/pull_request_spec.rb | 2 | ||||
-rw-r--r-- | spec/lib/gitlab/bitbucket_import/importer_spec.rb | 39 |
10 files changed, 55 insertions, 21 deletions
diff --git a/changelogs/unreleased/georgekoltsov-63408-user-mapping.yml b/changelogs/unreleased/georgekoltsov-63408-user-mapping.yml new file mode 100644 index 00000000000..451aac9c2e3 --- /dev/null +++ b/changelogs/unreleased/georgekoltsov-63408-user-mapping.yml @@ -0,0 +1,5 @@ +--- +title: 'Fix missing author line (`Created by: <user>`) in MRs/issues/comments of imported Bitbucket Cloud project' +merge_request: 31579 +author: +type: fixed diff --git a/doc/user/project/import/bitbucket.md b/doc/user/project/import/bitbucket.md index 5abce39c093..e509e333313 100644 --- a/doc/user/project/import/bitbucket.md +++ b/doc/user/project/import/bitbucket.md @@ -31,12 +31,12 @@ to enable this if not already. ## How it works When issues/pull requests are being imported, the Bitbucket importer tries to find -the Bitbucket author/assignee in GitLab's database using the Bitbucket ID. For this -to work, the Bitbucket author/assignee should have signed in beforehand in GitLab -and **associated their Bitbucket account**. If the user is not -found in GitLab's database, the project creator (most of the times the current -user that started the import process) is set as the author, but a reference on -the issue about the original Bitbucket author is kept. +the Bitbucket author/assignee in GitLab's database using the Bitbucket `nickname`. +For this to work, the Bitbucket author/assignee should have signed in beforehand in GitLab +and **associated their Bitbucket account**. Their `nickname` must also match their Bitbucket +`username.`. If the user is not found in GitLab's database, the project creator +(most of the times the current user that started the import process) is set as the author, +but a reference on the issue about the original Bitbucket author is kept. The importer will create any new namespaces (groups) if they don't exist or in the case the namespace is taken, the repository will be imported under the user's diff --git a/lib/bitbucket/representation/comment.rb b/lib/bitbucket/representation/comment.rb index 1b8dc27793a..127598a76ab 100644 --- a/lib/bitbucket/representation/comment.rb +++ b/lib/bitbucket/representation/comment.rb @@ -4,7 +4,7 @@ module Bitbucket module Representation class Comment < Representation::Base def author - user['username'] + user['nickname'] end def note diff --git a/lib/bitbucket/representation/issue.rb b/lib/bitbucket/representation/issue.rb index a88797cdab9..3f6db9cb75b 100644 --- a/lib/bitbucket/representation/issue.rb +++ b/lib/bitbucket/representation/issue.rb @@ -14,7 +14,7 @@ module Bitbucket end def author - raw.dig('reporter', 'username') + raw.dig('reporter', 'nickname') end def description diff --git a/lib/bitbucket/representation/pull_request.rb b/lib/bitbucket/representation/pull_request.rb index 6a0e8b354bf..a498c9bc213 100644 --- a/lib/bitbucket/representation/pull_request.rb +++ b/lib/bitbucket/representation/pull_request.rb @@ -4,7 +4,7 @@ module Bitbucket module Representation class PullRequest < Representation::Base def author - raw.fetch('author', {}).fetch('username', nil) + raw.fetch('author', {}).fetch('nickname', nil) end def description diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb index 8047ef4fa15..24bc73e0de5 100644 --- a/lib/gitlab/bitbucket_import/importer.rb +++ b/lib/gitlab/bitbucket_import/importer.rb @@ -262,13 +262,19 @@ module Gitlab def pull_request_comment_attributes(comment) { project: project, - note: comment.note, author_id: gitlab_user_id(project, comment.author), + note: comment_note(comment), created_at: comment.created_at, updated_at: comment.updated_at } end + def comment_note(comment) + author = @formatter.author_line(comment.author) unless find_user_id(comment.author) + + author.to_s + comment.note.to_s + end + def log_error(details) logger.error(log_base_data.merge(details)) end diff --git a/spec/lib/bitbucket/representation/comment_spec.rb b/spec/lib/bitbucket/representation/comment_spec.rb index 2dcc933ee61..1874296df8c 100644 --- a/spec/lib/bitbucket/representation/comment_spec.rb +++ b/spec/lib/bitbucket/representation/comment_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' describe Bitbucket::Representation::Comment do describe '#author' do - it { expect(described_class.new('user' => { 'username' => 'Ben' }).author).to eq('Ben') } + it { expect(described_class.new('user' => { 'nickname' => 'Ben' }).author).to eq('Ben') } it { expect(described_class.new({}).author).to be_nil } end diff --git a/spec/lib/bitbucket/representation/issue_spec.rb b/spec/lib/bitbucket/representation/issue_spec.rb index c7d1ebdd597..655b9b78b47 100644 --- a/spec/lib/bitbucket/representation/issue_spec.rb +++ b/spec/lib/bitbucket/representation/issue_spec.rb @@ -17,7 +17,7 @@ describe Bitbucket::Representation::Issue do end describe '#author' do - it { expect(described_class.new({ 'reporter' => { 'username' => 'Ben' } }).author).to eq('Ben') } + it { expect(described_class.new({ 'reporter' => { 'nickname' => 'Ben' } }).author).to eq('Ben') } it { expect(described_class.new({}).author).to be_nil } end diff --git a/spec/lib/bitbucket/representation/pull_request_spec.rb b/spec/lib/bitbucket/representation/pull_request_spec.rb index 7cf43b2b6fd..70b51b8efec 100644 --- a/spec/lib/bitbucket/representation/pull_request_spec.rb +++ b/spec/lib/bitbucket/representation/pull_request_spec.rb @@ -8,7 +8,7 @@ describe Bitbucket::Representation::PullRequest do end describe '#author' do - it { expect(described_class.new({ 'author' => { 'username' => 'Ben' } }).author).to eq('Ben') } + it { expect(described_class.new({ 'author' => { 'nickname' => 'Ben' } }).author).to eq('Ben') } it { expect(described_class.new({}).author).to be_nil } end diff --git a/spec/lib/gitlab/bitbucket_import/importer_spec.rb b/spec/lib/gitlab/bitbucket_import/importer_spec.rb index 280941ff601..3d0d3f91859 100644 --- a/spec/lib/gitlab/bitbucket_import/importer_spec.rb +++ b/spec/lib/gitlab/bitbucket_import/importer_spec.rb @@ -25,12 +25,12 @@ describe Gitlab::BitbucketImport::Importer do let(:reporters) do [ nil, - { "username" => "reporter1" }, + { "nickname" => "reporter1" }, nil, - { "username" => "reporter2" }, - { "username" => "reporter1" }, + { "nickname" => "reporter2" }, + { "nickname" => "reporter1" }, nil, - { "username" => "reporter3" } + { "nickname" => "reporter3" } ] end @@ -115,6 +115,7 @@ describe Gitlab::BitbucketImport::Importer do created_at: Time.now, updated_at: Time.now) end + let(:author_line) { "*Created by: someuser*\n\n" } before do allow(subject).to receive(:import_wiki) @@ -128,7 +129,7 @@ describe Gitlab::BitbucketImport::Importer do old_pos: nil, new_pos: 4, note: 'Hello world', - author: 'root', + author: 'someuser', created_at: Time.now, updated_at: Time.now, inline?: true, @@ -139,7 +140,7 @@ describe Gitlab::BitbucketImport::Importer do iid: 3, file_path: '.gitmodules', note: 'Hello world', - author: 'root', + author: 'someuser', created_at: Time.now, updated_at: Time.now, inline?: true, @@ -163,11 +164,33 @@ describe Gitlab::BitbucketImport::Importer do notes = merge_request.notes.order(:id).to_a start_note = notes.first expect(start_note).to be_a(DiffNote) - expect(start_note.note).to eq(@inline_note.note) + expect(start_note.note).to include(@inline_note.note) + expect(start_note.note).to include(author_line) reply_note = notes.last expect(reply_note).to be_a(DiffNote) - expect(reply_note.note).to eq(@reply.note) + expect(reply_note.note).to include(@reply.note) + expect(reply_note.note).to include(author_line) + end + + context 'when user exists in GitLab' do + let!(:existing_user) { create(:user, username: 'someuser') } + let!(:identity) { create(:identity, provider: 'bitbucket', extern_uid: existing_user.username, user: existing_user) } + + it 'does not add author line to comments' do + expect { subject.execute }.to change { MergeRequest.count }.by(1) + + merge_request = MergeRequest.first + + notes = merge_request.notes.order(:id).to_a + start_note = notes.first + expect(start_note.note).to eq(@inline_note.note) + expect(start_note.note).not_to include(author_line) + + reply_note = notes.last + expect(reply_note.note).to eq(@reply.note) + expect(reply_note.note).not_to include(author_line) + end end context 'when importing a pull request throws an exception' do |