Don't show 'Copy content' button on text files that are not rendered as text

This commit is contained in:
Douwe Maan 2017-04-10 21:23:19 +00:00 committed by Robert Speicher
parent 520ed0781c
commit fb8a12c8fe
10 changed files with 63 additions and 45 deletions

View file

@ -118,6 +118,10 @@ module BlobHelper
blob && blob.text? && !blob.lfs_pointer? && !blob.only_display_raw?
end
def blob_rendered_as_text?(blob)
blob_text_viewable?(blob) && blob.to_partial_path(@project) == 'text'
end
def blob_size(blob)
if blob.lfs_pointer?
blob.lfs_size

View file

@ -42,12 +42,16 @@ class Blob < SimpleDelegator
size && truncated?
end
def extension
extname.downcase.delete('.')
end
def svg?
text? && language && language.name == 'SVG'
end
def pdf?
name && File.extname(name) == '.pdf'
extension == 'pdf'
end
def ipython_notebook?
@ -55,11 +59,15 @@ class Blob < SimpleDelegator
end
def sketch?
binary? && extname.downcase.delete('.') == 'sketch'
binary? && extension == 'sketch'
end
def stl?
extname.downcase.delete('.') == 'stl'
extension == 'stl'
end
def markup?
text? && Gitlab::MarkupHelper.markup?(name)
end
def size_within_svg_limits?
@ -77,8 +85,10 @@ class Blob < SimpleDelegator
else
'text'
end
elsif image? || svg?
elsif image?
'image'
elsif svg?
'svg'
elsif pdf?
'pdf'
elsif ipython_notebook?
@ -87,8 +97,18 @@ class Blob < SimpleDelegator
'sketch'
elsif stl?
'stl'
elsif markup?
if only_display_raw?
'too_large'
else
'markup'
end
elsif text?
if only_display_raw?
'too_large'
else
'text'
end
else
'download'
end

View file

@ -32,4 +32,10 @@
= link_to 'Fork', fork_path, method: :post, class: 'btn btn-grouped btn-inverted btn-new'
%button.js-cancel-fork-suggestion.btn.btn-grouped{ type: 'button' }
Cancel
- if blob.empty?
.file-content.code
.nothing-here-block
Empty file
- else
= render blob.to_partial_path(@project), blob: blob

View file

@ -13,7 +13,7 @@
.file-actions.hidden-xs
.btn-group{ role: "group" }<
= copy_blob_content_button(blob) if !blame && blob_text_viewable?(blob)
= copy_blob_content_button(blob) if !blame && blob_rendered_as_text?(blob)
= open_raw_file_button(namespace_project_raw_path(@project.namespace, @project, @id))
= view_on_environment_button(@commit.sha, @path, @environment) if @environment

View file

@ -1,15 +1,2 @@
.file-content.image_file
- if blob.svg?
- if blob.size_within_svg_limits?
-# We need to scrub SVG but we cannot do so in the RawController: it would
-# be wrong/strange if RawController modified the data.
- blob.load_all_data!(@repository)
- blob = sanitize_svg(blob)
%img{ src: "data:#{blob.mime_type};base64,#{Base64.encode64(blob.data)}", alt: "#{blob.name}" }
- else
.nothing-here-block
The SVG could not be displayed as it is too large, you can
#{link_to('view the raw file', namespace_project_raw_path(@project.namespace, @project, @id), target: '_blank', rel: 'noopener noreferrer')}
instead.
- else
%img{ src: namespace_project_raw_path(@project.namespace, @project, tree_join(@commit.id, blob.path)), alt: "#{blob.name}" }
%img{ src: namespace_project_raw_path(@project.namespace, @project, @id), alt: blob.name }

View file

@ -0,0 +1,4 @@
- blob.load_all_data!(@repository)
.file-content.wiki
= render_markup(blob.name, blob.data)

View file

@ -0,0 +1,9 @@
- if blob.size_within_svg_limits?
-# We need to scrub SVG but we cannot do so in the RawController: it would
-# be wrong/strange if RawController modified the data.
- blob.load_all_data!(@repository)
- blob = sanitize_svg(blob)
.file-content.image_file
%img{ src: "data:#{blob.mime_type};base64,#{Base64.encode64(blob.data)}", alt: blob.name }
- else
= render 'too_large'

View file

@ -1,19 +1,2 @@
- if blob.only_display_raw?
.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', rel: 'noopener noreferrer'
- else
- blob.load_all_data!(@repository)
- if blob.empty?
.file-content.code
.nothing-here-block Empty file
- else
- if markup?(blob.name)
.file-content.wiki
= render_markup(blob.name, blob.data)
- else
= render 'shared/file_highlight', blob: blob, repository: @repository
- blob.load_all_data!(@repository)
= render 'shared/file_highlight', blob: blob, repository: @repository

View file

@ -0,0 +1,5 @@
.file-content.code
.nothing-here-block
The file could not be displayed as it is too large, you can
#{link_to('view the raw file', namespace_project_raw_path(@project.namespace, @project, @id), target: '_blank', rel: 'noopener noreferrer')}
instead.

View file

@ -55,13 +55,13 @@ describe Blob do
describe '#pdf?' do
it 'is falsey when file extension is not .pdf' do
git_blob = double(name: 'git_blob.txt')
git_blob = Gitlab::Git::Blob.new(name: 'git_blob.txt')
expect(described_class.decorate(git_blob)).not_to be_pdf
end
it 'is truthy when file extension is .pdf' do
git_blob = double(name: 'git_blob.pdf')
git_blob = Gitlab::Git::Blob.new(name: 'git_blob.pdf')
expect(described_class.decorate(git_blob)).to be_pdf
end
@ -140,7 +140,7 @@ describe Blob do
stl?: false
)
described_class.decorate(double).tap do |blob|
described_class.decorate(Gitlab::Git::Blob.new({})).tap do |blob|
allow(blob).to receive_messages(overrides)
end
end
@ -158,7 +158,7 @@ describe Blob do
it 'handles SVGs' do
blob = stubbed_blob(text?: true, svg?: true)
expect(blob.to_partial_path(project)).to eq 'image'
expect(blob.to_partial_path(project)).to eq 'svg'
end
it 'handles images' do
@ -167,7 +167,7 @@ describe Blob do
end
it 'handles text' do
blob = stubbed_blob(text?: true)
blob = stubbed_blob(text?: true, name: 'test.txt')
expect(blob.to_partial_path(project)).to eq 'text'
end