diff --git a/app/mailers/emails/pipelines.rb b/app/mailers/emails/pipelines.rb index 903d123705a794d5bf6f19c35dcf9d785c298fd4..92f1431ce66a7a0724fe99281b8f39cc8410988d 100644 --- a/app/mailers/emails/pipelines.rb +++ b/app/mailers/emails/pipelines.rb @@ -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| diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 2cf9892edc56d09098ff4d5f0dcc8a60368a369a..bf2d861b86f4c41ad0c5eb84adfb1cd0a9acd26e 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -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 diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index a743bf313ae98293a546412995a73e1351ae00f4..852317bbed1c2aa1211325890d566d16d7559d98 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -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}" diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 550a890797e5bda8dba9723ee0f5a3b936bdaf3a..2a0b00dc545f9a60d5bb5deb14a4284457c3a18b 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -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 diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 38b6da501680dbf0807dd02d22c4f459293a2aa5..8cf53fd1dee948a68266613d37a9d0548c1b8a26 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -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}"