Commit 10f84f99 authored by Robert Speicher's avatar Robert Speicher

Merge branch 'zj-large-files-no-highlight' into 'master'

Properly handle bigger files

Closes #3967

See merge request !3718
parents 73990df3 ad99404d
...@@ -11,6 +11,7 @@ v 8.8.0 (unreleased) ...@@ -11,6 +11,7 @@ v 8.8.0 (unreleased)
- Allow "NEWS" and "CHANGES" as alternative names for CHANGELOG. !3768 (Connor Shea) - Allow "NEWS" and "CHANGES" as alternative names for CHANGELOG. !3768 (Connor Shea)
- Added button to toggle whitespaces changes on diff view - Added button to toggle whitespaces changes on diff view
- Backport GitLab Enterprise support from EE - Backport GitLab Enterprise support from EE
- Files over 5MB can only be viewed in their raw form, files over 1MB without highlighting !3718
v 8.7.1 (unreleased) v 8.7.1 (unreleased)
- Throttle the update of `project.last_activity_at` to 1 minute. !3848 - Throttle the update of `project.last_activity_at` to 1 minute. !3848
......
...@@ -3,8 +3,8 @@ module BlobHelper ...@@ -3,8 +3,8 @@ module BlobHelper
Gitlab::Highlight.new(blob_name, blob_content, nowrap: nowrap) Gitlab::Highlight.new(blob_name, blob_content, nowrap: nowrap)
end end
def highlight(blob_name, blob_content, nowrap: false) def highlight(blob_name, blob_content, nowrap: false, plain: false)
Gitlab::Highlight.highlight(blob_name, blob_content, nowrap: nowrap) Gitlab::Highlight.highlight(blob_name, blob_content, nowrap: nowrap, plain: plain)
end end
def no_highlight_files def no_highlight_files
......
...@@ -19,6 +19,14 @@ class Blob < SimpleDelegator ...@@ -19,6 +19,14 @@ class Blob < SimpleDelegator
new(blob) new(blob)
end end
def no_highlighting?
size && size > 1.megabyte
end
def only_display_raw?
size && size > 5.megabytes
end
def svg? def svg?
text? && language && language.name == 'SVG' text? && language && language.name == 'SVG'
end end
......
...@@ -112,6 +112,10 @@ class Snippet < ActiveRecord::Base ...@@ -112,6 +112,10 @@ class Snippet < ActiveRecord::Base
visibility_level visibility_level
end end
def no_highlighting?
content.lines.count > 1000
end
class << self class << self
# Searches for snippets with a matching title or file name. # Searches for snippets with a matching title or file name.
# #
......
- blob.load_all_data!(@repository) - if blob.only_display_raw?
- if markup?(blob.name) .file-content.code
.nothing-here-block
File too large, you can
= succeed '.' do
= link_to 'view the raw file', namespace_project_raw_path(@project.namespace, @project, @id), target: '_blank'
- else
- blob.load_all_data!(@repository)
- if markup?(blob.name)
.file-content.wiki .file-content.wiki
= render_markup(blob.name, blob.data) = render_markup(blob.name, blob.data)
- else
- unless blob.empty?
= render 'shared/file_highlight', blob: blob
- else - else
- if blob.empty?
.file-content.code .file-content.code
.nothing-here-block Empty file .nothing-here-block Empty file
- else
= render 'shared/file_highlight', blob: blob
.file-content.code.js-syntax-highlight .file-content.code.js-syntax-highlight
.line-numbers .line-numbers
- if blob.data.present? - if blob.data.present?
- link_icon = icon('link')
- blob.data.each_line.each_with_index do |_, index| - blob.data.each_line.each_with_index do |_, index|
- offset = defined?(first_line_number) ? first_line_number : 1 - offset = defined?(first_line_number) ? first_line_number : 1
- i = index + offset - i = index + offset
-# We're not using `link_to` because it is too slow once we get to thousands of lines. -# We're not using `link_to` because it is too slow once we get to thousands of lines.
%a.diff-line-num{href: "#L#{i}", id: "L#{i}", 'data-line-number' => i} %a.diff-line-num{href: "#L#{i}", id: "L#{i}", 'data-line-number' => i}
%i.fa.fa-link = link_icon
= i = i
.blob-content{data: {blob_id: blob.id}} .blob-content{data: {blob_id: blob.id}}
= highlight(blob.name, blob.data) = highlight(blob.name, blob.data, plain: blob.no_highlighting?)
module Gitlab module Gitlab
class Highlight class Highlight
def self.highlight(blob_name, blob_content, nowrap: true) def self.highlight(blob_name, blob_content, nowrap: true, plain: false)
new(blob_name, blob_content, nowrap: nowrap).highlight(blob_content, continue: false) new(blob_name, blob_content, nowrap: nowrap).
highlight(blob_content, continue: false, plain: plain)
end end
def self.highlight_lines(repository, ref, file_name) def self.highlight_lines(repository, ref, file_name)
...@@ -17,8 +18,12 @@ module Gitlab ...@@ -17,8 +18,12 @@ module Gitlab
@lexer = Rouge::Lexer.guess(filename: blob_name, source: blob_content).new rescue Rouge::Lexers::PlainText @lexer = Rouge::Lexer.guess(filename: blob_name, source: blob_content).new rescue Rouge::Lexers::PlainText
end end
def highlight(text, continue: true) def highlight(text, continue: true, plain: false)
if plain
@formatter.format(Rouge::Lexers::PlainText.lex(text)).html_safe
else
@formatter.format(@lexer.lex(text, continue: continue)).html_safe @formatter.format(@lexer.lex(text, continue: continue)).html_safe
end
rescue rescue
@formatter.format(Rouge::Lexers::PlainText.lex(text)).html_safe @formatter.format(Rouge::Lexers::PlainText.lex(text)).html_safe
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment