diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index e2cdd17b8..3e8ac3e3d 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -117,8 +117,8 @@ class RepositoriesController < ApplicationController @content = @repository.cat(@path, @rev) show_error_not_found and return unless @content - if 'raw' == params[:format] || @content.is_binary_data? - # Force the download if it's a binary file + if 'raw' == params[:format] || @content.is_binary_data? || (@entry.size && @entry.size > Setting.file_max_size_displayed.to_i.kilobyte) + # Force the download send_data @content, :filename => @path.split('/').last else # Prevent empty lines when displaying a file with Windows style eol diff --git a/test/functional/repositories_subversion_controller_test.rb b/test/functional/repositories_subversion_controller_test.rb index a3918a922..c2bb40367 100644 --- a/test/functional/repositories_subversion_controller_test.rb +++ b/test/functional/repositories_subversion_controller_test.rb @@ -94,6 +94,16 @@ class RepositoriesSubversionControllerTest < Test::Unit::TestCase assert_response :success assert_template 'entry' end + + def test_entry_should_send_if_too_big + # no files in the test repo is larger than 1KB... + with_settings :file_max_size_displayed => 0 do + get :entry, :id => 1, :path => ['subversion_test', 'helloworld.c'] + assert_response :success + assert_template '' + assert_equal 'attachment; filename="helloworld.c"', @response.headers['Content-Disposition'] + end + end def test_entry_at_given_revision get :entry, :id => 1, :path => ['subversion_test', 'helloworld.rb'], :rev => 2 @@ -113,6 +123,8 @@ class RepositoriesSubversionControllerTest < Test::Unit::TestCase def test_entry_download get :entry, :id => 1, :path => ['subversion_test', 'helloworld.c'], :format => 'raw' assert_response :success + assert_template '' + assert_equal 'attachment; filename="helloworld.c"', @response.headers['Content-Disposition'] end def test_directory_entry diff --git a/test/test_helper.rb b/test/test_helper.rb index 7d817fb19..88117e540 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -64,4 +64,11 @@ class Test::Unit::TestCase Dir.mkdir "#{RAILS_ROOT}/tmp/test/attachments" unless File.directory?("#{RAILS_ROOT}/tmp/test/attachments") Attachment.storage_path = "#{RAILS_ROOT}/tmp/test/attachments" end + + def with_settings(options, &block) + saved_settings = options.keys.inject({}) {|h, k| h[k] = Setting[k].dup; h} + options.each {|k, v| Setting[k] = v} + yield + saved_settings.each {|k, v| Setting[k] = v} + end end