diff options
author | Patrick Bajao <ebajao@gitlab.com> | 2019-09-02 11:19:32 +0800 |
---|---|---|
committer | Patrick Bajao <ebajao@gitlab.com> | 2019-09-02 11:44:45 +0800 |
commit | bf230da05d8a3a6feeeb80d81fa0370cc295478e (patch) | |
tree | caefbfda883d3360cb2aea07a5ea925447e39a5b | |
parent | 60adc14473911fd9bd33feef2fbfd62a9824a11c (diff) | |
download | gitlab-ce-bf230da05d8a3a6feeeb80d81fa0370cc295478e.tar.gz |
Support selective highlighting of lines65152-unfolded-lines-perf-improvement
Instead of highlighting all lines when not all of them
are needed, only highlight from the beginning up to
the specified limit.
The `BlobPresenter#highlight` method has been updated
to support `to` param. This param will be used to limit
the content to be highlighted.
-rw-r--r-- | app/presenters/blob_presenter.rb | 18 | ||||
-rw-r--r-- | app/presenters/blobs/unfold_presenter.rb | 8 | ||||
-rw-r--r-- | changelogs/unreleased/65152-unfolded-lines-perf-improvement.yml | 5 | ||||
-rw-r--r-- | spec/presenters/blob_presenter_spec.rb | 14 |
4 files changed, 38 insertions, 7 deletions
diff --git a/app/presenters/blob_presenter.rb b/app/presenters/blob_presenter.rb index 2cf3278d240..3a71d2b87f3 100644 --- a/app/presenters/blob_presenter.rb +++ b/app/presenters/blob_presenter.rb @@ -3,12 +3,12 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated presents :blob - def highlight(plain: nil) + def highlight(to: nil, plain: nil) load_all_blob_data Gitlab::Highlight.highlight( blob.path, - blob.data, + limited_blob_data(to: to), language: blob.language_from_gitattributes, plain: plain ) @@ -23,4 +23,18 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated def load_all_blob_data blob.load_all_data! if blob.respond_to?(:load_all_data!) end + + def limited_blob_data(to: nil) + return blob.data if to.blank? + + # Even though we don't need all the lines at the start of the file (e.g + # viewing the middle part of a file), they still need to be highlighted + # to ensure that the succeeding lines can be formatted correctly (e.g. + # multi-line comments). + all_lines[0..to - 1].join + end + + def all_lines + @all_lines ||= blob.data.lines + end end diff --git a/app/presenters/blobs/unfold_presenter.rb b/app/presenters/blobs/unfold_presenter.rb index a256dd05a4d..487c6fe0757 100644 --- a/app/presenters/blobs/unfold_presenter.rb +++ b/app/presenters/blobs/unfold_presenter.rb @@ -26,8 +26,6 @@ module Blobs # so we can accurately show the rest of the diff when unfolding. load_all_blob_data - @all_lines = blob.data.lines - handle_full_or_end! end @@ -46,7 +44,7 @@ module Blobs def lines strong_memoize(:lines) do - limit(highlight.lines).map(&:html_safe) + limit(highlight(to: to).lines).map(&:html_safe) end end @@ -76,7 +74,7 @@ module Blobs def all_lines_size strong_memoize(:all_lines_size) do - @all_lines.size + all_lines.size end end @@ -101,7 +99,7 @@ module Blobs def limited_blob_lines strong_memoize(:limited_blob_lines) do - limit(@all_lines) + limit(all_lines) end end diff --git a/changelogs/unreleased/65152-unfolded-lines-perf-improvement.yml b/changelogs/unreleased/65152-unfolded-lines-perf-improvement.yml new file mode 100644 index 00000000000..835ed037b83 --- /dev/null +++ b/changelogs/unreleased/65152-unfolded-lines-perf-improvement.yml @@ -0,0 +1,5 @@ +--- +title: Support selective highlighting of lines +merge_request: 32514 +author: +type: performance diff --git a/spec/presenters/blob_presenter_spec.rb b/spec/presenters/blob_presenter_spec.rb index eacf383be7d..8680e8b9b45 100644 --- a/spec/presenters/blob_presenter_spec.rb +++ b/spec/presenters/blob_presenter_spec.rb @@ -39,6 +39,20 @@ describe BlobPresenter, :seed_helper do subject.highlight(plain: true) end + context '"to" param is present' do + before do + allow(git_blob) + .to receive(:data) + .and_return("line one\nline two\nline 3") + end + + it 'returns limited highlighted content' do + expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', "line one\n", plain: nil, language: nil) + + subject.highlight(to: 1) + end + end + context 'gitlab-language contains a match' do before do allow(blob).to receive(:language_from_gitattributes).and_return('ruby') |