diff options
author | Francisco Javier López <fjlopez@gitlab.com> | 2018-11-22 19:24:45 +0100 |
---|---|---|
committer | Francisco Javier López <fjlopez@gitlab.com> | 2018-12-05 15:58:17 +0100 |
commit | a5b24f8ea03aa7bd492094d75a6a1a990abd6d36 (patch) | |
tree | 311824d35126e58efd95387b3cb9a33842cb9f0d | |
parent | 9816bb05a3d226dadbc4ed8f1d559f046879612b (diff) | |
download | gitlab-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.rb | 57 | ||||
-rw-r--r-- | app/models/merge_request.rb | 5 | ||||
-rw-r--r-- | spec/finders/merge_request_pipelines_finder_spec.rb | 29 |
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 |