lib/release_tools/rollback/presenter.rb (70 lines of code) (raw):
# frozen_string_literal: true
module ReleaseTools
module Rollback
# Presents a Validator instance in GitLab Markdown or Slack format
class Presenter
include ::SemanticLogger::Loggable
LINK_FORMAT = 'https://gitlab.com/gitlab-org/security/gitlab/-/blob/%<commit>s/%<file>s'
# comparison - Rollback::Comparison instance
# deployment - Rollback::UpcomingDeployments instance
# link_style - Either :markdown or :slack. Links will be presented in the requested style.
def initialize(comparison, upcoming_deployment, link_style:)
@comparison = comparison
@upcoming_deployment = upcoming_deployment
@link_style = link_style
end
def header
if safe_to_rollback?
":large_green_circle: Rollback available"
else
":red_circle: Rollback unavailable #{rollback_unavailable_header}"
end
end
def present
lines = [
"*Current:* `#{@comparison.current_auto_deploy_package}`\n",
"*Target:* `#{@comparison.target_auto_deploy_package}`\n"
]
lines << "*Comparison:* #{@comparison.web_url}\n"
lines << "*Comparison for each component:*\n"
component_diffs.each do |diff|
lines << "#{bullet} #{diff}\n"
end
lines
end
def unavailable_rollback_multireason?
rollback_unavailable_reasons.size > 1
end
def rollback_unavailable_reasons_block
rollback_unavailable_reasons.join("\n")
end
private
def blob_url(file)
format(LINK_FORMAT, commit: @comparison.current_rails_sha, file: file)
end
def safe_to_rollback?
@comparison.safe? && !deployment_in_progress?
end
def deployment_in_progress?
@upcoming_deployment.any?
end
def rollback_unavailable_header
return unless rollback_unavailable_reasons.size == 1
rollback_unavailable_reasons.first
end
def rollback_unavailable_reasons
@rollback_unavailable_reasons ||= [].tap do |reasons|
reasons << "- A deployment is in progress" if deployment_in_progress?
reasons << "- Post-deployment migrations were executed after the target version on #{@comparison.minimum_version}" unless @comparison.safe?
end
end
def bullet
if @link_style == :markdown
'-'
else
'•'
end
end
def component_diffs
Metadata::Presenter
.new(@comparison.metadata_comparison, link_style: @link_style)
.component_diffs
end
end
end
end