From 3d2c198c0f889e73ae2a16a068c41948b40cefff Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 8 May 2016 08:02:23 +0000 Subject: [PATCH] Add view for "no preview" repository files (#22482). Patch by Gregor Schmidt. git-svn-id: http://svn.redmine.org/redmine/trunk@15397 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/repositories_controller.rb | 28 ++++++++++--------- app/views/common/_other.html.erb | 1 + app/views/repositories/entry.html.erb | 4 ++- config/locales/de.yml | 1 + config/locales/en-GB.yml | 1 + config/locales/en.yml | 1 + ...repositories_filesystem_controller_test.rb | 5 ++-- ...repositories_subversion_controller_test.rb | 6 ++-- 8 files changed, 28 insertions(+), 19 deletions(-) create mode 100644 app/views/common/_other.html.erb diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 8f34c0034..9c39ad075 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -168,24 +168,26 @@ class RepositoriesController < ApplicationController # If the entry is a dir, show the browser (show; return) if @entry.is_dir? - @content = @repository.cat(@path, @rev) - (show_error_not_found; return) unless @content - if !is_raw && Redmine::MimeType.is_type?('image', @path) - # simply render - elsif is_raw || - (@content.size && @content.size > Setting.file_max_size_displayed.to_i.kilobyte) || - ! is_entry_text_data?(@content, @path) + if is_raw # Force the download send_opt = { :filename => filename_for_content_disposition(@path.split('/').last) } send_type = Redmine::MimeType.of(@path) send_opt[:type] = send_type.to_s if send_type - send_opt[:disposition] = (Redmine::MimeType.is_type?('image', @path) && !is_raw ? 'inline' : 'attachment') - send_data @content, send_opt + send_opt[:disposition] = (Redmine::MimeType.is_type?('image', @path) ? 'inline' : 'attachment') + send_data @repository.cat(@path, @rev), send_opt else - # Prevent empty lines when displaying a file with Windows style eol - # TODO: UTF-16 - # Is this needs? AttachmentsController reads file simply. - @content.gsub!("\r\n", "\n") + if !@entry.size || @entry.size <= Setting.file_max_size_displayed.to_i.kilobyte + content = @repository.cat(@path, @rev) + (show_error_not_found; return) unless content + + if content.size <= Setting.file_max_size_displayed.to_i.kilobyte && + is_entry_text_data?(content, @path) + # TODO: UTF-16 + # Prevent empty lines when displaying a file with Windows style eol + # Is this needed? AttachmentsController simply reads file. + @content = content.gsub("\r\n", "\n") + end + end @changeset = @repository.find_changeset_by_name(@rev) end end diff --git a/app/views/common/_other.html.erb b/app/views/common/_other.html.erb new file mode 100644 index 000000000..fe0228a50 --- /dev/null +++ b/app/views/common/_other.html.erb @@ -0,0 +1 @@ +

<%= l(:label_no_preview) %>

diff --git a/app/views/repositories/entry.html.erb b/app/views/repositories/entry.html.erb index d9b5be9ab..37a5db961 100644 --- a/app/views/repositories/entry.html.erb +++ b/app/views/repositories/entry.html.erb @@ -10,8 +10,10 @@ <% if Redmine::MimeType.is_type?('image', @path) %> <%= render :partial => 'common/image', :locals => {:path => url_for(params.merge(:action => 'raw')), :alt => @path} %> -<% else %> +<% elsif @content %> <%= render :partial => 'common/file', :locals => {:filename => @path, :content => @content} %> +<% else %> + <%= render :partial => 'common/other' %> <% end %> <% content_for :header_tags do %> diff --git a/config/locales/de.yml b/config/locales/de.yml index 3cac093f3..6b248c786 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -655,6 +655,7 @@ de: label_next: Weiter label_no_change_option: (Keine Änderung) label_no_data: Nichts anzuzeigen + label_no_preview: Keine Vorschau verfügbar label_no_issues_in_project: keine Tickets im Projekt label_nobody: Niemand label_none: kein diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 4953f027f..3241d6154 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -531,6 +531,7 @@ en-GB: label_attribute: Attribute label_attribute_plural: Attributes label_no_data: No data to display + label_no_preview: No preview available label_change_status: Change status label_history: History label_attachment: File diff --git a/config/locales/en.yml b/config/locales/en.yml index 947b2c9b0..f7c696dca 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -617,6 +617,7 @@ en: label_attribute: Attribute label_attribute_plural: Attributes label_no_data: No data to display + label_no_preview: No preview available label_change_status: Change status label_history: History label_attachment: File diff --git a/test/functional/repositories_filesystem_controller_test.rb b/test/functional/repositories_filesystem_controller_test.rb index 6d872cdf0..87c6cd266 100644 --- a/test/functional/repositories_filesystem_controller_test.rb +++ b/test/functional/repositories_filesystem_controller_test.rb @@ -107,12 +107,13 @@ class RepositoriesFilesystemControllerTest < ActionController::TestCase end end - def test_show_text_file_should_send_if_too_big + def test_show_text_file_should_show_other_if_too_big with_settings :file_max_size_displayed => 1 do get :entry, :id => PRJ_ID, :path => repository_path_hash(['japanese', 'big-file.txt'])[:param] assert_response :success - assert_equal 'text/plain', @response.content_type + assert_equal 'text/html', @response.content_type + assert_select 'p.nodata' end end diff --git a/test/functional/repositories_subversion_controller_test.rb b/test/functional/repositories_subversion_controller_test.rb index 41ea3ed37..9eef38e3e 100644 --- a/test/functional/repositories_subversion_controller_test.rb +++ b/test/functional/repositories_subversion_controller_test.rb @@ -168,7 +168,7 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase assert_template 'entry' end - def test_entry_should_send_if_too_big + def test_entry_should_show_other_if_too_big assert_equal 0, @repository.changesets.count @repository.fetch_changesets @project.reload @@ -178,8 +178,8 @@ class RepositoriesSubversionControllerTest < ActionController::TestCase get :entry, :id => PRJ_ID, :path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param] assert_response :success - assert_equal 'attachment; filename="helloworld.c"', - @response.headers['Content-Disposition'] + assert_equal 'text/html', @response.content_type + assert_select 'p.nodata' end end -- 2.39.5