summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLin Jen-Shin <godfat@godfat.org>2016-10-14 19:13:11 +0800
committerLin Jen-Shin <godfat@godfat.org>2016-10-14 19:13:11 +0800
commitb5f9d4c4bc48b252d3175432a3bb6fb1ca394af9 (patch)
tree45c5305aaf0baf3b36c9692d8e37cba1011935b1
parent5b9971fa9b967eb5591242155d6f5fce2c292b7d (diff)
downloadgitlab-ce-b5f9d4c4bc48b252d3175432a3bb6fb1ca394af9.tar.gz
Introduce Pipeline#merge_requests_with_active_first,
Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/6019#note_16956802
-rw-r--r--app/mailers/emails/pipelines.rb5
-rw-r--r--app/models/ci/pipeline.rb12
-rw-r--r--app/models/merge_request.rb4
-rw-r--r--spec/models/ci/pipeline_spec.rb31
-rw-r--r--spec/models/merge_request_spec.rb10
5 files changed, 53 insertions, 9 deletions
diff --git a/app/mailers/emails/pipelines.rb b/app/mailers/emails/pipelines.rb
index 903d123705a..92f1431ce66 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 2cf9892edc5..bf2d861b86f 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 a743bf313ae..852317bbed1 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 550a890797e..2a0b00dc545 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 38b6da50168..8cf53fd1dee 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}"