読者です 読者をやめる 読者になる 読者になる

レポジトリビューアで「見る」とダウンロードになる

Redmine

Redmineレポジトリビューアで、日本語が含まれているテキストファイルを「見る」とダウンロードになってしまいます。

どうやら、非ASCII文字が30%以上あるとバイナリとみなしてしまうようです。

次のように修正したらちゃんと表示されました。

--- repositories_controller.rb.orig	2010-04-17 21:51:46.000000000 +0900
+++ repositories_controller.rb	2010-09-15 06:48:44.000000000 +0900
@@ -18,6 +18,7 @@
 require 'SVG/Graph/Bar'
 require 'SVG/Graph/BarHorizontal'
 require 'digest/sha1'
+require 'iconv'
 
 class ChangesetNotFound < Exception; end
 class InvalidRevisionParam < Exception; end
@@ -121,7 +122,7 @@
 
     @content = @repository.cat(@path, @rev)
     (show_error_not_found; return) unless @content
-    if 'raw' == params[:format] || @content.is_binary_data? || (@entry.size && @entry.size > Setting.file_max_size_displayed.to_i.kilobyte)
+    if 'raw' == params[:format] || is_binary?(@content) || (@entry.size && @entry.size > Setting.file_max_size_displayed.to_i.kilobyte)
       # Force the download
       send_data @content, :filename => @path.split('/').last
     else
@@ -303,6 +304,16 @@
     graph.burn
   end
 
+  def is_binary?(data)
+    return true if data =~ /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/n
+    begin
+      Iconv.iconv('utf-8', 'utf-8', data)
+      return false
+    rescue
+      return true
+    end
+  end
+
 end
   
 class Date

[追記] 2011-08-25

Redmine 1.2 では mime-type が text/* であればダウンロードされずにちゃんと見れるようになったみたいです。

デフォルトで登録されてない拡張子は lib/redmine/mime_type.rb の MIME_TYPES に追記すればよさそうです。

    MIME_TYPES = {
      ....
      'text/x-markdown' => 'md,markdown',
      ....