Commit fb8a12c8 authored by Douwe Maan's avatar Douwe Maan Committed by Robert Speicher

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

parent 520ed078
...@@ -118,6 +118,10 @@ module BlobHelper ...@@ -118,6 +118,10 @@ module BlobHelper
blob && blob.text? && !blob.lfs_pointer? && !blob.only_display_raw? blob && blob.text? && !blob.lfs_pointer? && !blob.only_display_raw?
end end
def blob_rendered_as_text?(blob)
blob_text_viewable?(blob) && blob.to_partial_path(@project) == 'text'
end
def blob_size(blob) def blob_size(blob)
if blob.lfs_pointer? if blob.lfs_pointer?
blob.lfs_size blob.lfs_size
......
...@@ -42,12 +42,16 @@ class Blob < SimpleDelegator ...@@ -42,12 +42,16 @@ class Blob < SimpleDelegator
size && truncated? size && truncated?
end end
def extension
extname.downcase.delete('.')
end
def svg? def svg?
text? && language && language.name == 'SVG' text? && language && language.name == 'SVG'
end end
def pdf? def pdf?
name && File.extname(name) == '.pdf' extension == 'pdf'
end end
def ipython_notebook? def ipython_notebook?
...@@ -55,11 +59,15 @@ class Blob < SimpleDelegator ...@@ -55,11 +59,15 @@ class Blob < SimpleDelegator
end end
def sketch? def sketch?
binary? && extname.downcase.delete('.') == 'sketch' binary? && extension == 'sketch'
end end
def stl? def stl?
extname.downcase.delete('.') == 'stl' extension == 'stl'
end
def markup?
text? && Gitlab::MarkupHelper.markup?(name)
end end
def size_within_svg_limits? def size_within_svg_limits?
...@@ -77,8 +85,10 @@ class Blob < SimpleDelegator ...@@ -77,8 +85,10 @@ class Blob < SimpleDelegator
else else
'text' 'text'
end end
elsif image? || svg? elsif image?
'image' 'image'
elsif svg?
'svg'
elsif pdf? elsif pdf?
'pdf' 'pdf'
elsif ipython_notebook? elsif ipython_notebook?
...@@ -87,8 +97,18 @@ class Blob < SimpleDelegator ...@@ -87,8 +97,18 @@ class Blob < SimpleDelegator
'sketch' 'sketch'
elsif stl? elsif stl?
'stl' 'stl'
elsif markup?
if only_display_raw?
'too_large'
else
'markup'
end
elsif text? elsif text?
if only_display_raw?
'too_large'
else
'text' 'text'
end
else else
'download' 'download'
end end
......
...@@ -32,4 +32,10 @@ ...@@ -32,4 +32,10 @@
= link_to 'Fork', fork_path, method: :post, class: 'btn btn-grouped btn-inverted btn-new' = 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' } %button.js-cancel-fork-suggestion.btn.btn-grouped{ type: 'button' }
Cancel Cancel
- if blob.empty?
.file-content.code
.nothing-here-block
Empty file
- else
= render blob.to_partial_path(@project), blob: blob = render blob.to_partial_path(@project), blob: blob
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
.file-actions.hidden-xs .file-actions.hidden-xs
.btn-group{ role: "group" }< .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)) = open_raw_file_button(namespace_project_raw_path(@project.namespace, @project, @id))
= view_on_environment_button(@commit.sha, @path, @environment) if @environment = view_on_environment_button(@commit.sha, @path, @environment) if @environment
......
.file-content.image_file .file-content.image_file
- if blob.svg? %img{ src: namespace_project_raw_path(@project.namespace, @project, @id), alt: blob.name }
- 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}" }
- blob.load_all_data!(@repository)
.file-content.wiki
= render_markup(blob.name, blob.data)
- 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'
- if blob.only_display_raw? - blob.load_all_data!(@repository)
.file-content.code = render 'shared/file_highlight', blob: blob, repository: @repository
.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
.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.
...@@ -55,13 +55,13 @@ describe Blob do ...@@ -55,13 +55,13 @@ describe Blob do
describe '#pdf?' do describe '#pdf?' do
it 'is falsey when file extension is not .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 expect(described_class.decorate(git_blob)).not_to be_pdf
end end
it 'is truthy when file extension is .pdf' do 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 expect(described_class.decorate(git_blob)).to be_pdf
end end
...@@ -140,7 +140,7 @@ describe Blob do ...@@ -140,7 +140,7 @@ describe Blob do
stl?: false 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) allow(blob).to receive_messages(overrides)
end end
end end
...@@ -158,7 +158,7 @@ describe Blob do ...@@ -158,7 +158,7 @@ describe Blob do
it 'handles SVGs' do it 'handles SVGs' do
blob = stubbed_blob(text?: true, svg?: true) 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 end
it 'handles images' do it 'handles images' do
...@@ -167,7 +167,7 @@ describe Blob do ...@@ -167,7 +167,7 @@ describe Blob do
end end
it 'handles text' do 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' expect(blob.to_partial_path(project)).to eq 'text'
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