Add committers and authors methods on MergeRequest
These are used by the EE-only approvers feature
This commit is contained in:
parent
cfa7108210
commit
a2842241d4
|
@ -19,6 +19,12 @@ class CommitCollection
|
||||||
commits.each(&block)
|
commits.each(&block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def committers
|
||||||
|
emails = commits.reject(&:merge_commit?).map(&:committer_email).uniq
|
||||||
|
|
||||||
|
User.by_any_email(emails)
|
||||||
|
end
|
||||||
|
|
||||||
# Sets the pipeline status for every commit.
|
# Sets the pipeline status for every commit.
|
||||||
#
|
#
|
||||||
# Setting this status ahead of time removes the need for running a query for
|
# Setting this status ahead of time removes the need for running a query for
|
||||||
|
|
|
@ -284,6 +284,14 @@ class MergeRequest < ActiveRecord::Base
|
||||||
work_in_progress?(title) ? title : "WIP: #{title}"
|
work_in_progress?(title) ? title : "WIP: #{title}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def committers
|
||||||
|
@committers ||= commits.committers
|
||||||
|
end
|
||||||
|
|
||||||
|
def authors
|
||||||
|
User.from_union([committers, User.where(id: self.author_id)])
|
||||||
|
end
|
||||||
|
|
||||||
# Verifies if title has changed not taking into account WIP prefix
|
# Verifies if title has changed not taking into account WIP prefix
|
||||||
# for merge requests.
|
# for merge requests.
|
||||||
def wipless_title_changed(old_title)
|
def wipless_title_changed(old_title)
|
||||||
|
@ -327,13 +335,15 @@ class MergeRequest < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def commits
|
def commits
|
||||||
if persisted?
|
return merge_request_diff.commits if persisted?
|
||||||
merge_request_diff.commits
|
|
||||||
elsif compare_commits
|
commits_arr = if compare_commits
|
||||||
compare_commits.reverse
|
compare_commits.reverse
|
||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
CommitCollection.new(source_project, commits_arr, source_branch)
|
||||||
end
|
end
|
||||||
|
|
||||||
def commits_count
|
def commits_count
|
||||||
|
|
|
@ -71,7 +71,7 @@ describe Projects::MergeRequests::CreationsController do
|
||||||
expect(response).to be_success
|
expect(response).to be_success
|
||||||
|
|
||||||
total = assigns(:total_commit_count)
|
total = assigns(:total_commit_count)
|
||||||
expect(assigns(:commits)).to be_an Array
|
expect(assigns(:commits)).to be_an CommitCollection
|
||||||
expect(total).to be > 0
|
expect(total).to be > 0
|
||||||
expect(assigns(:hidden_commit_count)).to eq(0)
|
expect(assigns(:hidden_commit_count)).to eq(0)
|
||||||
expect(response).to have_gitlab_http_status(200)
|
expect(response).to have_gitlab_http_status(200)
|
||||||
|
|
|
@ -2,7 +2,7 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe CommitCollection do
|
describe CommitCollection do
|
||||||
let(:project) { create(:project, :repository) }
|
let(:project) { create(:project, :repository) }
|
||||||
let(:commit) { project.commit }
|
let(:commit) { project.commit("c1c67abbaf91f624347bb3ae96eabe3a1b742478") }
|
||||||
|
|
||||||
describe '#each' do
|
describe '#each' do
|
||||||
it 'yields every commit' do
|
it 'yields every commit' do
|
||||||
|
@ -12,6 +12,29 @@ describe CommitCollection do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '.committers' do
|
||||||
|
it 'returns a relation of users when users are found' do
|
||||||
|
user = create(:user, email: commit.committer_email.upcase)
|
||||||
|
collection = described_class.new(project, [commit])
|
||||||
|
|
||||||
|
expect(collection.committers).to contain_exactly(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns empty array when committers cannot be found' do
|
||||||
|
collection = described_class.new(project, [commit])
|
||||||
|
|
||||||
|
expect(collection.committers).to be_empty
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'excludes authors of merge commits' do
|
||||||
|
commit = project.commit("60ecb67744cb56576c30214ff52294f8ce2def98")
|
||||||
|
create(:user, email: commit.committer_email.upcase)
|
||||||
|
collection = described_class.new(project, [commit])
|
||||||
|
|
||||||
|
expect(collection.committers).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#with_pipeline_status' do
|
describe '#with_pipeline_status' do
|
||||||
it 'sets the pipeline status for every commit so no additional queries are necessary' do
|
it 'sets the pipeline status for every commit so no additional queries are necessary' do
|
||||||
create(
|
create(
|
||||||
|
|
|
@ -991,6 +991,34 @@ describe MergeRequest do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#committers' do
|
||||||
|
it 'returns all the committers of every commit in the merge request' do
|
||||||
|
users = subject.commits.map(&:committer_email).uniq.map do |email|
|
||||||
|
create(:user, email: email)
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(subject.committers).to match_array(users)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns an empty array if no committer is associated with a user' do
|
||||||
|
expect(subject.committers).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#authors' do
|
||||||
|
it 'returns a list with all the committers in the merge request and author' do
|
||||||
|
users = subject.commits.map(&:committer_email).uniq.map do |email|
|
||||||
|
create(:user, email: email)
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(subject.authors).to match_array([subject.author, *users])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns only the author if no committer is associated with a user' do
|
||||||
|
expect(subject.authors).to contain_exactly(subject.author)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#hook_attrs' do
|
describe '#hook_attrs' do
|
||||||
it 'delegates to Gitlab::HookData::MergeRequestBuilder#build' do
|
it 'delegates to Gitlab::HookData::MergeRequestBuilder#build' do
|
||||||
builder = double
|
builder = double
|
||||||
|
|
|
@ -509,7 +509,7 @@ describe MergeRequests::RefreshService do
|
||||||
committed_date: Time.now
|
committed_date: Time.now
|
||||||
)
|
)
|
||||||
|
|
||||||
allow_any_instance_of(MergeRequest).to receive(:commits).and_return([commit])
|
allow_any_instance_of(MergeRequest).to receive(:commits).and_return(CommitCollection.new(@project, [commit], 'feature'))
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the merge request is sourced from the same project' do
|
context 'when the merge request is sourced from the same project' do
|
||||||
|
|
Loading…
Reference in New Issue