summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancisco Javier López <fjlopez@gitlab.com>2018-11-22 19:24:45 +0100
committerFrancisco Javier López <fjlopez@gitlab.com>2018-12-05 15:58:17 +0100
commita5b24f8ea03aa7bd492094d75a6a1a990abd6d36 (patch)
tree311824d35126e58efd95387b3cb9a33842cb9f0d
parent9816bb05a3d226dadbc4ed8f1d559f046879612b (diff)
downloadgitlab-ce-fj-54225-create-pipelines-finder-in-MR.tar.gz
Create MergeRequestPipelinesFinderfj-54225-create-pipelines-finder-in-MR
-rw-r--r--app/finders/merge_request_pipelines_finder.rb57
-rw-r--r--app/models/merge_request.rb5
-rw-r--r--spec/finders/merge_request_pipelines_finder_spec.rb29
3 files changed, 87 insertions, 4 deletions
diff --git a/app/finders/merge_request_pipelines_finder.rb b/app/finders/merge_request_pipelines_finder.rb
new file mode 100644
index 00000000000..40ff32a2d7f
--- /dev/null
+++ b/app/finders/merge_request_pipelines_finder.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+class MergeRequestPipelinesFinder
+ attr_reader :merge_request, :pipelines, :params
+
+ ALLOWED_INDEXED_COLUMNS = %w[id status ref user_id].freeze
+
+ def initialize(merge_request, params = {})
+ @merge_request = merge_request
+ @pipelines = merge_request&.source_project&.pipelines
+ @params = params
+ end
+
+ def execute
+ return Ci::Pipeline.none if pipelines.nil?
+
+ items = with_source_branch_ref(pipelines)
+ items = by_sha(items)
+ sort_items(items)
+ end
+
+ private
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def by_sha(items)
+ if params[:sha].present?
+ items.where(sha: params[:sha])
+ else
+ items
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def with_source_branch_ref(items)
+ items.where(ref: merge_request.source_branch)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def sort_items(items)
+ order_by = if ALLOWED_INDEXED_COLUMNS.include?(params[:order_by])
+ params[:order_by]
+ else
+ :id
+ end
+
+ sort = if params[:sort] =~ /\A(ASC|DESC)\z/i
+ params[:sort]
+ else
+ :desc
+ end
+
+ items.order(order_by => sort)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 6b05ee06199..6f5327b1362 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -1056,10 +1056,7 @@ class MergeRequest < ActiveRecord::Base
def all_pipelines(shas: all_commit_shas)
return Ci::Pipeline.none unless source_project
- @all_pipelines ||= source_project.pipelines
- .where(sha: shas, ref: source_branch)
- .where(merge_request: [nil, self])
- .sort_by_merge_request_pipelines
+ @all_pipelines ||= MergeRequestPipelinesFinder.new(self, sha: all_commit_shas).execute.sort_by_merge_request_pipelines
end
def merge_request_pipeline_exists?
diff --git a/spec/finders/merge_request_pipelines_finder_spec.rb b/spec/finders/merge_request_pipelines_finder_spec.rb
new file mode 100644
index 00000000000..a67effcda4a
--- /dev/null
+++ b/spec/finders/merge_request_pipelines_finder_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe MergeRequestPipelinesFinder do
+ let(:merge_request) { create(:merge_request, :conflict) }
+
+ before do
+ create_list(:ci_pipeline, 2, :auto_devops_source, project: merge_request.source_project, sha: merge_request.diff_head_sha, ref: merge_request.source_branch)
+ create(:ci_pipeline, :repository_source, project: merge_request.source_project, sha: merge_request.all_commit_shas.last, ref: merge_request.source_branch)
+ create_list(:ci_pipeline, 2, project: merge_request.source_project, sha: merge_request.diff_head_sha)
+ end
+
+ describe "#execute" do
+ it 'filters by sha' do
+ params = { sha: merge_request.diff_head_sha }
+
+ pipelines = described_class.new(merge_request, params).execute
+
+ expect(pipelines.size).to eq(2)
+ end
+
+ it 'with source_branch ref as the pipeline ref by default' do
+ pipelines = described_class.new(merge_request).execute
+
+ expect(pipelines.size).to eq(3)
+ end
+ end
+end