diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-09 09:07:45 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-09 09:07:45 +0000 |
commit | f4186a753b86625a83e8499af14b5badd63a2ac2 (patch) | |
tree | b960dd9f4255e9eee9f87d28e853f163836aa4c5 /app/models/merge_request | |
parent | 0221116862ee66024a03492b4fbbe4e069d84303 (diff) | |
download | gitlab-ce-f4186a753b86625a83e8499af14b5badd63a2ac2.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models/merge_request')
-rw-r--r-- | app/models/merge_request/pipelines.rb | 88 |
1 files changed, 0 insertions, 88 deletions
diff --git a/app/models/merge_request/pipelines.rb b/app/models/merge_request/pipelines.rb deleted file mode 100644 index 72756e8e9d0..00000000000 --- a/app/models/merge_request/pipelines.rb +++ /dev/null @@ -1,88 +0,0 @@ -# frozen_string_literal: true - -# A state object to centralize logic related to merge request pipelines -class MergeRequest::Pipelines - include Gitlab::Utils::StrongMemoize - - EVENT = 'merge_request_event' - - def initialize(merge_request) - @merge_request = merge_request - end - - attr_reader :merge_request - - delegate :commit_shas, :source_project, :source_branch, to: :merge_request - - def all - strong_memoize(:all_pipelines) do - next Ci::Pipeline.none unless source_project - - pipelines = - if merge_request.persisted? - pipelines_using_cte - else - triggered_for_branch.for_sha(commit_shas) - end - - sort(pipelines) - end - end - - private - - def pipelines_using_cte - cte = Gitlab::SQL::CTE.new(:shas, merge_request.all_commits.select(:sha)) - - source_pipelines_join = cte.table[:sha].eq(Ci::Pipeline.arel_table[:source_sha]) - source_pipelines = filter_by(triggered_by_merge_request, cte, source_pipelines_join) - detached_pipelines = filter_by_sha(triggered_by_merge_request, cte) - pipelines_for_branch = filter_by_sha(triggered_for_branch, cte) - - Ci::Pipeline.with(cte.to_arel) - .from_union([source_pipelines, detached_pipelines, pipelines_for_branch]) - end - - def filter_by_sha(pipelines, cte) - hex = Arel::Nodes::SqlLiteral.new("'hex'") - string_sha = Arel::Nodes::NamedFunction.new('encode', [cte.table[:sha], hex]) - join_condition = string_sha.eq(Ci::Pipeline.arel_table[:sha]) - - filter_by(pipelines, cte, join_condition) - end - - def filter_by(pipelines, cte, join_condition) - shas_table = - Ci::Pipeline.arel_table - .join(cte.table, Arel::Nodes::InnerJoin) - .on(join_condition) - .join_sources - - pipelines.joins(shas_table) - end - - # NOTE: this method returns only parent merge request pipelines. - # Child merge request pipelines have a different source. - def triggered_by_merge_request - source_project.ci_pipelines - .where(source: :merge_request_event, merge_request: merge_request) - end - - def triggered_for_branch - source_project.ci_pipelines - .where(source: branch_pipeline_sources, ref: source_branch, tag: false) - end - - def branch_pipeline_sources - strong_memoize(:branch_pipeline_sources) do - Ci::Pipeline.sources.reject { |source| source == EVENT }.values - end - end - - def sort(pipelines) - sql = 'CASE ci_pipelines.source WHEN (?) THEN 0 ELSE 1 END, ci_pipelines.id DESC' - query = ApplicationRecord.send(:sanitize_sql_array, [sql, Ci::Pipeline.sources[:merge_request_event]]) # rubocop:disable GitlabSecurity/PublicSend - - pipelines.order(Arel.sql(query)) - end -end |