2018-07-24 10:00:56 +00:00
# frozen_string_literal: true
2017-03-20 22:05:52 +00:00
module Ci
2017-03-28 17:47:11 +00:00
class PipelinePresenter < Gitlab :: View :: Presenter :: Delegated
2018-04-21 22:30:37 +00:00
include Gitlab :: Utils :: StrongMemoize
2019-03-06 08:34:38 +00:00
include ActionView :: Helpers :: UrlHelper
2018-04-21 22:30:37 +00:00
2018-11-13 16:29:14 +00:00
# We use a class method here instead of a constant, allowing EE to redefine
# the returned `Hash` more easily.
def self . failure_reasons
{ config_error : 'CI/CD YAML configuration error!' }
end
2017-10-03 11:18:59 +00:00
presents :pipeline
2017-09-29 09:14:00 +00:00
2018-04-21 22:30:37 +00:00
def failed_builds
return [ ] unless can? ( current_user , :read_build , pipeline )
strong_memoize ( :failed_builds ) do
pipeline . builds . latest . failed
end
end
2017-09-29 09:14:00 +00:00
def failure_reason
return unless pipeline . failure_reason?
2018-11-13 16:29:14 +00:00
self . class . failure_reasons [ pipeline . failure_reason . to_sym ] ||
2017-09-29 09:14:00 +00:00
pipeline . failure_reason
end
2017-03-20 22:05:52 +00:00
def status_title
2017-04-06 13:32:56 +00:00
if auto_canceled?
" Pipeline is redundant and is auto-canceled by Pipeline # #{ auto_canceled_by_id } "
end
2017-03-20 22:05:52 +00:00
end
2019-03-06 08:34:38 +00:00
2019-08-28 07:51:26 +00:00
NAMES = {
merge_train : s_ ( 'Pipeline|Merge train pipeline' ) ,
merged_result : s_ ( 'Pipeline|Merged result pipeline' ) ,
detached : s_ ( 'Pipeline|Detached merge request pipeline' )
} . freeze
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.
NAMES . fetch ( pipeline . merge_request_event_type , s_ ( 'Pipeline|Pipeline' ) )
end
2019-03-06 08:34:38 +00:00
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
if pipeline . ref_exists?
_ ( " for %{link_to_pipeline_ref} " ) . html_safe % { link_to_pipeline_ref : link_to_pipeline_ref }
else
2019-05-28 10:02:06 +00:00
_ ( " for %{ref} " ) . html_safe % { ref : content_tag ( :span , pipeline . ref , class : 'ref-name' ) }
2019-03-06 08:34:38 +00:00
end
end
end
def link_to_pipeline_ref
link_to ( pipeline . ref ,
project_commits_path ( pipeline . project , pipeline . ref ) ,
class : " ref-name " )
end
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
def link_to_merge_request_source_branch
2019-04-29 07:29:54 +00:00
merge_request_presenter & . source_branch_link
2019-03-06 08:34:38 +00:00
end
def link_to_merge_request_target_branch
2019-04-29 07:29:54 +00:00
merge_request_presenter & . target_branch_link
2019-03-06 08:34:38 +00:00
end
private
def merge_request_presenter
return unless pipeline . triggered_by_merge_request?
@merge_request_presenter || = pipeline . merge_request . present ( current_user : current_user )
end
2017-03-20 22:05:52 +00:00
end
end