Class: Ci::PipelinePresenter

Inherits:
Gitlab::View::Presenter::Delegated show all
Includes:
ActionView::Helpers::UrlHelper, Gitlab::Utils::StrongMemoize
Defined in:
app/presenters/ci/pipeline_presenter.rb

Instance Attribute Summary

Attributes included from Gitlab::View::Presenter::Base

#subject

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Gitlab::Utils::StrongMemoize

#clear_memoization, #strong_memoize, #strong_memoized?

Methods inherited from Gitlab::View::Presenter::Delegated

#initialize

Methods included from Gitlab::View::Presenter::Base

#can?, #declarative_policy_delegate, #is_a?, #present, #url_builder, #web_path, #web_url

Methods included from Gitlab::Allowable

#can?

Methods included from Gitlab::Routing

add_helpers, includes_helpers, redirect_legacy_paths, url_helpers

Constructor Details

This class inherits a constructor from Gitlab::View::Presenter::Delegated

Class Method Details

.failure_reasonsObject

We use a class method here instead of a constant, allowing EE to redefine the returned `Hash` more easily.


10
11
12
13
14
# File 'app/presenters/ci/pipeline_presenter.rb', line 10

def self.failure_reasons
  { unknown_failure: 'Unknown pipeline failure!',
    config_error: 'CI/CD YAML configuration error!',
    external_validation_failure: 'External pipeline validation failed!' }
end

Instance Method Details


75
76
77
78
79
80
81
82
83
84
85
# File 'app/presenters/ci/pipeline_presenter.rb', line 75

def all_related_merge_request_text(limit: nil)
  if all_related_merge_requests.none?
    _("No related merge requests found.")
  else
    _("%{count} related %{pluralized_subject}: %{links}" % {
      count: all_related_merge_requests.count,
      pluralized_subject: n_('merge request', 'merge requests', all_related_merge_requests.count),
      links: all_related_merge_request_links(limit: limit).join(', ')
    }).html_safe
  end
end

#downloadable_path_for_report_type(file_type) ⇒ Object


113
114
115
116
117
118
119
120
121
122
# File 'app/presenters/ci/pipeline_presenter.rb', line 113

def downloadable_path_for_report_type(file_type)
  if (job_artifact = batch_lookup_report_artifact_for_file_type(file_type)) &&
      can?(current_user, :read_build, job_artifact.job)
    download_project_job_artifacts_path(
      job_artifact.project,
      job_artifact.job,
      file_type: file_type,
      proxy: true)
  end
end

#failed_buildsObject


18
19
20
21
22
23
24
# File 'app/presenters/ci/pipeline_presenter.rb', line 18

def failed_builds
  return [] unless can?(current_user, :read_build, pipeline)

  strong_memoize(:failed_builds) do
    pipeline.builds.latest.failed
  end
end

#failure_reasonObject


26
27
28
29
30
31
# File 'app/presenters/ci/pipeline_presenter.rb', line 26

def failure_reason
  return unless pipeline.failure_reason?

  self.class.failure_reasons[pipeline.failure_reason.to_sym] ||
    pipeline.failure_reason
end

#has_many_merge_requests?Boolean

Returns:

  • (Boolean)

87
88
89
# File 'app/presenters/ci/pipeline_presenter.rb', line 87

def has_many_merge_requests?
  all_related_merge_requests.count > 1
end

97
98
99
100
101
102
103
# File 'app/presenters/ci/pipeline_presenter.rb', line 97

def link_to_merge_request
  return unless merge_request_presenter

  link_to(merge_request_presenter.to_reference,
    project_merge_request_path(merge_request_presenter.project, merge_request_presenter),
    class: 'mr-iid')
end

105
106
107
# File 'app/presenters/ci/pipeline_presenter.rb', line 105

def link_to_merge_request_source_branch
  merge_request_presenter&.source_branch_link
end

109
110
111
# File 'app/presenters/ci/pipeline_presenter.rb', line 109

def link_to_merge_request_target_branch
  merge_request_presenter&.target_branch_link
end

91
92
93
94
95
# File 'app/presenters/ci/pipeline_presenter.rb', line 91

def link_to_pipeline_ref
  link_to(pipeline.ref,
    project_commits_path(pipeline.project, pipeline.ref),
    class: "ref-name")
end

#localized_namesObject


39
40
41
42
43
44
45
# File 'app/presenters/ci/pipeline_presenter.rb', line 39

def localized_names
  {
    merge_train: s_('Pipeline|Merge train pipeline'),
    merged_result: s_('Pipeline|Merged result pipeline'),
    detached: s_('Pipeline|Detached merge request pipeline')
  }.freeze
end

#nameObject


47
48
49
50
51
# File 'app/presenters/ci/pipeline_presenter.rb', line 47

def name
  # Currently, `merge_request_event_type` is the only source to name pipelines
  # but this could be extended with the other types in the future.
  localized_names.fetch(pipeline.merge_request_event_type, s_('Pipeline|Pipeline'))
end

#ref_textObject


53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/presenters/ci/pipeline_presenter.rb', line 53

def ref_text
  if pipeline.detached_merge_request_pipeline?
    _("for %{link_to_merge_request} with %{link_to_merge_request_source_branch}")
      .html_safe % {
        link_to_merge_request: link_to_merge_request,
        link_to_merge_request_source_branch: link_to_merge_request_source_branch
      }
  elsif pipeline.merge_request_pipeline?
    _("for %{link_to_merge_request} with %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}")
      .html_safe % {
        link_to_merge_request: link_to_merge_request,
        link_to_merge_request_source_branch: link_to_merge_request_source_branch,
        link_to_merge_request_target_branch: link_to_merge_request_target_branch
      }
  elsif pipeline.ref && pipeline.ref_exists?
    _("for %{link_to_pipeline_ref}")
    .html_safe % { link_to_pipeline_ref: link_to_pipeline_ref }
  elsif pipeline.ref
    _("for %{ref}").html_safe % { ref: plain_ref_name }
  end
end

#status_titleObject


33
34
35
36
37
# File 'app/presenters/ci/pipeline_presenter.rb', line 33

def status_title
  if auto_canceled?
    "Pipeline is redundant and is auto-canceled by Pipeline ##{auto_canceled_by_id}"
  end
end