Commit d72f8db08a46cd03879035932ece2b4295bb3948
Exists in
master
and in
4 other branches
Merge branch 'fix_encoding' of https://github.com/brodock/gitlabhq into brodock-fix_encoding
Conflicts: lib/gitlab/encode.rb
Showing
5 changed files
with
29 additions
and
13 deletions
Show diff stats
app/controllers/refs_controller.rb
| 1 | class RefsController < ApplicationController | 1 | class RefsController < ApplicationController |
| 2 | + include Gitlabhq::Encode | ||
| 2 | before_filter :project | 3 | before_filter :project |
| 3 | 4 | ||
| 4 | # Authorize | 5 | # Authorize |
| @@ -43,23 +44,26 @@ class RefsController < ApplicationController | @@ -43,23 +44,26 @@ class RefsController < ApplicationController | ||
| 43 | no_cache_headers | 44 | no_cache_headers |
| 44 | end | 45 | end |
| 45 | end | 46 | end |
| 46 | - rescue | ||
| 47 | - return render_404 | ||
| 48 | end | 47 | end |
| 49 | 48 | ||
| 50 | def blob | 49 | def blob |
| 51 | if @tree.is_blob? | 50 | if @tree.is_blob? |
| 51 | + if @tree.text? | ||
| 52 | + encoding = detect_encoding(@tree.data) | ||
| 53 | + mime_type = encoding ? "text/plain; charset=#{encoding}" : "text/plain" | ||
| 54 | + else | ||
| 55 | + mime_type = @tree.mime_type | ||
| 56 | + end | ||
| 57 | + | ||
| 52 | send_data( | 58 | send_data( |
| 53 | @tree.data, | 59 | @tree.data, |
| 54 | - :type => @tree.text? ? "text/plain" : @tree.mime_type, | 60 | + :type => mime_type, |
| 55 | :disposition => 'inline', | 61 | :disposition => 'inline', |
| 56 | :filename => @tree.name | 62 | :filename => @tree.name |
| 57 | ) | 63 | ) |
| 58 | else | 64 | else |
| 59 | head(404) | 65 | head(404) |
| 60 | end | 66 | end |
| 61 | - rescue | ||
| 62 | - return render_404 | ||
| 63 | end | 67 | end |
| 64 | 68 | ||
| 65 | def blame | 69 | def blame |
app/views/commits/_commit.html.haml
| @@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
| 8 | %strong.cgray= commit.author_name | 8 | %strong.cgray= commit.author_name |
| 9 | – | 9 | – |
| 10 | = image_tag gravatar_icon(commit.author_email), :class => "avatar", :width => 16 | 10 | = image_tag gravatar_icon(commit.author_email), :class => "avatar", :width => 16 |
| 11 | - %span.row_title= truncate(commit.safe_message, :length => 50) rescue "--broken encoding" | 11 | + %span.row_title= truncate(commit.safe_message, :length => 50) |
| 12 | 12 | ||
| 13 | %span.right.cgray | 13 | %span.right.cgray |
| 14 | = time_ago_in_words(commit.committed_date) | 14 | = time_ago_in_words(commit.committed_date) |
app/views/refs/_tree.html.haml
| @@ -42,9 +42,9 @@ | @@ -42,9 +42,9 @@ | ||
| 42 | .readme | 42 | .readme |
| 43 | - if content.name =~ /\.(md|markdown)$/i | 43 | - if content.name =~ /\.(md|markdown)$/i |
| 44 | = preserve do | 44 | = preserve do |
| 45 | - = markdown(content.data.force_encoding('UTF-8')) | 45 | + = markdown(content.data.detect_encoding!) |
| 46 | - else | 46 | - else |
| 47 | - = simple_format(content.data.force_encoding('UTF-8')) | 47 | + = simple_format(content.data.detect_encoding!) |
| 48 | 48 | ||
| 49 | - if params[:path] | 49 | - if params[:path] |
| 50 | - history_path = tree_file_project_ref_path(@project, @ref, params[:path]) | 50 | - history_path = tree_file_project_ref_path(@project, @ref, params[:path]) |
app/views/refs/_tree_file.html.haml
| @@ -13,7 +13,7 @@ | @@ -13,7 +13,7 @@ | ||
| 13 | #tree-readme-holder | 13 | #tree-readme-holder |
| 14 | .readme | 14 | .readme |
| 15 | = preserve do | 15 | = preserve do |
| 16 | - = markdown(file.data.force_encoding('UTF-8')) | 16 | + = markdown(file.data.detect_encoding!) |
| 17 | - else | 17 | - else |
| 18 | .view_file_content | 18 | .view_file_content |
| 19 | - unless file.empty? | 19 | - unless file.empty? |
lib/gitlab/encode.rb
| 1 | +# Patch Strings to enable detect_encoding! on views | ||
| 2 | +require 'charlock_holmes/string' | ||
| 1 | module Gitlab | 3 | module Gitlab |
| 2 | module Encode | 4 | module Encode |
| 3 | extend self | 5 | extend self |
| @@ -5,16 +7,26 @@ module Gitlab | @@ -5,16 +7,26 @@ module Gitlab | ||
| 5 | def utf8 message | 7 | def utf8 message |
| 6 | return nil unless message | 8 | return nil unless message |
| 7 | 9 | ||
| 8 | - hash = CharlockHolmes::EncodingDetector.detect(message) rescue {} | ||
| 9 | - if hash[:encoding] | ||
| 10 | - CharlockHolmes::Converter.convert(message, hash[:encoding], 'UTF-8') | 10 | + detect = CharlockHolmes::EncodingDetector.detect(message) rescue {} |
| 11 | + | ||
| 12 | + # It's better to default to UTF-8 as sometimes it's wrongly detected as another charset | ||
| 13 | + if detect[:encoding] && detect[:confidence] == 100 | ||
| 14 | + CharlockHolmes::Converter.convert(message, detect[:encoding], 'UTF-8') | ||
| 11 | else | 15 | else |
| 12 | message | 16 | message |
| 13 | end.force_encoding("utf-8") | 17 | end.force_encoding("utf-8") |
| 18 | + | ||
| 14 | # Prevent app from crash cause of | 19 | # Prevent app from crash cause of |
| 15 | # encoding errors | 20 | # encoding errors |
| 16 | rescue | 21 | rescue |
| 17 | - "" | 22 | + "--broken encoding: #{encoding}" |
| 23 | + end | ||
| 24 | + | ||
| 25 | + def detect_encoding message | ||
| 26 | + return nil unless message | ||
| 27 | + | ||
| 28 | + hash = CharlockHolmes::EncodingDetector.detect(message) rescue {} | ||
| 29 | + return hash[:encoding] ? hash[:encoding] : nil | ||
| 18 | end | 30 | end |
| 19 | end | 31 | end |
| 20 | end | 32 | end |