Commit b5f9d4c4 authored by Lin Jen-Shin's avatar Lin Jen-Shin

Introduce Pipeline#merge_requests_with_active_first,

Feedback:
https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/6019#note_16956802
parent 5b9971fa
......@@ -13,10 +13,7 @@ module Emails
def pipeline_mail(pipeline, to, status)
@project = pipeline.project
@pipeline = pipeline
@merge_request = @project.merge_requests.opened.
find_by(source_project: @project,
source_branch: @pipeline.ref,
target_branch: @project.default_branch)
@merge_request = pipeline.merge_requests_with_active_first.first
add_headers
mail(to: to, subject: pipeline_subject(status), skip_premailer: true) do |format|
......
......@@ -293,10 +293,14 @@ module Ci
# the merge request's latest commit.
def merge_requests
@merge_requests ||=
begin
project.merge_requests.where(source_branch: self.ref).
select { |merge_request| merge_request.pipeline.try(:id) == self.id }
end
project.merge_requests.where(source_branch: ref).
select { |merge_request| merge_request.pipeline.try(:id) == id }
end
def merge_requests_with_active_first
merge_requests.sort_by do |merge_request|
[merge_request.state_priority, -merge_request.updated_at.to_i]
end
end
private
......
......@@ -169,6 +169,10 @@ class MergeRequest < ActiveRecord::Base
work_in_progress?(title) ? title : "WIP: #{title}"
end
def state_priority
%w[opened reopened closed merged locked].index(state)
end
def to_reference(from_project = nil)
reference = "#{self.class.reference_prefix}#{iid}"
......
......@@ -523,4 +523,35 @@ describe Ci::Pipeline, models: true do
expect(pipeline.merge_requests).to be_empty
end
end
describe '#merge_requests_with_active_first' do
let(:project) { create(:project) }
let(:pipeline) do
create(:ci_empty_pipeline,
status: 'created',
project: project,
ref: 'master',
sha: project.repository.commit('master').sha)
end
let!(:merge_requests) do
[create_merge_request(:merged, Time.at(0)),
create_merge_request(:merged, Time.at(9)),
create_merge_request(:opened, Time.at(0))]
end
it 'returns opened/recent merge requests first, then closed ones' do
expect(pipeline.merge_requests_with_active_first).
to eq(merge_requests.reverse)
end
def create_merge_request(state, updated_at)
create(:merge_request,
source_project: project,
source_branch: pipeline.ref,
state: state,
updated_at: updated_at)
end
end
end
......@@ -58,6 +58,14 @@ describe MergeRequest, models: true do
it { is_expected.to respond_to(:merge_when_build_succeeds) }
end
describe '#state_priority' do
it 'returns the priority of state' do
%w[opened reopened closed merged locked].each.with_index do |state, idx|
expect(MergeRequest.new(state: state).state_priority).to eq(idx)
end
end
end
describe '.in_projects' do
it 'returns the merge requests for a set of projects' do
expect(described_class.in_projects(Project.all)).to eq([subject])
......@@ -334,7 +342,7 @@ describe MergeRequest, models: true do
wip_title = "WIP: #{subject.title}"
expect(subject.wip_title).to eq wip_title
end
end
it "does not add the WIP: prefix multiple times" do
wip_title = "WIP: #{subject.title}"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment