Welcome to mirror list, hosted at ThFree Co, Russian Federation.

pipelines.rb « merge_request « models « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: cba38f781a65f0429e24d34e9e88404647eff45a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 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 :all_commit_shas, :source_project, :source_branch, to: :merge_request

  def all
    return Ci::Pipeline.none unless source_project

    strong_memoize(:all_pipelines) do
      pipelines = Ci::Pipeline.from_union(
        [source_pipelines, detached_pipelines, triggered_for_branch],
      remove_duplicates: false)

      sort(pipelines)
    end
  end

  private

  def triggered_by_merge_request
    source_project.ci_pipelines
      .where(source: :merge_request_event, merge_request: merge_request)
  end

  def detached_pipelines
    triggered_by_merge_request.for_sha(all_commit_shas)
  end

  def source_pipelines
    triggered_by_merge_request.for_source_sha(all_commit_shas)
  end

  def triggered_for_branch
    source_project.ci_pipelines
      .where(source: branch_pipeline_sources, ref: source_branch, tag: false)
      .for_sha(all_commit_shas)
  end

  def sources
    ::Ci::Pipeline.sources
  end

  def branch_pipeline_sources
    strong_memoize(:branch_pipeline_sources) do
      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, sources[:merge_request_event]]) # rubocop:disable GitlabSecurity/PublicSend

    pipelines.order(Arel.sql(query))
  end
end