diff --git a/lib/bitbucket/representation/pull_request.rb b/lib/bitbucket/representation/pull_request.rb index 978e34e9183b51f1e645335fae1c0d4a09b00979..2fdfab7f9c62799f57ffa36ad83b3e77eef634ca 100644 --- a/lib/bitbucket/representation/pull_request.rb +++ b/lib/bitbucket/representation/pull_request.rb @@ -82,7 +82,8 @@ def to_hash target_branch_name: target_branch_name, target_branch_sha: target_branch_sha, source_and_target_project_different: source_and_target_project_different, - reviewers: reviewers + reviewers: reviewers, + closed_by: closed_by } end @@ -107,6 +108,10 @@ def target_repo_uuid def source_and_target_project_different source_repo_uuid != target_repo_uuid end + + def closed_by + raw['closed_by']&.dig('uuid') + end end end end diff --git a/lib/gitlab/bitbucket_import/importers/pull_request_importer.rb b/lib/gitlab/bitbucket_import/importers/pull_request_importer.rb index 1d9d2a031e5eae81ae44638690b42dc7daf2f141..3651c1080d3902926217ba5de3681273d3e79c93 100644 --- a/lib/gitlab/bitbucket_import/importers/pull_request_importer.rb +++ b/lib/gitlab/bitbucket_import/importers/pull_request_importer.rb @@ -45,6 +45,8 @@ def execute merge_request.reviewer_ids = reviewers merge_request.save! + create_merge_request_metrics(merge_request) + metrics.merge_requests_counter.increment end @@ -85,7 +87,26 @@ def find_user_id end def author_id - user_finder.gitlab_user_id(project, object[:author]) + @author_id ||= user_finder.gitlab_user_id(project, object[:author]) + end + + def create_merge_request_metrics(merge_request) + return if object[:closed_by].nil? + + case object[:state] + when 'merged' + merge_request.metrics.merged_by_id = closed_by_id + when 'closed' + merge_request.metrics.latest_closed_by_id = closed_by_id + else + return + end + + merge_request.metrics.save! + end + + def closed_by_id + user_finder.gitlab_user_id(project, object[:closed_by]) end def reviewers diff --git a/spec/lib/bitbucket/representation/pull_request_spec.rb b/spec/lib/bitbucket/representation/pull_request_spec.rb index 7050d1858dd21bb1027f8e4dca9f6730eda71fad..a3a675dec5123e8ccc6176880a506adc907fe765 100644 --- a/spec/lib/bitbucket/representation/pull_request_spec.rb +++ b/spec/lib/bitbucket/representation/pull_request_spec.rb @@ -108,6 +108,7 @@ source_branch_sha: 'source-commit-hash', merge_commit_sha: 'merge-commit-hash', state: 'merged', + closed_by: nil, target_branch_name: 'destination-branch-name', target_branch_sha: 'destination-commit-hash', title: 'title', diff --git a/spec/lib/gitlab/bitbucket_import/importers/pull_request_importer_spec.rb b/spec/lib/gitlab/bitbucket_import/importers/pull_request_importer_spec.rb index f888f8dba8aaf7bb084b81f0f4e80bb23819609a..ca0a310f20367a143d45ad9eb853ace072f4b8b7 100644 --- a/spec/lib/gitlab/bitbucket_import/importers/pull_request_importer_spec.rb +++ b/spec/lib/gitlab/bitbucket_import/importers/pull_request_importer_spec.rb @@ -9,8 +9,10 @@ let_it_be(:bitbucket_user) { create(:user) } let_it_be(:user_2) { create(:user) } let_it_be(:user_3) { create(:user) } + let_it_be(:closed_by_user) { create(:user) } let_it_be(:identity) { create(:identity, user: bitbucket_user, extern_uid: '{123}', provider: :bitbucket) } let_it_be(:identity_2) { create(:identity, user: user_2, extern_uid: 'user_2', provider: :bitbucket) } + let_it_be(:closed_by_identity) { create(:identity, user: closed_by_user, extern_uid: '{345}', provider: :bitbucket) } let(:mentions_converter) { Gitlab::Import::MentionsConverter.new('bitbucket', project) } let(:source_branch_sha) { project.repository.commit.sha } let(:target_branch_sha) { project.repository.commit('refs/heads/master').sha } @@ -29,7 +31,8 @@ target_branch_sha: target_branch_sha, title: 'title', updated_at: Date.today, - reviewers: %w[user_2 user_3] + reviewers: %w[user_2 user_3], + closed_by: '{345}' } end @@ -65,6 +68,8 @@ expect(merge_request.reviewer_ids).to eq([user_2.id]) expect(merge_request.merge_request_diffs.first.base_commit_sha).to eq(source_branch_sha) expect(merge_request.merge_request_diffs.first.head_commit_sha).to eq(target_branch_sha) + expect(merge_request.metrics.merged_by_id).to eq(closed_by_user.id) + expect(merge_request.metrics.latest_closed_by_id).to be_nil end it 'converts mentions in the description' do @@ -78,6 +83,8 @@ described_class.new(project, hash.merge(state: 'closed')).execute expect(project.merge_requests.first.closed?).to be_truthy + expect(project.merge_requests.first.metrics.latest_closed_by_id).to eq(closed_by_user.id) + expect(project.merge_requests.first.metrics.merged_by_id).to be_nil end end @@ -86,6 +93,8 @@ described_class.new(project, hash.merge(state: 'opened')).execute expect(project.merge_requests.first.opened?).to be_truthy + expect(project.merge_requests.first.metrics.latest_closed_by_id).to be_nil + expect(project.merge_requests.first.metrics.merged_by_id).to be_nil end end @@ -131,6 +140,30 @@ end end + context 'when closed by user cannot be found' do + before do + User.find(closed_by_user.id).destroy! + end + + it 'sets the merged by user to the project creator' do + importer.execute + + expect(project.merge_requests.first.metrics.merged_by_id).to eq(project.creator_id) + expect(project.merge_requests.first.metrics.latest_closed_by_id).to be_nil + end + + context 'when merge state is closed' do + let(:hash) { super().merge(state: 'closed') } + + it 'sets the closed by user to the project creator' do + importer.execute + + expect(project.merge_requests.first.metrics.latest_closed_by_id).to eq(project.creator_id) + expect(project.merge_requests.first.metrics.merged_by_id).to be_nil + end + end + end + describe 'head_commit_sha for merge request diff' do let(:diff) { project.merge_requests.first.merge_request_diffs.first } let(:min_length) { Commit::MIN_SHA_LENGTH }