debian-mirror-gitlab/app/presenters/blobs/unfold_presenter.rb

115 lines
2.7 KiB
Ruby
Raw Normal View History

2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
module Blobs
class UnfoldPresenter < BlobPresenter
2019-12-04 20:38:33 +05:30
include ActiveModel::Attributes
include ActiveModel::AttributeAssignment
2019-07-07 11:18:12 +05:30
include Gitlab::Utils::StrongMemoize
2021-11-18 22:05:49 +05:30
presents ::Blob
2019-12-04 20:38:33 +05:30
attribute :full, :boolean, default: false
attribute :since, :integer, default: 1
attribute :to, :integer, default: 1
attribute :bottom, :boolean, default: false
attribute :unfold, :boolean, default: true
attribute :offset, :integer, default: 0
attribute :indent, :integer, default: 0
alias_method :full?, :full
alias_method :bottom?, :bottom
alias_method :unfold?, :unfold
2019-07-07 11:18:12 +05:30
def initialize(blob, params)
2019-12-04 20:38:33 +05:30
super(blob)
self.attributes = params
2019-10-12 21:52:04 +05:30
# Load all blob data first as we need to ensure they're all loaded first
# so we can accurately show the rest of the diff when unfolding.
load_all_blob_data
2019-12-04 20:38:33 +05:30
handle_full_or_end!
2019-07-07 11:18:12 +05:30
end
2019-10-12 21:52:04 +05:30
# Returns an array of Gitlab::Diff::Line with match line added
2019-07-07 11:18:12 +05:30
def diff_lines
2019-10-12 21:52:04 +05:30
diff_lines = lines.map.with_index do |line, index|
full_line = limited_blob_lines[index].delete("\n")
Gitlab::Diff::Line.new(full_line, nil, nil, nil, nil, rich_text: line)
2019-07-07 11:18:12 +05:30
end
add_match_line(diff_lines)
diff_lines
end
def lines
strong_memoize(:lines) do
2019-12-04 20:38:33 +05:30
limit(highlight(to: to).lines).map(&:html_safe)
2019-07-07 11:18:12 +05:30
end
end
def match_line_text
return '' if bottom?
lines_length = lines.length - 1
line = [since, lines_length].join(',')
"@@ -#{line}+#{line} @@"
end
private
2019-12-04 20:38:33 +05:30
def handle_full_or_end!
return unless full? || to == -1
2019-10-12 21:52:04 +05:30
2019-12-04 20:38:33 +05:30
self.since = 1 if full?
self.attributes = {
2019-10-12 21:52:04 +05:30
to: all_lines_size,
bottom: false,
unfold: false,
offset: 0,
indent: 0
}
end
def all_lines_size
strong_memoize(:all_lines_size) do
2019-12-04 20:38:33 +05:30
all_lines.size
2019-10-12 21:52:04 +05:30
end
end
2019-07-07 11:18:12 +05:30
def add_match_line(diff_lines)
return unless unfold?
2019-10-12 21:52:04 +05:30
return if bottom? && to >= all_lines_size
2019-07-07 11:18:12 +05:30
2019-10-12 21:52:04 +05:30
if bottom? && to < all_lines_size
2019-07-07 11:18:12 +05:30
old_pos = to - offset
new_pos = to
elsif since != 1
old_pos = new_pos = since
end
# Match line is not needed when it reaches the top limit or bottom limit of the file.
return unless new_pos
match_line = Gitlab::Diff::Line.new(match_line_text, 'match', nil, old_pos, new_pos)
bottom? ? diff_lines.push(match_line) : diff_lines.unshift(match_line)
end
2019-10-12 21:52:04 +05:30
def limited_blob_lines
strong_memoize(:limited_blob_lines) do
2019-12-04 20:38:33 +05:30
limit(all_lines)
2019-10-12 21:52:04 +05:30
end
end
def limit(lines)
return lines if full?
2022-04-04 11:22:00 +05:30
lines[since - 1..to - 1] || []
2019-10-12 21:52:04 +05:30
end
2019-07-07 11:18:12 +05:30
end
end